我正在尝试为游戏创建一个棋盘,我首先制作了一个框架,然后如果用户//将行和列作为数字输入并按下开始按钮,它应该删除所有//在框架上的什么并添加具有网格布局的面板,其中包含按钮
这是代码(问题是框架被清除,没有出现任何内容)
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Frame extends JFrame implements ActionListener{
private static final long serialVersionUID = 1L;
JButton newButton;
JButton Start;
JTextArea row;
JTextArea col;
JLabel background;
JLabel rows;
JLabel columns;
JLabel Error;
JPanel myPanel;
JCheckBox box;
public Frame()
{
//adding frame
setTitle("DVONN Game");
setSize(1000, 700);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(null);
//making start button
Start = new JButton(new ImageIcon("Start"));
Start.setBounds(500, 30, 300, 300);
Start.setOpaque(true);
Start.addActionListener(this);
//make background
background = new JLabel();
background.setBounds(0, -300, 2000, 1500);
background.setIcon(Color.BLUE));
rows = new JLabel("Enter the rows");
columns = new JLabel("Enter the columns");
rows.setForeground(Color.WHITE);
columns.setForeground(Color.WHITE);
rows.setBounds(10,10,100,30);
columns.setBounds(10,45,105,30);
row = new JTextArea();
col = new JTextArea();
row.setBounds(120,10,100,30);
col.setBounds(120,45,100,30);
Error = new JLabel("Enter numbers plz!");
Error.setBounds(10, 100, 400, 30);
Error.setForeground(Color.RED);
Error.setVisible(true);
box = new JCheckBox("Enable Random Filling");
box.setBounds(10, 200, 150, 20);
box.setVisible(true);
myPanel = new JPanel();
myPanel.setBounds(30, 30, 700, 500);
myPanel.setVisible(true);
newButton = new JButton();
newButton.setOpaque(true);
getContentPane().add(box);
getContentPane().add(rows);
getContentPane().add(columns);
getContentPane().add(row);
getContentPane().add(col);
getContentPane().add(Start);
getContentPane().add(background);
this.validate();
this.repaint();
}
public static void main(String[]args)
{
new Frame();
}
//adding actions for start button
public void actionPerformed(ActionEvent e) {
boolean flag = true;
String r1 = row.getText();
String c1 = col.getText();
int x = 0,y = 0;
try{
x = Integer.parseInt(r1);
y = Integer.parseInt(c1);
} catch(NumberFormatException l) {
flag = false;
}
int size = x * y;
if (flag == true) {
this.getContentPane().removeAll();
this.validate();
this.repaint();
myPanel.setLayout(new GridLayout(x, y));
while(size != 0)
{
myPanel.add(newButton);
size --;
}
this.getContentPane().add(myPanel);
} else {
this.getContentPane().add(Error);
}
}
}
答案 0 :(得分:2)
此代码有几个问题
null
布局。请学习使用LayoutManager
s 每个Swing组件只能在层次结构中包含一次。所以这个循环是没用的,因为你一遍又一遍地添加相同的组件(更不用说负的大小会导致无限循环)
while(size != 0){
myPanel.add(newButton);
size --;
}
size
是否实际为>0
。由于您默默地忽略了ParseException
,因此最终可能会size
0
清除内容窗格而不添加任何内容validate
。请参阅Container#add
方法的javadoc
此方法更改与布局相关的信息,因此使组件层次结构无效。如果已经显示了容器,则必须在此后验证层次结构,以便显示添加的组件。
答案 1 :(得分:1)
在添加新元素后调用validate()
和repaint()
,而不是删除旧元素之后。
您无需在单个组件上调用setVisible()
,在框架本身pack()
之后调用它,也不应使用validate()
和repaint()
在构造函数中。即,用以下内容替换:
pack();
setVisible(true);
或者你可以在调用构造函数之后对对象执行此操作。
答案 2 :(得分:0)
尝试替换
public static void main(String[]args)
{
new Frame();
}
通过
public static void main(String[]args)
{
new Frame().setVisible(true);
}
答案 3 :(得分:0)
删除构造函数中对this.setVisible
的调用,并将其作为主要方法。
public static void main(String[] args) {
final Frame fr = new Frame();
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
fr.setVisible(true);
}
});
}
这将确保框架元素在可见之前就位。