好的,所以我正在尝试将64个JButton数组添加到JFrame中,并使用8乘8网格布局(棋盘类型的东西)。这是相关的代码部分:
public class othello implements ActionListener{
int [][] board = new int[8][8];
JFrame window = new JFrame();
JButton[] buttons = new JButton[64];
public othello(){
window.setSize(400,400);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setLayout(new GridLayout(8,8));
window.setVisible(true);
for (int i=0;i<64;i++){
buttons[i] = new JButton("");
buttons[i].addActionListener(this);
window.add(buttons[i]);
}
for (int i=0;i<8;i++){
for (int j=0;j<8;j++){
board[i][j]=2;
}
}
board[3][3]=0;board[4][4]=0;
board[3][4]=1;board[4][3]=1;
}
public void actionPerformed(ActionEvent e){
for (int i=0;i<8;i++){
for (int j=0;j<8;j++){
if(e.getSource()==buttons[i]){
buttons[i].setEnabled(false);
board[i][j]=1;
check();
}
}
}
}
public static void main (String[] args){
new othello();
}
}
此代码导致的是实际添加的看似随机数量的按钮。偶尔它会增加所有64,更常见的是它增加了一半左右,它总是正常启动但停在任意点(我通过按钮标签计数来测试)。
我添加了一些println来查看循环本身是否实际完成,没有问题,它将循环遍历所有64次,它只是停止在某些时候添加按钮。
我是Java的初学者,所以我确信这是非常简单和愚蠢的事情,但我目前不知道出了什么问题。有人可以帮忙吗?
编辑了更多代码。
答案 0 :(得分:1)
您是否初始化了阵列?像
JButton[] buttons = new JButtons[x];
进行一些打印以检查循环停止的数字。
答案 1 :(得分:0)
也许你没有使用event dispatch thread来操纵用户界面?
事件调度线程,执行所有事件处理代码。 大多数与Swing框架交互的代码也必须执行 这个帖子。
尝试使用SwingUtilities.invokeAndWait()
运行您的UI构建代码。
编辑:更正后的源代码为:
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.SwingUtilities;
public class othello implements ActionListener
{
int[][] board = new int[8][8];
JFrame window = new JFrame();
JButton[] buttons = new JButton[64];
public othello()
{
try
{
SwingUtilities.invokeAndWait(new Runnable()
{
public void run()
{
window.setSize(400, 400);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setLayout(new GridLayout(8, 8));
window.setVisible(true);
for (int i = 0; i < 64; i++)
{
buttons[i] = new JButton("");
buttons[i].addActionListener(othello.this);
window.getContentPane().add(buttons[i]);
}
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
board[i][j] = 2;
}
}
board[3][3] = 0;
board[4][4] = 0;
board[3][4] = 1;
board[4][3] = 1;
}
});
}
catch (Exception e)
{
// TODO Handle exception
e.printStackTrace();
}
}
public void actionPerformed(ActionEvent e)
{
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
if (e.getSource() == buttons[i])
{
buttons[i].setEnabled(false);
board[i][j] = 1;
// check();
}
}
}
}
public static void main(String[] args)
{
new othello();
}
}
答案 2 :(得分:0)
您应该直接向ContentPane添加JFrame.add()
与所有其他JFC / Swing顶级容器一样,JFrame包含一个 JRootPane是唯一的孩子。根目录提供的内容窗格 通常,窗格应包含显示的所有非菜单组件 由JFrame。
您是否将布局管理器设置为默认值以外的其他内容?
默认内容窗格上将设置BorderLayout管理器。 有关添加,删除和设置的详细信息,请参阅RootPaneContainer JFrame的LayoutManager。
添加内容的正确惯用代码如下:
window.getContentPane().add(child);
有关正确使用的详细信息,请参阅Javadoc。