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