JPanel不在JFrame-Java中显示

JPanel不在JFrame-Java中显示,java,swing,jframe,jpanel,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 JLab

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);
哦,该死,它只是突然起作用了。。。我正要删除这个问题,但我又运行了几次,它只是随机工作,有时不工作

我刚刚记得以前在其他“项目”中遇到过这个问题,我的解决方案是使窗口的大小可以调整。只要我简单地调整它的大小,组件就会显示出来

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

救命啊!有人知道为什么会这样吗

谢谢

编辑:


这会有帮助吗?

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

听起来在调用之前,您需要一些、和/或方法的组合


编辑:

此代码中存在竞争条件。有时主线程会使组件进入正确的状态,以便在框架显示之前进行绘制;有时,画框获胜,在一切准备就绪之前开始绘画

使用Swing的好处是,您可以自动处理多线程代码。虽然在主线程上初始化控件通常是安全的,但一旦启动事件调度线程(正如
setVisible(true)
肯定会启动),所有赌注都将被取消

尽可能长时间延迟调用
setVisible(true)
。最好不要从
JFrame
构造函数中调用它


如果在启动应用程序后需要修改Swing控件,则需要通过事件调度线程进行修改(请参阅中的
invokeLater
invokeAndWait
方法等)。

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

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


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

那么我是否首先设置可调整大小?那么能见度呢?那会不会。。。出于某种原因,问题出在哪里?好的,在调用setVisible(true)之前,我刚刚尝试了pack(),setSize已经存在,setExtendedState(JFrame.ALL\u DONT\u WORK)和setResizeable(false)都不起作用。我还想超级双倍三倍四倍注意,这已经发生在我的其他应用程序,我设置大小调整(假)等,使其可显示。。。我记得我的讲师说她以前也遇到过同样的问题,她只是调整了它的大小来解决它。@Dois-看看Swing教程中的并发性-在invokeLater中调用JFrame(我的服务器类)似乎是可行的。非常感谢大家,节省了我很多时间,治好了我的头痛。事实上,最初我遇到问题时,我认为这可能是问题所在,但实际上我有一个循环每秒运行60次,为我的容器调用repaint,所以我排除了这个可能性。也许我的记忆有些模糊,但无论如何,SwingUtilities.invokeLater似乎工作得很好。谢谢各位。
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);
setTitle(title);
setSize(sizeW, sizeH);
setVisible(visibility);
setResizable(resizability);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);