Java JFrame未正确加载
我正在编写一个网络游戏客户端,在点击按钮时在帧之间切换时遇到问题 我已经在不同的框架中编写了客户机的每个页面,当从客户机主页单击菜单按钮时,应该显示这些框架 以下是我所做的代码Java JFrame未正确加载,java,swing,sockets,jframe,event-dispatch-thread,Java,Swing,Sockets,Jframe,Event Dispatch Thread,我正在编写一个网络游戏客户端,在点击按钮时在帧之间切换时遇到问题 我已经在不同的框架中编写了客户机的每个页面,当从客户机主页单击菜单按钮时,应该显示这些框架 以下是我所做的代码 public class homePage extends JFrame{ public homePage () { initComponents(); } private void initComponents(){ // the frame and b
public class homePage extends JFrame{
public homePage () {
initComponents();
}
private void initComponents(){
// the frame and butttons are here....
GameListBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
this.setVisible(false); // to hide the current home page
new GameList().start(); // to start new frame called GameList
// basically the same thing as following code
// GameList gl = new GameList();
// gl.setVisible (true);
// gl.run();
}
}
}
下面这个类只是运行GameList框架,它的连接来自一个主方法
public static void main(String[] args) {
new GameList().start();
// basically the same thing as following code
// GameList gl = new GameList();
// gl.setVisible (true);
// gl.run();
}
当我从main方法运行游戏列表框架时,它可以正常工作。显示GUI,建立连接,数据传输成功。 我主要想做的是从主页的ActionListener调用新的GameList().start()方法,因为我可以从main方法调用它,显示GameList并隐藏主页 当我这样做时,正如我在第一段代码中所示,GameList的GUI没有加载(只是变黑了),但连接已经建立,数据传输成功。 GUI仅在连接终止时显示。我怀疑原因是GameList的run()方法中的while循环 但同样,当我从游戏列表类的main运行它时,完全相同的东西就像一个符咒。有人能告诉我为什么当我从主页调用gui时它没有加载,尽管我所做的一切都完全相同
如果我的问题听起来很愚蠢,很抱歉,但是如果您有任何帮助,我们将不胜感激。当您从
ActionListener
调用GameList.start()
时,您将处于,即线程正在Swing过程中处理每一个事件,例如鼠标或键盘输入,以及组件重新绘制。当您在Swing EDT中执行一个长进程时,实际上是在阻塞线程,并阻止处理任何其他事件,其中包括重绘事件。这就是为什么您的框架是黑色的,GUI似乎没有加载。当您从main方法调用它时,不会发生这种情况,因为您不在EDT线程中,而是在应用程序的主线程中
要解决这个问题,您应该使用thread.start()
和Runnable
从另一个线程调用GameList的run()方法
一个很好的经验法则是,为了保持应用程序的响应性,您不应该在事件中添加任何GUI内容和一些标志,也不应该在事件中进行任何计算
另一条规则是,为了避免一般问题,您应该将所有GUI内容(包括框架的创建)放在线程EDT中。如果您需要从另一个线程执行某些操作(如果您没有响应某个事件或您的线程在main方法中),请使用
SwingUtilities。invokeLater
如果可以,请避免使用多个帧,它们可能会让用户感到困惑,并简单地给屏幕添加混乱。在可能的情况下,请使用CardLayout
或JDesktopPane
或JTabbedPane
而不是headyep。试着想象一下你玩了多少游戏,这些游戏向你扔了一堆窗户,。。。我打赌不会太多,看到了吗
public static void main(String[] args) {
new GameList().start();
// basically the same thing as following code
// GameList gl = new GameList();
// gl.setVisible (true);
// gl.run();
}