java - 两个带有网格的 JFrame 在一个类中

标签 java swing user-interface jframe jpanel

我正在尝试编写一个战舰游戏,并使用 if 语句调用 BatShip3 类,该类将生成两个带有可单击网格的 JFrame,用于放置战舰。我已经尝试在该方法中实现我的代码两次,为每次生成新变量,但我似乎无法弄清楚出了什么问题。当我选择游戏模式时,它会创建两个窗口,给它们两个黑色背景,但第二个窗口上没有网格。有什么指示吗?

package batship2;

import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
*
 * @author William
*/
public class BatShip3 extends JFrame implements ActionListener{


    public JButton buttons [][] = new JButton [100][100];
    public JPanel panel;
    public JButton clicks [][] = new JButton [100][100];
    public JPanel canvas;
    Container contentArea = getContentPane ();
    Container contentArea2 = getContentPane ();

    public void BatShip3(){
            JFrame window1 = new JFrame("Window 1");{
                   setSize (800, 600);
                   setVisible (true);
                   setBackground (Color.black);
                   setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

                   panel = new JPanel();
                   GridLayout experimentLayout = new GridLayout(100, 100);
                   panel.setLayout (experimentLayout);
                   panel.setBackground(Color.black);

                   for(int rows = 0; rows <100 ; rows++){
                      for(int cols = 0; cols < 100 ; cols++){
                          buttons [rows][cols] = new JButton ();
                          buttons [rows][cols].setBackground(Color.blue);
                          buttons [rows][cols].addActionListener(this);
                          panel.add(buttons [rows][cols]);
                      }     
                   }
                   contentArea.add(panel);
                   window1.setContentPane(contentArea);
    }        


      JFrame window2 = new JFrame("Window 2");{
           window2.setSize (800, 600);
           window2.setVisible (true);
           window2.setBackground (Color.black);
           window2.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

           canvas = new JPanel();
           GridLayout experimentLayout2 = new GridLayout(100, 100);
           canvas.setLayout (experimentLayout2);
           canvas.setBackground(Color.black);

             for(int rows1 = 0; rows1 <100 ; rows1++){
                 for(int cols1 = 0; cols1 < 100 ; cols1++){
                     clicks [rows1][cols1] = new JButton ();
                     clicks [rows1][cols1].setBackground(Color.blue);
                     clicks [rows1][cols1].addActionListener(this);
                     canvas.add(clicks [rows1][cols1]);
                 }     
             }
              contentArea2.add(canvas);
              window2.setContentPane(contentArea2);
              }
              }
    public void actionPerformed(ActionEvent ev){

        for(int rows = 0; rows < 100 ; rows++){
            for(int cols = 0 ; cols < 100 ; cols++){
                 if(ev.getSource() == buttons [rows][cols]){            
                      buttons[rows][cols].setBackground(Color.green);
                 }
            }
        }
        for(int rows1 = 0; rows1 < 100 ; rows1++){
            for(int cols1 = 0 ; cols1 < 100 ; cols1++){
                if(ev.getSource() == clicks [rows1][cols1]){

                   clicks[rows1][cols1].setBackground(Color.green);
                 }
            }
        }
}}

最佳答案

定义描述战舰游戏的模型类。这是我几分钟后的想法。

package com.ggl.battleship.model;

import java.util.List;

public class BattleshipGame {
    private int numberOfPlayers;
    private int widthOfBattleshipGrid;
    private List<BattleshipGrid> grids;
}

.

package com.ggl.battleship.model;

import java.util.List;

public class BattleshipGrid {
    private List<Ship> ships;
    private Cell[][] grid;
}

.

package com.ggl.battleship.model;

import java.awt.Point;
import java.util.List;

public class Ship {
    private int length;
    private String name;
    private List<Point> cellLocations;
}

.

package com.ggl.battleship.model;

import java.awt.Point;

public class Cell {
    private boolean isHit;
    private Point coordinates;
}

您可以创建所有适当的 getter、setter 和绘图方法。

定义一个或多个创建 JFrame 和 JPanel 的 View 类。 JPanel 绘制模型类。

为玩家 1 创建一个 JFrame View 类实例,并为玩家 2 创建另一个实例。

关于java - 两个带有网格的 JFrame 在一个类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16247643/

相关文章:

java - Android OpenGL ES...为什么教程总是正确渲染,而我的版本却随机不正确?

java - 在 hibernate 中从 postgresql 查询 JSON 数组会抛出 JDBC 类型没有方言映射 : 1111

java - 将图像大小调整为从 Swing 应用程序中的文件选择器动态获取的 JLabel 的大小

java - Swing - drawString 移动动画失败

c++ - NetUIHWND 和 DirectUIHWND

javascript - 使用 Javascript 循环遍历 div ID 并显示与点击的 ID 关联的样式

java - 如何将 HTTP header 添加到 JAXWS 创建的代理类中

java - Hibernate 查询缓存失效

Java - 当我尝试使用框布局时出现错误

cocoa - 为什么设置initialFirstResponder没有效果?