Java 多个JFrame
我目前有两个框架,当运行应用程序时,显示的第一个JFrame是登录,它有两个输入字段和一个按钮。当用户登录并验证后,我想关闭框架并启动第二个框架 因此,我能想到的唯一一件事就是对登录框架执行Java 多个JFrame,java,swing,jframe,Java,Swing,Jframe,我目前有两个框架,当运行应用程序时,显示的第一个JFrame是登录,它有两个输入字段和一个按钮。当用户登录并验证后,我想关闭框架并启动第二个框架 因此,我能想到的唯一一件事就是对登录框架执行setVisible(false),对Main框架执行setVisible(true) 有没有更好的方法,或者这是唯一的方法?就我个人而言,我会立即启动第二个JFrame,并将第一个帧替换为模态JDialog,它将属于JFrame 另请参见此问题的答案 以下是我建议的基本演示: import java.awt
setVisible(false)
,对Main
框架执行setVisible(true)
有没有更好的方法,或者这是唯一的方法?就我个人而言,我会立即启动第二个
JFrame
,并将第一个帧替换为模态JDialog
,它将属于JFrame
另请参见此问题的答案
以下是我建议的基本演示:
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class TestLogin {
private JFrame frame;
private boolean authenticated;
private JTextField login;
private JPasswordField password;
protected void initUI() {
frame = new JFrame(TestLogin.class.getSimpleName());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 600);
frame.setVisible(true);
}
protected void showLoginDialog() {
authenticated = false;
final JDialog dialog = new JDialog(frame, "Please provide your credentials");
dialog.setModal(true);
JPanel panel = new JPanel(new GridBagLayout());
JPanel buttonPanel = new JPanel();
login = new JTextField(40);
password = new JPasswordField(20);
JLabel loginLabel = new JLabel("Login:");
JLabel passwordLabel = new JLabel("Password:");
JButton ok = new JButton("OK");
ok.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Here perform authentication and set authentication flag to appropriate value
authenticated = true;
if (authenticated) {
setUpFrame();
dialog.dispose();
}
}
});
JButton cancel = new JButton("Cancel");
cancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
dialog.addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent e) {
if (!authenticated) {
System.exit(0);
}
}
});
dialog.getRootPane().setDefaultButton(ok);
buttonPanel.add(ok);
buttonPanel.add(cancel);
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(5, 5, 5, 5);
gbc.fill = GridBagConstraints.HORIZONTAL;
panel.add(loginLabel, gbc);
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.weightx = 1.0;
panel.add(login, gbc);
gbc.gridwidth = 1;
gbc.weightx = 0;
panel.add(passwordLabel, gbc);
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.weightx = 1.0;
panel.add(password, gbc);
panel.add(buttonPanel, gbc);
dialog.add(panel);
dialog.pack();
dialog.setLocationRelativeTo(frame);
while (!authenticated) {
dialog.setVisible(true);
}
}
protected void setUpFrame() {
frame.add(new JLabel("Successfully authenticated"));
frame.revalidate();
frame.repaint();
}
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException,
UnsupportedLookAndFeelException {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
TestLogin testLogin = new TestLogin();
testLogin.initUI();
testLogin.showLoginDialog();
}
});
}
}
有几种方法可以做到这一点。
例如,您可以重用第一个
JFrame
。因此,移除第一帧上的组件,添加第二帧的组件,然后repaint()
但我不认为这是一个好的实践。
正如安德鲁·汤普森(Andrew Thompson)所建议的那样,您也可以使用CardLayout
来初始化一张JFrame
,显示您的登录卡,然后切换到完全初始化的第二张完整应用卡。这样你就可以摆脱那些重绘了。你也可以显示你的第二个框架(你的应用程序),然后使用一个模态<代码> jCudio>代码>让用户登录。如果你这样做,你还想调用<代码>处理()/<代码>或者设置<代码> jFrase:StEdDebug关闭操作(jFrase.AddieTyOnOxLoad)。“但是我不认为这是一个好的实践。”请参见
CardLayout
。你说得对。我完全忘了这件事。这样就不需要重新绘制。(嗯,我完全讨厌他们;)@AndrewThompson去那里。。。谢谢:-)这似乎有效!现在我的主JFrame启动了,它启动了一个JDialog,有没有办法从视图中隐藏主JFrame?我尝试了setVisible(false)代码>但这并不隐藏它。没关系,只需要添加this.setModal(true)代码>谢谢!