JPanel没有在JFrame中显示 - Java

时间:2010-01-30 12:20:34

标签: java swing jframe jpanel

Server是我制作的扩展JFrame的类。

    Server serverApp = new Server(TITLE, WIDTH, HEIGHT, true, false);

我已经有效地删除了几乎所有其他代码,但问题仍然存在!

    c = getContentPane();
    c.setLayout(new BorderLayout());

    //Components  /***AHHHHH***/
    lblEnterMessage = new JLabel("Enter Message ");
    txtEnterMessage = new JTextField(50);
    txtEnterMessage.addActionListener(this);
    btnSend = new JButton("Send");
    btnSend.addActionListener(this);
    taDisplay = new JTextArea("Test, test test.", 10, 0);
    taDisplay.setEditable(false);
    JScrollPane jspDisplay = new JScrollPane(taDisplay);

    pnlChatTop = new JPanel(new FlowLayout());
    pnlChatTop.add(lblEnterMessage);
    pnlChatTop.add(txtEnterMessage);
    pnlChatTop.add(btnSend);
    pnlChat = new JPanel(new BorderLayout());
    pnlChat.add(pnlChatTop, BorderLayout.CENTER);
    pnlChat.add(jspDisplay, BorderLayout.SOUTH);

    c.add(pnlChat, BorderLayout.CENTER);

哦,当时,它刚刚突然工作......而我正准备删除这个问题,但我再次运行它几次而且只是随机工作而且有时不工作。

我刚刚记得在使用其他“项目”之前遇到此问题,我的解决方案是让窗口可调整大小。每当我调整它的大小时,组件就会显示出来。

这一次,我正在制作一款游戏而且我不希望它可以调整大小...而且我想知道如何以正确的方式解决这个问题。

帮助!有谁知道为什么会这样?

感谢。

编辑:

public Server(String title, int sizeW, int sizeH, boolean visibility, boolean resizability) {

    /* Initialization */
    //JFrame settings
    setTitle(title);
    setSize(sizeW, sizeH);
    setVisible(visibility);
    setResizable(resizability);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    addKeyListener(this);

这会有帮助吗?

3 个答案:

答案 0 :(得分:4)

从您提供的代码中,问题并不明显。

在调用pack()之前,您似乎想要setSize(int,int)setExtendedState(int)setResizable(boolean)和/或setVisible(true)方法的某种组合。


编辑:

setTitle(title);
setSize(sizeW, sizeH);
setVisible(visibility);
setResizable(resizability);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

此代码中存在竞争条件。有时主线程会在帧显示之前将组件置于正确的状态;有时框架在一切准备就绪之前赢得并开始绘画。

使用Swing的事情是你自动使用多线程代码。虽然初始化主线程上的控件通常是安全的,但是一旦你启动事件调度线程(因为setVisible(true)肯定会这样做),所有的赌注都会关闭。

尽可能延迟致电setVisible(true)。最好不要在JFrame构造函数中调用它。

如果您在启动应用程序后需要修改Swing控件,则需要通过事件派发线程来执行此操作(请参阅invokeLater和{{1 SwingUtilities中的方法,等等。)

答案 1 :(得分:3)

此类间歇性故障表明同步问题。确保在EDT上构建并运行GUI。另外,您可能希望看到这个非常简单的~100行GUI chat program

答案 2 :(得分:2)

调用setVisible太早了。它会立即运行并在调用窗口时绘制窗口。如果尚未将所有组件添加到框架中,则它们不会被绘制。这就是为什么调整框架的大小似乎使它出现。因为调整大小会导致重绘执行。

使setVisible成为JFrame构造函数中的最后一次调用。