使用按钮数组调试JFrame

时间:2012-07-10 18:33:51

标签: java swing jframe

我无法为我班级的战舰克隆生成一系列按钮,似乎无法弄清楚为什么它不起作用。任何建议都有帮助......我有主类创建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);

}

}

grid.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]);
    }
}
}

3 个答案:

答案 0 :(得分:4)

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

解决方法是删除此行

JPanel jPan1 = new JPanel();

并用jPan1

替换this的所有出现

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

1不需要网格中的JPanel 2使用.add()方法不会将网格中的JPanel添加到任何内容中 似乎其他人已经开始这样了。

如上所述,您应该删除“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,