【问题标题】:Java GUI using setVisible()使用 setVisible() 的 Java GUI
【发布时间】:2014-06-29 02:30:53
【问题描述】:

我有一个像这样从 JFrame 扩展的类:

public class TicTacToeSubMenu extends JFrame implements ActionListener { }

在同一个文件中,我有另一个用于客户端连接的类,如下所示:

class ListenThread extends Thread { }

问题是在 ListenThread 类中,我试图退出当前帧并打开一个新帧,到目前为止,新帧按需要打开,但当前帧不会退出。

我使用了这两个命令,但都没有工作:

1. TicTacToeSubMenu.this.setVisible(false);

2. setVisible(false);

如何从同一文件的另一个类中退出当前帧?

一个更大的例子:

从以前的寡妇框架我这样做:

            TicTacToeSubMenu win = new TicTacToeSubMenu(word, false);
            win.setTitle("Tic Tac Toe");
            win.pack();
            win.setLocation(600, 200);
            setVisible(false);
            win.show();

然后在一个新文件和新框架中:

public class TicTacToeSubMenu extends JFrame implements ActionListener {
    variables.....

public TicTacToeSubMenu(String username, boolean playing) {
    new TicTacToeSubMenu();
}


public TicTacToeSubMenu() {
    connectUser();
}

public void connectUser() {
    clientThread = new ConnectThread();
    clientThread.start();

}

class ConnectThread extends Thread {
    InputStream input;
    OutputStream output;
    ObjectOutputStream oos;
    Socket s;

    public void sendText(String text) {
        try {
            oos.writeObject(text);

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void run() {
        try {
            s = new Socket(HOST, PORT);
            output = s.getOutputStream();
            oos = new ObjectOutputStream(output);

            isOnline = true;
            isConnected = true;

            new ListenThread(s).start();

        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

class ListenThread extends Thread {

    Socket s;
    InputStream input;
    ObjectInputStream ois;

    public ListenThread(Socket s) {
        this.s = s;
        try {
            input = s.getInputStream();
            ois = new ObjectInputStream(input);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public void run() {
        while (isConnected) {
            try {
                final String inputMessage = (String) ois.readObject();
                System.out.println(inputMessage);
                String user;
                user = getWord(inputMessage, 0);
                String opponent;
                opponent = getWord(inputMessage, 1);
                String message = getWord(inputMessage, 2);


                if (!user.equalsIgnoreCase(un)
                        && opponent.equalsIgnoreCase(un)
                        {

                            TicTacToeMultiPlayer window = new TicTacToeMultiPlayer(
                                    un, user, t2, playing, turn);
                            window.setTitle("Tic Tac Toe");
                            window.setLocation(400, 100);
                            window.pack();
                            TicTacToeSubMenu.this.setVisible(false);
                            window.show();
                        }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }
}

}

【问题讨论】:

  • 虽然实现两个JFrame 不是一个好习惯,因为大多数GUI 都没有这个功能。但附带说明一下,可能是这个example,能够在方向上提供帮助:-)
  • 我编辑了帖子并添加了一个示例
  • 1) 为了尽快获得更好的帮助,请发布MCVE(最小完整且可验证的示例)。 2) 参见The Use of Multiple JFrames, Good/Bad Practice? 3) 对于一个空间中的多个(或2 个)组件,请使用CardLayout,如short example 所示。
  • 无论如何 - 我通过制作静态 JFrame tmp 解决了这个问题;然后在构造函数 temp = this;它奏效了..

标签: java swing class user-interface jframe


【解决方案1】:

如果您想“隐藏”一个 JPanel,请使用代码“this.dispose();”而不是将可见性设置为 false。

【讨论】:

  • setvisible 如果我把它放在内部类外面就可以了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 2011-12-10
相关资源
最近更新 更多