【发布时间】: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