我在网上查看了如何从现有的JFrame打开一个新的JFrame。我发现,最好的方法显然是处理现有的JFrame,然后打开新的JFrame--但这是一个问题。
我有一个登录表单,一个用户登录,登录框架被处理,主框架被设置为可见。
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class client {
public static void main(String[] args) {
initialize();
}
private static void initialize() {
JFrame loginFrame = new JFrame("Login");
loginFrame.setBounds(100, 100, 300, 300);
loginFrame.setResizable(false);
loginFrame.setLocationRelativeTo(null);
loginFrame.setDefaultCloseOperation(loginFrame.HIDE_ON_CLOSE);
loginFrame.getContentPane().setLayout(null);
JFrame mainFrame = new JFrame("Main");
mainFrame.setBounds(100, 100, 300, 197);
mainFrame.setResizable(false);
mainFrame.setLocationRelativeTo(null);
mainFrame.setDefaultCloseOperation(mainFrame.EXIT_ON_CLOSE);
mainFrame.getContentPane().setLayout(null);
JButton loginButton = new JButton("Login");
loginButton.setBounds(102, 133, 89, 23);
loginButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
loginButton.setEnabled(false);
loginFrame.dispose();
mainFrame.setVisible(true);
}
});
loginFrame.getContentPane().add(loginButton);
loginFrame.setVisible(true);
}
}
但是,如果用户启动客户端,然后决定不登录并关闭它,则进程仍在后台运行?
我觉得这是一个非常愚蠢的问题,如果是这样,我很抱歉,但我已经四处寻找,找不到任何解决办法。我可以不处理登录框,只是隐藏它,并将它们都设置为exit_on_close吗?
提前道谢!
因此,主要问题是,您有两个帧,虽然不可见,但都已“实现”,这意味着在所有应用程序窗口被处理之前,事件调度线程不会退出,这意味着JVM不会退出。
所以,我建议稍微改变一下方法。与其使用两个框架,登录“窗口”应该基于一个模式对话框,应用程序框架不应该创建,直到你需要它。
模态dialg将在代码可见的地方停止代码的执行,不会阻塞事件分派线程(这是黑魔法),这意味着您可以使用它一个循环来持续提示用户获取凭据,直到他们通过身份验证或关闭/取消对话框。
我还强烈鼓励使用jpanel
s作为基本组件,允许基于窗口的类仅仅是容器,这隔离了责任,解耦了代码,并提供了一个更可重用的整体解决方案。
您可以查看如何创建对话框以获得更多详细信息
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
LoginPane loginPane = new LoginPane();
boolean authenticated = false;
boolean exit = false;
do {
int option = JOptionPane.showOptionDialog(null,
loginPane,
"login",
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.PLAIN_MESSAGE,
null,
new Object[]{"Login", "Cancel"},
"Login");
if (option == 0) {
// Authenticate
authenticated = true;
} else if (option == JOptionPane.CLOSED_OPTION || option == 1) {
exit = true;
}
} while (!authenticated && !exit);
if (authenticated) {
JFrame frame = new JFrame();
frame.add(new MainPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
});
}
public class LoginPane extends JPanel {
private JTextField userName;
private JPasswordField password;
public LoginPane() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
add(new JLabel("User name: "), gbc);
gbc.gridy++;
add(new JLabel("Password: "), gbc);
gbc.gridx++;
gbc.gridy = 0;
userName = new JTextField(10);
password = new JPasswordField(10);
add(userName, gbc);
gbc.gridy++;
add(password, gbc);
}
public String getName() {
return userName.getText();
}
public char[] getPassword() {
return password.getPassword();
}
}
public class MainPane extends JPanel {
public MainPane() {
setBorder(new EmptyBorder(50, 50, 50, 50));
add(new JLabel("Super awesome app"));
}
}
}
我还鼓励dispose_on_close
而不是hide_on_close
,它将释放本机对等体并从应用程序窗口缓存中删除窗口
现在,如果您真的想要一个更具挑战性的方法,您可以看看Java和GUI--根据MVC模式,ActionListeners属于哪里?,它提供了一个基于MVC的登录实现
问题内容: 我有一个主JFrame,其中具有用于不同功能的各种面板,人们可以在其中进行计算。我想在用户单击第一个计算按钮时打开一个新的JFrame并用作“输出”窗口(如果您熟悉它们,则类似于SPSS输出窗口)。 New JFrame将是完全独立的,并且将具有其自己的菜单栏。简单的JDialog并不是解决之道。 问题答案: 无法抗拒,简单地不同意答案); 和 我想在用户单击第一个计算按钮时打开一个新
很好的一天。请您通过打开Chrome浏览器创建一个新选项卡,在其中执行一些操作,关闭新选项卡,然后返回第一个选项卡并继续在其中工作,来判断Selenium VBA是否可行? 我用以下代码打开浏览器:
例如,假设JFrame类称为frame,两个JPanel类称为panel1和Panel2。如果在panel1中点击了一个按钮,你如何告诉框架移除panel1并添加Panel2?
做web app,一个无法避开的问题就是转场动画;web是基于链接构建的,从一个页面点击链接跳转到另一个页面,如果通过有刷新的打开方式,用户要面对一个空白的页面等待;如果通过无刷新的方式,用Javascript移入DOM节点(常见的SPA解决方案),会碰到很高的性能挑战:DOM节点繁多,页面太大,转场动画不流畅甚至导致浏览器崩溃; mui的解决思路是:单webview只承载单个页面的dom,减少d
问题内容: 我试图在弹出新框架时禁用“主” 。我想要它,所以您不能在该框架上单击或拖动任何东西。我尝试将新框架设为a ,但这并没有禁用其他框架。我还查看了有关此的另一篇文章,建议将其设置为a,但仍然无法正常工作。我真的需要帮助。谢谢。这是我正在使用的代码,他们有什么问题吗? 代表“主”框架。 问题答案: 您已经设置了JDialog#setModal或JDialog#ModalityTypes,可能
查看这段代码,它们展示了一种在登录后显示新窗口的方法。当用户名和密码是正确的,它打开新的对话框。我想要一个按钮点击打开新的对话框,而不检查用户名和密码。