JavaGUI-JButton从另一个类打开另一个框架

JavaGUI-JButton从另一个类打开另一个框架,java,swing,jframe,jbutton,actionlistener,Java,Swing,Jframe,Jbutton,Actionlistener,我很难在第二帧显示GUI组件。我已经使用第一帧中的JButton打开了该帧 这是屏幕截图 这是第一个框架-ClientModule.java 第二帧-ClientMenu.java 这是我试过的代码 ClientModule.java import java.net.*; import java.util.*; import java.io.*; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEven

我很难在第二帧显示GUI组件。我已经使用第一帧中的
JButton
打开了该帧

这是屏幕截图

这是第一个框架-ClientModule.java

第二帧-ClientMenu.java

这是我试过的代码

ClientModule.java

import java.net.*;
import java.util.*;
import java.io.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class ClientModule extends JFrame implements Runnable{

    private JPanel panel;
    private JFrame frame;
    private JLabel titleLbl, userLbl, passLbl, hostLbl, portLbl, ipLbl;
    private JTextField userTxt, hostTxt, portTxt, ipTxt;
    private JPasswordField passTxt;
    private JButton loginBtn;

    public static void main(String[] args)
    {
        new ClientModule().run();
    }

    public ClientModule()
    {
        frame = new JFrame("DMS(Drawing Message System)");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);

        panel = new JPanel();
        panel.setPreferredSize(new Dimension(500,500));
        panel.setLayout(new FlowLayout());

        titleLbl = new JLabel("LogIn to Drawing Message System(DMS)");
        titleLbl.setFont(new Font("Rockwell Condensed",Font.BOLD,28));      
        userLbl = new JLabel("Username:");
        passLbl = new JLabel("Password:");
        hostLbl = new JLabel("Hostname:");
        portLbl = new JLabel("Port No.:");
        ipLbl = new JLabel("IP Address:");

        userTxt = new JTextField();
        userTxt.setPreferredSize(new Dimension(100,30));

        passTxt = new JPasswordField();
        passTxt.setEchoChar('*');
        passTxt.setPreferredSize(new Dimension(100,30));

        portTxt = new JTextField();
        portTxt.setPreferredSize(new Dimension(100,30));

        ipTxt = new JTextField();
        ipTxt.setPreferredSize(new Dimension(100,30));

        hostTxt = new JTextField();
        hostTxt.setPreferredSize(new Dimension(100,30));

        loginBtn = new JButton("Login!");
        loginBtn.setPreferredSize(new Dimension(90,30));
        loginBtn.addActionListener(new LoginBtnListener());


        panel.add(titleLbl);
        panel.add(userLbl);
        panel.add(userTxt);
        panel.add(passLbl);
        panel.add(passTxt);
        panel.add(hostLbl);
        panel.add(hostTxt);
        panel.add(portLbl);
        panel.add(portTxt);
        panel.add(ipLbl);
        panel.add(ipTxt);
        panel.add(loginBtn);

        frame.add(panel);

    }

    private class LoginBtnListener implements ActionListener
    {
        @SuppressWarnings("deprecation")
        public void actionPerformed(ActionEvent action)
        {
            //thinking this frame will close after ClientMenu's frame is open
            ClientModule client = new ClientModule();
            client.setVisible(false);

            ClientMenu menu = new ClientMenu();
            menu.setVisible(true);
        }
    }

    public void run()
    {
        frame.pack();
        frame.setVisible(true);
    }
}
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.io.*;
import java.util.*;

public class ClientMenu extends JFrame{

    JFrame frame;
    JPanel panel;
    JLabel titleLbl;
    JButton sendBtn,receiveBtn,logoutBtn;

    public ClientMenu()
    {
        frame = new JFrame("Drawing Message System(DMS)");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);

        panel = new JPanel();
        panel.setLayout(new FlowLayout());
        panel.setPreferredSize(new Dimension(500,500));

        titleLbl = new JLabel("Main Menu");
        titleLbl.setFont(new Font("Rockwell Condensed",Font.BOLD,28));

        sendBtn = new JButton("Send a Drawing");
        sendBtn.setPreferredSize(new Dimension(100,30));

        receiveBtn = new JButton("Receive a Drawing");
        receiveBtn.setPreferredSize(new Dimension(100,30));

        logoutBtn = new JButton("Logout");
        logoutBtn.setPreferredSize(new Dimension(100,30));
        logoutBtn.addActionListener(new LogoutBtnListener());

        panel.add(titleLbl);
        panel.add(sendBtn);
        panel.add(receiveBtn);
        panel.add(logoutBtn);

        frame.add(panel);
    }

    private class LogoutBtnListener implements ActionListener
    {
        //@SuppressWarnings("deprecation")
        public void actionPerformed(ActionEvent action)
        {
            ClientModule client = new ClientModule();
            client.setVisible(true);

            ClientMenu menu = new ClientMenu();
            menu.setVisible(false);
        }
    }

    public static void main(String[] args)
    {
        new ClientMenu().run();
    }

    public void run()
    {
        frame.pack();
        frame.setVisible(true);
    }

}
ClientMenu.java

import java.net.*;
import java.util.*;
import java.io.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class ClientModule extends JFrame implements Runnable{

    private JPanel panel;
    private JFrame frame;
    private JLabel titleLbl, userLbl, passLbl, hostLbl, portLbl, ipLbl;
    private JTextField userTxt, hostTxt, portTxt, ipTxt;
    private JPasswordField passTxt;
    private JButton loginBtn;

    public static void main(String[] args)
    {
        new ClientModule().run();
    }

    public ClientModule()
    {
        frame = new JFrame("DMS(Drawing Message System)");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);

        panel = new JPanel();
        panel.setPreferredSize(new Dimension(500,500));
        panel.setLayout(new FlowLayout());

        titleLbl = new JLabel("LogIn to Drawing Message System(DMS)");
        titleLbl.setFont(new Font("Rockwell Condensed",Font.BOLD,28));      
        userLbl = new JLabel("Username:");
        passLbl = new JLabel("Password:");
        hostLbl = new JLabel("Hostname:");
        portLbl = new JLabel("Port No.:");
        ipLbl = new JLabel("IP Address:");

        userTxt = new JTextField();
        userTxt.setPreferredSize(new Dimension(100,30));

        passTxt = new JPasswordField();
        passTxt.setEchoChar('*');
        passTxt.setPreferredSize(new Dimension(100,30));

        portTxt = new JTextField();
        portTxt.setPreferredSize(new Dimension(100,30));

        ipTxt = new JTextField();
        ipTxt.setPreferredSize(new Dimension(100,30));

        hostTxt = new JTextField();
        hostTxt.setPreferredSize(new Dimension(100,30));

        loginBtn = new JButton("Login!");
        loginBtn.setPreferredSize(new Dimension(90,30));
        loginBtn.addActionListener(new LoginBtnListener());


        panel.add(titleLbl);
        panel.add(userLbl);
        panel.add(userTxt);
        panel.add(passLbl);
        panel.add(passTxt);
        panel.add(hostLbl);
        panel.add(hostTxt);
        panel.add(portLbl);
        panel.add(portTxt);
        panel.add(ipLbl);
        panel.add(ipTxt);
        panel.add(loginBtn);

        frame.add(panel);

    }

    private class LoginBtnListener implements ActionListener
    {
        @SuppressWarnings("deprecation")
        public void actionPerformed(ActionEvent action)
        {
            //thinking this frame will close after ClientMenu's frame is open
            ClientModule client = new ClientModule();
            client.setVisible(false);

            ClientMenu menu = new ClientMenu();
            menu.setVisible(true);
        }
    }

    public void run()
    {
        frame.pack();
        frame.setVisible(true);
    }
}
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.io.*;
import java.util.*;

public class ClientMenu extends JFrame{

    JFrame frame;
    JPanel panel;
    JLabel titleLbl;
    JButton sendBtn,receiveBtn,logoutBtn;

    public ClientMenu()
    {
        frame = new JFrame("Drawing Message System(DMS)");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);

        panel = new JPanel();
        panel.setLayout(new FlowLayout());
        panel.setPreferredSize(new Dimension(500,500));

        titleLbl = new JLabel("Main Menu");
        titleLbl.setFont(new Font("Rockwell Condensed",Font.BOLD,28));

        sendBtn = new JButton("Send a Drawing");
        sendBtn.setPreferredSize(new Dimension(100,30));

        receiveBtn = new JButton("Receive a Drawing");
        receiveBtn.setPreferredSize(new Dimension(100,30));

        logoutBtn = new JButton("Logout");
        logoutBtn.setPreferredSize(new Dimension(100,30));
        logoutBtn.addActionListener(new LogoutBtnListener());

        panel.add(titleLbl);
        panel.add(sendBtn);
        panel.add(receiveBtn);
        panel.add(logoutBtn);

        frame.add(panel);
    }

    private class LogoutBtnListener implements ActionListener
    {
        //@SuppressWarnings("deprecation")
        public void actionPerformed(ActionEvent action)
        {
            ClientModule client = new ClientModule();
            client.setVisible(true);

            ClientMenu menu = new ClientMenu();
            menu.setVisible(false);
        }
    }

    public static void main(String[] args)
    {
        new ClientMenu().run();
    }

    public void run()
    {
        frame.pack();
        frame.setVisible(true);
    }

}
我不确定我是否遗漏了什么,或者编码错了什么,或者其他什么。我已经找过了,试过了。。
非常感谢您的帮助和理解(:

我通过添加对
run()
方法的调用,成功地显示了第二帧(包括其内容):

        ClientMenu menu = new ClientMenu();
        menu.setVisible(true);  
        menu.run();
尽管如此,您的代码仍存在一些问题:

  • 在每个类中都有一个
    main
    方法。每个应用程序应该只有一个main方法。由于
    ClientModule
    似乎是您要打开的第一个框架,您可能希望将main方法保留在那里,并删除另一个类中的一个

  • 每个类中都有一个
    run()
    方法。就我个人而言,我倾向于避免这样命名方法,因为这样可能会导致与
    run()混淆处理线程时需要重写的
    方法。显然,您正试图在
    ClientModule
    中执行一些多线程操作,但不会起作用。请查看并发教程以更好地理解线程。您还应该明白,决不能调用
    run()
    你自己。教程应该清楚地说明这一点

  • Swing应用程序的启动方式与其他应用程序稍有不同。有关更多信息,请参阅教程

  • <> L> >p>你的两个类都是代码>扩展< /代码> jFrand,然后提供你自己的。这导致了其他的JFrm被创建,这就是我的情况(我得到每个实例的2个JFras)。如果你想让你的类像JFrm一样,考虑扩展它,如果你想使用一个JFrm,那么编写一个类,而不是两个类。(至少在这种情况下不是这样)

  • 最后,要摆脱以前的JFrame,您可以在it上调用
    dispose()
    。也就是说,方法通常是使用。这将允许您有一个包含多个内容的框架


  • 对不起,长的帖子,但是请在继续之前考虑上面的重构。

    您可以使用SETVICE属性为“true”或“false”。

    什么是问题?如果调用<代码> Run(),会发生什么?来自第二帧的构造函数?啊,对不起..如果我单击ClientModule类中的按钮,它将从ClientMenu类打开第二帧。但是Gui组件没有显示在第二帧中..和..我不确定如何创建第一帧(ClientModule)在第二帧打开后自动关闭。请查看并使用
    卡片布局或对话框。有关详细信息,请参阅和