JPanel 未在 JFrame 中显示 - Java

2024-01-11

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);

哦,天哪,它突然起作用了……我正要删除这个问题,但我又运行了几次,只是随机起作用,有时不起作用。

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

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

帮助!有谁知道为什么会发生这种情况?

Thanks.

Edit:

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);

这会有帮助吗?


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

听起来你想要一些组合pack() http://java.sun.com/javase/6/docs/api/java/awt/Window.html#pack(), 设置大小(整数,整数) http://java.sun.com/javase/6/docs/api/java/awt/Window.html#setSize(int,%20int), 设置扩展状态(int) http://java.sun.com/javase/6/docs/api/java/awt/Frame.html#setExtendedState(int) and/or 设置可调整大小(布尔值) http://java.sun.com/javase/6/docs/api/java/awt/Frame.html#setResizable(boolean)调用之前的方法设置可见(真) http://java.sun.com/javase/6/docs/api/java/awt/Window.html#setVisible(boolean).


Edit:

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

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

使用 Swing 的好处是您可以自动处理多线程代码。尽管在主线程上初始化控件通常是安全的,但一旦导致事件派发线程开始(如setVisible(true)肯定会的),所有的赌注都失败了。

延迟通话setVisible(true)越长越好。最好不要从您的内部调用它JFrame构造函数。

如果您在启动应用程序后需要修改 Swing 控件,则需要通过事件派发线程(参见invokeLater and invokeAndWait中的方法Swing实用程序 http://java.sun.com/javase/6/docs/api/javax/swing/SwingUtilities.html等)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JPanel 未在 JFrame 中显示 - Java 的相关文章

随机推荐