GUI未显示,Java(BlueJ)

GUI未显示,Java(BlueJ),java,user-interface,bluej,Java,User Interface,Bluej,创建一个Tic-Tac-Toe游戏。到目前为止,这些按钮没有任何用途,游戏根本不应该运行。我所要做的就是为游戏设置GUI,有时我运行它时会显示GUI,但大多数时候从未显示。我对GUI for Java相当陌生,所以任何信息都会很有帮助 ****编辑:算出了!在我创建了所有按钮之后,我不得不执行frame.setVisible(true),似乎可以修复它 import javax.swing.*; import java.awt.*; import java.awt.event.*; import

创建一个Tic-Tac-Toe游戏。到目前为止,这些按钮没有任何用途,游戏根本不应该运行。我所要做的就是为游戏设置GUI,有时我运行它时会显示GUI,但大多数时候从未显示。我对GUI for Java相当陌生,所以任何信息都会很有帮助

****编辑:算出了!在我创建了所有按钮之后,我不得不执行
frame.setVisible(true)
,似乎可以修复它

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.JOptionPane;

/**
 * A class modelling a tic-tac-toe (noughts and crosses, Xs and Os) game in a very
 * simple GUI window.
 * 
 * @author Thomas Bryk
 * @version December 4, 2016
 */

public class TicTacToe extends JFrame
{ 
    private JFrame frame;
    private JButton[][] buttons;
    private JMenuBar menuBar;
    private JMenuItem menuNew, menuQuit;
    private JLabel label;
    private JOptionPane pane;

    /** 
     * Constructs a new Tic-Tac-Toe board and sets up the basic
     * JFrame containing a JTextArea in a JScrollPane GUI.
     */
    public TicTacToe()
    { 
        super();
        frame=new JFrame("Tic Tac Toe");
        JMenu menu=new JMenu("Game");
        label=new JLabel();

        menuBar= new JMenuBar();
        menuBar.add(menu);

        menuNew= new JMenuItem("New");
        menuNew.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,ActionEvent.CTRL_MASK));
        menuNew.getAccessibleContext().setAccessibleDescription("Creates a new game of Tic Tac Toe");

        menuQuit= new JMenuItem("Quit");
        menuQuit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q,ActionEvent.CTRL_MASK));
        menuQuit.getAccessibleContext().setAccessibleDescription("Quits the game of Tic Tac Toe");

        menu.add(menuNew);
        menu.add(menuQuit);

        frame.setJMenuBar(menuBar);
        frame.add(label);
        frame=new JFrame("Tic Tac Toe");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(350,355);
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        buttons=new JButton[3][3];
    }

    private void setUp()
    {
        JPanel game = new JPanel(new GridLayout(3,3));  
        JPanel panel = new JPanel(new BorderLayout());
        frame.add(panel);
        game.setVisible(true);
        panel.setVisible(true);
        game.setPreferredSize(new Dimension(300,300));
        panel.setPreferredSize(new Dimension(325,425));
        panel.add(game, BorderLayout.CENTER);   

        for(int i = 0; i < 3; i++)
        {
            for(int j = 0; j < 3; j++) 
            {
                buttons[i][j] = new JButton();
                buttons[i][j].setText("");
                buttons[i][j].setVisible(true);
                game.add(buttons[i][j]); 
                buttons[i][j].addActionListener(new ButtonListener());
            }
        }
    }

    public static void main (String[] args){
        TicTacToe mainGame=new TicTacToe();
        mainGame.setUp();
    }

    private class ButtonListener implements ActionListener
    {     
        public void actionPerformed(ActionEvent ev) 
        {

        }
    }
}
import javax.swing.*;
导入java.awt.*;
导入java.awt.event.*;
导入java.util.*;
导入javax.swing.JOptionPane;
/**
*一个类在一个非常复杂的环境中模拟一个tic-tac-toe(零和十字架,Xs和Os)游戏
*简单的GUI窗口。
* 
*@作者托马斯·布雷克
*@版本2016年12月4日
*/
公共类TicTacToe扩展JFrame
{ 
私有JFrame;
专用JButton[]]按钮;
私人杰门努巴·梅努巴;
私有菜单项菜单新建、菜单退出;
私人标签;
私人JOptionPane;
/** 
*构建一个新的Tic-Tac趾板并设置基本
*JFrame在JScrollPane GUI中包含JTextArea。
*/
公共交通
{ 
超级();
框架=新的JFrame(“Tic Tac Toe”);
JMenu菜单=新JMenu(“游戏”);
label=新的JLabel();
menuBar=newjmenubar();
菜单栏。添加(菜单);
menuNew=新项目(“新”);
menuNew.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,ActionEvent.CTRL_MASK));
menuNew.getAccessibleContext().setAccessibleDescription(“创建一个新的井字游戏”);
menuQuit=新JMenuItem(“退出”);
menuQuit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q,ActionEvent.CTRL_MASK));
menuQuit.getAccessibleContext().setAccessibleDescription(“退出井字游戏”);
菜单。添加(菜单新建);
菜单.添加(菜单退出);
frame.setJMenuBar(菜单栏);
框架。添加(标签);
框架=新的JFrame(“Tic Tac Toe”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架。设置尺寸(350355);
frame.setresizeable(false);
frame.setLocationRelativeTo(空);
frame.setVisible(true);
按钮=新的JButton[3][3];
}
私有无效设置()
{
JPanel游戏=新JPanel(新网格布局(3,3));
JPanel panel=newjpanel(newborderlayout());
框架。添加(面板);
game.setVisible(true);
面板设置可见(真);
game.setPreferredSize(新维度(300300));
面板。设置首选尺寸(新尺寸(325425));
panel.add(游戏、边界布局、中心);
对于(int i=0;i<3;i++)
{
对于(int j=0;j<3;j++)
{
按钮[i][j]=新的JButton();
按钮[i][j].setText(“”);
按钮[i][j]。设置可见(真);
添加(按钮[i][j]);
按钮[i][j].addActionListener(新按钮Listener());
}
}
}
公共静态void main(字符串[]args){
TicTacToe mainGame=新的TicTacToe();
mainGame.setUp();
}
私有类ButtonListener实现ActionListener
{     
已执行的公共无效操作(操作事件ev)
{
}
}
}

通常,在swing中,您首先创建一个
JFrame
,然后创建一个
JPanel
或更多(如果需要)。 此外,您可以为每个面板设置
LayoutManager

您绝对不需要设置
按钮[i][j].setVisible(true)或任何类似的手动操作。您只需在面板或框架上设置Visisible(true),它将自动设置连接到该面板/框架的每个组件的所有内容

同时去掉
frame.setLocationRelativeTo(null)现在

还有一件事是一个相当好的实践——首先设置组件所需的一切,然后再将其添加到面板或框架中


除此之外,我真的不知道为什么它有时会出现,有时不会出现。

谢谢你的信息!我已经改变了你告诉我的所有事情,尽管我仍然不明白为什么我的按钮不会出现(可能是整个面板?)。有什么想法吗?我看你明白了。是的,我没注意到你的镜框是可见的。通常情况下,您会将可见性设置为设置完所有内容后的最后一件事。真为你高兴。插入新答案,而不是编辑帖子。也许它会帮助别人。