我有一个带有一个文本字段和一个按钮的jframe。当我点击按钮时,我创建了一个 websocket 并从中接收数据。当数据到达时,我想隐藏这个Jframe并显示另一个Jframe。出于这个原因,我这样做:
这是第一个JFrame。
public class PrimaSchermata {
private JFrame mainFrame;
private JPanel controlPanel;
private Session sessione;
private JTextField userText;
public PrimaSchermata(){
mainFrame = new JFrame("First Jframe");
mainFrame.setSize(500,200);
mainFrame.setLayout(new GridLayout(3, 1));
mainFrame.setResizable(false);
controlPanel = new JPanel();
controlPanel.setLayout(new GridBagLayout());
this.showTextField();
mainFrame.add(controlPanel);
mainFrame.setVisible(true);
}
private void showTextField(){
JLabel namelabel= new JLabel("Email: ", JLabel.RIGHT);
this.userText = new JTextField(15);
JButton loginButton = new JButton("Login");
loginButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
PrimaSchermata.this.loginEvent(userText);
}
});
controlPanel.add(namelabel);
controlPanel.add(userText);
controlPanel.add(loginButton);
mainFrame.setVisible(true);
}
private void loginEvent(JTextField tokenText){
if(tokenText.getText().length() == 0){
JOptionPane.showMessageDialog(mainFrame, "Inserisci email", "", JOptionPane.ERROR_MESSAGE, null);
return;
}
this.gestioneWebSocket();
}
private void gestioneWebSocket(){
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
URI apiUri = URI.create("wss://websocketurltest");
try {
Session session = container.connectToServer(PrimaSchermata.class, apiUri);
} catch (DeploymentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@OnOpen
public void onOpen(Session session) throws java.io.IOException
{
System.out.println("websocket opened");
session.getBasicRemote().sendText("logintest");
}
@OnMessage
public void onMessage(String message)
{
System.out.println("Message received: " + message);
if(message.length() > 0){
System.out.println("login ok");
this.mainFrame.setVisible(false);
secondFrame x = new secondFrame();
this.mainFrame.dispose();
}
}
这是第二个 JFrame:
public class secondFrame extends JFrame{
public secondFrame() {
setBounds(100, 200, 120, 120);
setTitle("Second JFrame");
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
我的问题是这样的:
当我点击按钮并从websocket接收数据时,第二个JFrame显示,但第一个JFrame并没有消失,尽管我在第一个JFrame中设置了visible = false。
我错在哪里?还是存在另一种方式来实现这一点?
为什么不重用相同的JFrame,而只是使用setContentPane(JComponent(重置视图。你一定需要有多个JFrames吗?
尝试使用 mainFrame.dispose();
而不是将 visible 设置为 false
,并在打开第二个窗口或发送请求之前执行此操作。