Java GUI - JButton从另一个类打开另一个框架

时间:2015-05-20 08:34:29

标签: java swing jframe jbutton actionlistener

我无法让第二帧显示GUI组件。我已经使用第一帧中的JButton打开了框架。

这是屏幕截图

这是第一帧 - ClientModule.java enter image description here

第2帧 - ClientMenu.java enter image description here

这是我试过的代码

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);
    }
}

ClientMenu.java

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);
    }

}

我不确定我是否遗漏了某些内容,或者编写了错误的内容,或其他内容。我已经搜索过并尝试过.. 任何帮助和理解表示赞赏(:

2 个答案:

答案 0 :(得分:2)

我设法通过添加对run()方法的调用来显示第二帧(包括其内容):

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

话虽如此,您的代码存在一些问题:

  1. 您的每个课程都有main个方法。每个应用程序应该有仅1 主方法。由于ClientModule似乎是您想要打开的第一个框架,因此您可能希望保留主要方法并删除其他类中的方法。

  2. 每个班级都有run()个方法。就个人而言,我倾向于避免使用这样的命名方法,因为它可能会导致与处理线程时需要重写的run()方法混淆。你显然试图在你的ClientModule中做一些多线程,但是不行。请查看this并发教程以更好地理解线程。您还应该了解您永远不应自己致电run()。教程应该清楚说明。

  3. Swing应用程序的启动方式与其他应用程序略有不同。有关详细信息,请参阅this教程。

  4. 您有两个类extend JFrame但是,请提供您自己的类。这会导致创建其他JFrame,这就是我的情况(每次实例化时我得到2个JFrame)。如果你希望你的类表现得像JFrame,考虑扩展它,如果你想使用JFrame,那么组成你的类,而不是两者(至少在这种情况下不是)。

  5. 最后,为了摆脱之前的JFrame,您可以在其上调用dispose()。话虽这么说,方法通常是使用Card Layout。这将允许您拥有包含多个内容的1个框架。

  6. 对于长篇帖子感到抱歉,但在继续之前请考虑按上述方法重新考虑。

答案 1 :(得分:1)

您可以将setVisible属性用于'true'或'false'。