首先,我只是在玩按钮和JFrame。问题是我可以在这里用几行代码从一个Jframe切换到另一个Jframe ......
JButton studentLoginButton = new JButton("Student");
studentLoginButton.setBounds(85, 80, 80, 20);
studentLoginButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
LoginFrame.super.setVisible(false);
student.setVisible(true);
}
});
add(studentLoginButton);
但是当我将学生JFrame设置为可见并使用此处的代码时......
JButton cancelButton = new JButton("Go Back");
cancelButton.setBounds(205, 80, 80, 20);
cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
StudentFrame.super.setVisible(false);
login1.setVisible(true);
}
});
add(cancelButton);
取消并返回它不起作用。没有显示,应用程序也没有终止。我该怎么做才能解决这个问题?如果能帮助其他人找到解决方案,我可以提供更多代码。
看起来更多的代码会有助于这两个类。 LoginFrame.java ...
package system;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class LoginFrame extends JFrame implements ActionListener{
private static final long serialVersionUID = 1L;
StudentFrame student;
public static void main(String[] args) {
new LoginFrame().setVisible(true);
}
LoginFrame(){
super(" User Login ");
setSize(400, 80);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
StudentFrame student = new StudentFrame(null);
setLayout(new FlowLayout());
//student
JButton studentLoginButton = new JButton("Student");
studentLoginButton.setBounds(85, 80, 80, 20);
studentLoginButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
LoginFrame.super.setVisible(false);
student.setVisible(true);
}
});
add(studentLoginButton);
//Dept. staff
JButton deptStaffLoginButton = new JButton("Department Staff");
deptStaffLoginButton.setBounds(85, 80, 80, 20);
deptStaffLoginButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
LoginFrame.super.setVisible(false);
student.setVisible(true);
}
});
add(deptStaffLoginButton);
//Instructor
JButton InstructorLoginButton = new JButton("Instructor");
InstructorLoginButton.setBounds(85, 80, 80, 20);
InstructorLoginButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
LoginFrame.super.setVisible(false);
student.setVisible(true);
}
});
add(InstructorLoginButton);
}
@Override
public void actionPerformed(ActionEvent e) {
}
}
接下来就是...... StudentFrame.java 包装系统;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class StudentFrame extends JFrame implements ActionListener{
private static final long serialVersionUID = 1L;
static LoginFrame login1;
public static void main(String[] args) {
new StudentFrame(login1).setVisible(true);
}
StudentFrame(LoginFrame login){
super(" User Login ");
setSize(600, 600);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(null);
login1 = login;
// LoginFrame login = new LoginFrame();
JButton loginButton = new JButton("Login");
loginButton.setBounds(85, 80, 80, 20);
loginButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
// LoginFrame.super.setVisible(false);
// student.setVisible(true);
}
});
add(loginButton);
JButton cancelButton = new JButton("Go Back");
cancelButton.setBounds(205, 80, 80, 20);
cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
StudentFrame.super.setVisible(false);
login1.setVisible(true);
}
});
add(cancelButton);
JLabel passLabel = new JLabel("Password: ");
passLabel.setBounds(10, 50, 80, 25);
add(passLabel);
JPasswordField passwordText = new JPasswordField(20);
passwordText.setBounds(85, 50, 240, 25);
add(passwordText);
JLabel userLabel = new JLabel("User name: ");
userLabel.setBounds(10, 10, 80, 25);
add(userLabel);
JTextField userNameText = new JTextField();
userNameText.setBounds(85, 10, 240, 25);
add(userNameText);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
}
答案 0 :(得分:2)
很难知道为什么你当前的代码没有工作,因为我们没有一个正在运行的例子,但是当我看到静态调用时,我很担心,并且像这样调用super,StudentFrame.super.setVisible(false);
。
但不管你问题的直接解决方案,虽然我知道这没有回答你的问题,但最好的解决方案是:不要。不要向用户抛出不同的JFrame,因为这对用户来说可能是一件非常烦人的事情,特别是当有更好的交换视图的方法时,最好是使用CardLayout来交换JPanel视图,这正是我的建议。您可以在此处找到该教程:CardLayout Tutorial。
另请注意以下链接:The Use of Multiple JFrames, Good/Bad Practice?
另一个选项,如果你想使用一个登录对话框就是这样做,使用一个模态JDialog来显示Login窗口,并使它从主应用程序模态。
有关这两种解决方案的详细信息,请显示更相关的代码。
作为“侧面”推荐,我必须提及您对setBounds
的致电。虽然null布局和setBounds()
似乎是Swing新手,比如创建复杂GUI的最简单和最好的方法,但是你创建的Swing GUI越多,在使用它们时会遇到更严重的困难。当GUI调整大小时,它们不会调整组件的大小,它们是增强或维护的皇室女巫,当它们被放置在滚动窗格中时它们完全失败,当它们在所有平台上观看时或者与原始平台不同的屏幕分辨率时它们看起来很糟糕
在进一步检查代码时,我认为您最好的选择是使用模态JDialog来显示登录窗口。这与JFrame的行为类似,但它使用不同的构造函数(API可以帮助您)。它的行为的主要区别在于它会立即停止调用代码,调用代码将JDialog设置为可见 - 就像JOptionPane一样(注意这个 是一个专门的JDialog本身)。这样,调用代码将知道JDialog何时被处理并且不再可见,因为其代码流在其设置JDialog可见之后立即恢复。这样,主GUI中的代码可以显示对话框,然后在用户完成后从中获取信息。