2

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

那会有帮助吗?

4

3 回答 3

4

从您提供的代码中看不出问题。

听起来您想要在调用setVisible(true)之前组合使用pack()setSize(int,int)setExtendedState(int)和/或setResizable(boolean)方法。


编辑:

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

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

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

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

如果您在启动应用程序后需要修改 Swing 控件,则需要通过事件调度线程来完成(参见SwingUtilitiesinvokeLater中的和invokeAndWait方法等)。

于 2010-01-30T12:39:00.707 回答
3

这种间歇性故障表明存在同步问题。确保在 EDT上构建和运行 GUI 。此外,您可能希望看到这个非常简单、~100 行的 GUI聊天程序

于 2010-01-30T12:59:06.333 回答
2

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

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

于 2010-01-30T13:07:22.507 回答