打开新窗口 Jframe Java



我有一个带有一个文本字段和一个按钮的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 ,并在打开第二个窗口或发送请求之前执行此操作。

最新更新