gpt4 book ai didi

java - Jframe 在最小化之前不显示任何内容的问题

转载 作者:行者123 更新时间:2023-11-30 08:53:48 26 4
gpt4 key购买 nike

我的初始 JFrame 登录遇到了一个奇怪的问题。当我运行该程序时,它首先只会拉出取消 JButton。然后,如果我最小化框架,它会显示应有的一切。是否有一个原因?如果是这样,我该如何解决?

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Arrays;

public class example
{
public static void main (String[] args)
{
JFrame frame = new JFrame("Login");
frame.setVisible(true);
frame.setSize(350,150);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JLabel label1 = new JLabel("User Id: ");
JLabel label2 = new JLabel("Password: ");
JTextField txt2 = new JTextField(20);
JButton button = new JButton("login");
JTextField txt = new JTextField(20);
frame.add(label1);
frame.add(txt);
frame.add(label2);
frame.add(txt2);

String user = txt.getText();
String password = txt2.getText();

JButton button2 = new JButton("Cancel");
frame.add(button);
frame.add(button2);
button2.addActionListener (new Action2());
frame.setVisible(true);
frame.setLayout(new FlowLayout());

button.addActionListener(new ActionListener()
{
public void actionPerformed( ActionEvent e)
{
if ("abc".equals(txt.getText()) && "123".equals(txt2.getText()))
{
JFrame frame2 = new JFrame("Student");
frame2.setVisible(true);
frame2.setSize(200,200);
frame.setVisible(false);
}
if ("def".equals(txt.getText()) && "456".equals(txt2.getText()))
{
JFrame frame2 = new JFrame("Instructor");
frame2.setVisible(true);
frame2.setSize(200,200);
frame.setVisible(false);
}
if ("ghi".equals(txt.getText()) && "789".equals(txt2.getText()))
{
JFrame frame2 = new JFrame("Teacher");
frame2.setVisible(true);
frame2.setSize(200,200);
frame.setVisible(false);
}
else
{
System.out.println("Invalid Password");
}
}
});
}

static class Action2 implements ActionListener {
public void actionPerformed (ActionEvent e)
{
System.exit(0);
}
}
}

最佳答案

setVisible(true) 应该是最后一个方法调用。

此外,建议在它们自己的线程中运行 swing 应用程序,如 Java 规范所指定: Concurrency in Swing > Initial Threads: docs.oracle.com

因此理想情况下,您应该这样运行 Swing 应用程序:

//example from the referenced java documentation
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});

有关这方面的更多信息可能更清楚: Will the real Swing Single Threading Rule please stand up?

createAndShowGUI() 方法不是必需的,它是一个任意的方法名称,它的功能是调用一个方法,该方法基本上完成您已经为 Swing 应用程序编写的所有内容(修改 setVisible(true) 在而不是最后。)

所以你应该这样做:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Arrays;

public class example
{
public static void main (String[] args)
{
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
//you can alternatively replace 'createAndShowGUI()' with 'new example()'
}
});
}

public static void createAndShowGUI() {
new example();
}

public example() {
JFrame frame = new JFrame("Login");
//frame.setVisible(true);
frame.setSize(350,150);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JLabel label1 = new JLabel("User Id: ");
JLabel label2 = new JLabel("Password: ");
JTextField txt2 = new JTextField(20);
JButton button = new JButton("login");
JTextField txt = new JTextField(20);
frame.add(label1);
frame.add(txt);
frame.add(label2);
frame.add(txt2);

String user = txt.getText();
String password = txt2.getText();

JButton button2 = new JButton("Cancel");
frame.add(button);
frame.add(button2);
button2.addActionListener (new Action2());
//frame.setVisible(true);
frame.setLayout(new FlowLayout());

button.addActionListener(new ActionListener()
{
public void actionPerformed( ActionEvent e)
{
if ("abc".equals(txt.getText()) && "123".equals(txt2.getText()))
{
JFrame frame2 = new JFrame("Student");
frame2.setVisible(true);
frame2.setSize(200,200);
frame.setVisible(false);
}
if ("def".equals(txt.getText()) && "456".equals(txt2.getText()))
{
JFrame frame2 = new JFrame("Instructor");
frame2.setVisible(true);
frame2.setSize(200,200);
frame.setVisible(false);
}
if ("ghi".equals(txt.getText()) && "789".equals(txt2.getText()))
{
JFrame frame2 = new JFrame("Teacher");
frame2.setVisible(true);
frame2.setSize(200,200);
frame.setVisible(false);
}
else
{
System.out.println("Invalid Password");
}
}
});
frame.setVisible(true);
}

static class Action2 implements ActionListener {
public void actionPerformed (ActionEvent e)
{
System.exit(0);
}
}
}

您还应该编辑 button.addActionListener(new ActionListener()进行适当的修改,就像我在公共(public) example() 构造函数中所做的那样(移动 setVisible(boolean) 方法调用),并为您在此处创建的新 JFrame 添加 EXIT_ON_CLOSE。

关于java - Jframe 在最小化之前不显示任何内容的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29658889/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com