2

我无法为我的班级的战舰克隆生成一系列按钮,并且似乎无法弄清楚为什么它不起作用。任何建议都会有所帮助......我让主类创建 jFrame,然后是网格类,更具体地说,生成器方法构建按钮数组。

import java.awt.*;

import javax.swing.*;

public class warship {

/**
 * @param args
 */

public static void main(String[] args) {
    JFrame gui = new JFrame();
    gui.setSize(700, 350);
    gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    gui.setLayout(new FlowLayout());
    grid oceanGrid = new grid();
    oceanGrid.Generator();
    gui.add(oceanGrid);
    gui.setVisible(true);

}

}

网格.java

     import java.awt.Dimension;
     import java.awt.GridLayout;
     import java.awt.LayoutManager;

     import javax.swing.ImageIcon;
     import javax.swing.JButton;
     import javax.swing.JPanel;
     import javax.swing.border.TitledBorder;


     @SuppressWarnings("serial")
public class grid extends JPanel{
private static int rows = 7;
private static int col = 10;

public void Generator(){

    ImageIcon wIcon = new ImageIcon    ("H:\\workspace\\Warship\\src\\images\\water.jpg");
    JPanel jPan1 = new JPanel();
    jPan1.setLayout((LayoutManager) new GridLayout(rows,col,1,1));
    jPan1.setSize(350,350);

    //Set Border 
    TitledBorder bdr = javax.swing.BorderFactory.createTitledBorder(null, "Targeting Grid",
            javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
            javax.swing.border.TitledBorder.DEFAULT_POSITION,
            new java.awt.Font("Arial", 0, 16));
    bdr.setTitleColor(java.awt.Color.RED);
    jPan1.setLayout((LayoutManager) new GridLayout(rows,col,1,1));      
    jPan1.setBorder(bdr);

    //Creates the array of buttons
    JButton b[]=new JButton[rows*col];
    for (int i = 0, j= rows*col; i < j; i++){
        b[i] = new JButton(wIcon);
        b[i].setSize(20, 20);
        b[i].setMaximumSize(new Dimension(20,20));
        b[i].setPreferredSize(new Dimension(20,20));
        System.out.println("loop test " + i);
        jPan1.add(b[i]);
    }
}
}
4

3 回答 3

4

我认为这是您犯的错误:
您的类网格扩展JPanel,但是您声明并初始化了另一个JPanel添加按钮的类。因此,您实际上并没有将按钮添加到您的网格,而是添加到您不使用的另一个面板。

解决方案是删除此行

JPanel jPan1 = new JPanel();

并将所有出现的 替换jPan1this

这样您就可以将按钮添加到网格中。

于 2012-07-10T18:53:17.020 回答
1

我相信您在 setVisible(true) 之前缺少 pack() 命令。

于 2012-07-10T18:49:43.043 回答
1

1 不需要网格中的JPanel。
2 网格中的 JPanel 未使用 .add() 方法添加到任何内容。
然而,似乎其他人已经做到了这一点。

如前所述,您应该删除“JPanel jPan1 = new JPanel();”行
并替换单词“jPan1”。用“这个”这个词。所有小写​​字母。

这是您编辑的代码的正确缩进,或者至少是更易于阅读的缩进。

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.LayoutManager;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.border.TitledBorder;


@SuppressWarnings("serial")
public class grid extends JPanel{
    private static int rows = 7;
    private static int col = 10;

    public void Generator(){

        ImageIcon wIcon = new ImageIcon ("H:\\workspace\\Warship\\src\\images\\water.jpg");

        this.setLayout((LayoutManager) new GridLayout(rows,col,1,1));
        this.setSize(350,350);

        //Set Border 
        TitledBorder bdr = javax.swing.BorderFactory.createTitledBorder(null,         "Targeting Grid",
            javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
            javax.swing.border.TitledBorder.DEFAULT_POSITION,
            new java.awt.Font("Arial", 0, 16));
        bdr.setTitleColor(java.awt.Color.RED);

        this.setLayout((LayoutManager) new GridLayout(rows,col,1,1));      
        this.setBorder(bdr);

    //Creates the array of buttons
        JButton b[]=new JButton[rows*col];
        for (int i = 0, j= rows*col; i < j; i++){
            b[i] = new JButton(wIcon);
            b[i].setSize(20, 20);
            b[i].setMaximumSize(new Dimension(20,20));
            b[i].setPreferredSize(new Dimension(20,20));
            System.out.println("loop test " + i);
                this.add(b[i]);
        }
    }
}

请注意,在此之后的任何内容至少只是对风格的有益批评。

我会在网格中使用构造函数,因此您不必调用该方法。像这样:

public Generator(){
    super();

    //code in Generator() here.
}

现在你不需要调用方法“Generator()”

这两行

javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
javax.swing.border.TitledBorder.DEFAULT_POSITION,

可以像这样更短。

TitledBorder.DEFAULT_JUSTIFICATION,
TitledBorder.DEFAULT_POSITION,
于 2012-07-10T18:59:30.623 回答