2010-01-30 81 views
2

服务器是我制作的扩展JFrame的类。JPanel不显示在JFrame中 - Java

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

哦宕,它只是忽然保护正常工作......我正要删除这个问题,但我又跑了它几次,只是随机WORKS,有时无法正常工作。

我刚刚记得以前有过其他'项目'这个问题,我的解决方案是使窗口可调整大小。每当我简单调整它的大小时,组件都会显示。

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

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

谢谢。

编辑:

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

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

这听起来像你想打电话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控件你已经拉开序幕后,您的应用程序,你需要通过事件调度线程(见invokeLaterinvokeAndWait方法SwingUtilities等等)来做到这一点。

+0

那么我应该先设置RESIZABILITY?可见性?难道那......出于某种原因是问题所在? 好吧我只是尝试pack(),setSize已经存在,setExtendedState(JFrame.ALL_DONT_WORK)和setResizable(false)都在调用setVisible(true)之前,它不起作用。 我还想超双三重四注意,这发生在我的其他应用程序,我setResizable(false)等,使其显示...我记得我的讲师说她有同样的问题之前,她只是调整它来修复它。 – Dois 2010-01-30 13:03:26

+1

@Dois - 看看Swing教程中的并发 - http://java.sun.com/docs/books/tutorial/uiswing/ – McDowell 2010-01-30 13:07:14

+0

调用invokeLater中的JFrame(我的服务器类)似乎工作。谢谢阿汤人,节省了我很多时间,并治好了我的头痛。 – Dois 2010-01-30 13:18:54

3

此类间歇性故障提示同步问题。一定要在EDT上构建并运行GUI。另外,你可能会喜欢看到这个非常简单的〜100行,GUI chat program

+0

谢谢,就是这样。 – Dois 2010-01-30 13:16:59

2

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

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

+0

其实,最初当我遇到问题时,我认为这可能是问题,但我实际上有一个循环运行60次,每秒钟为我的容器调用repaint,所以我排除了这一点。 也许我的记忆笼罩着什么,但无论如何,SwingUtilities.invokeLater似乎是完美的。多谢你们。 – Dois 2010-01-30 13:22:50