我无法让第二帧显示GUI组件。我已经使用第一帧中的JButton
打开了框架。
这是屏幕截图
这是第一帧 - ClientModule.java
第2帧 - 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);
}
}
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);
}
}
我不确定我是否遗漏了某些内容,或者编写了错误的内容,或其他内容。我已经搜索过并尝试过.. 任何帮助和理解表示赞赏(:
答案 0 :(得分:2)
我设法通过添加对run()
方法的调用来显示第二帧(包括其内容):
ClientMenu menu = new ClientMenu();
menu.setVisible(true);
menu.run();
话虽如此,您的代码存在一些问题:
您的每个课程都有main
个方法。每个应用程序应该有仅1 主方法。由于ClientModule
似乎是您想要打开的第一个框架,因此您可能希望保留主要方法并删除其他类中的方法。
每个班级都有run()
个方法。就个人而言,我倾向于避免使用这样的命名方法,因为它可能会导致与处理线程时需要重写的run()
方法混淆。你显然试图在你的ClientModule
中做一些多线程,但是不行。请查看this并发教程以更好地理解线程。您还应该了解您永远不应自己致电run()
。教程应该清楚说明。
Swing应用程序的启动方式与其他应用程序略有不同。有关详细信息,请参阅this教程。
您有两个类extend
JFrame但是,请提供您自己的类。这会导致创建其他JFrame,这就是我的情况(每次实例化时我得到2个JFrame)。如果你希望你的类表现得像JFrame,考虑扩展它,如果你想使用JFrame,那么组成你的类,而不是两者(至少在这种情况下不是)。
最后,为了摆脱之前的JFrame,您可以在其上调用dispose()
。话虽这么说,方法通常是使用Card Layout
。这将允许您拥有包含多个内容的1个框架。
对于长篇帖子感到抱歉,但在继续之前请考虑按上述方法重新考虑。
答案 1 :(得分:1)
您可以将setVisible属性用于'true'或'false'。