我需要设计一个登录屏幕,在登录时为用户分配访问级别(privilegeLevel),以便他们可以访问或不访问整个程序中的按钮。
以下是登录屏幕代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.event.*;
public class LoginScreen extends JFrame implements ActionListener
{
// Setting up the original login screen components like buttons
JTextField username = new JTextField("");
JPasswordField password = new JPasswordField("");
JButton logIn = new JButton();
// Background setup
ImageIcon LoginScreenFile = new ImageIcon("LoginScreen.png");
JLabel backgroundLoginScreen = new JLabel(LoginScreenFile);
public int privilegeLevel;
public LoginScreen()
{
// Adds the background
this.add(backgroundLoginScreen);
// Sets the close operation to stop the program
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
// Gets the screen size
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
// Calculates where to put the window
int xPos = (screenSize.width - 520)/2;
int yPos = (screenSize.height - 400)/2;
// Sets location at calculated position ^
this.setLocation(xPos, yPos);
// Sets the size of the window
this.setSize(520,400);
this.pack();
// Sets all the components visibility as true
username.setVisible(true);
password.setVisible(true);
logIn.setVisible(true);
// Sets the bounds for the components
username.setBounds(252, 154, 132, 25);
password.setBounds(252, 194, 132, 25);
logIn.setBounds(399, 194, 56, 25);
// Sets the text for the components
logIn.setText("Log In");
// Adds the components to the background window
add(username);
add(password);
add(logIn);
// no layout manager assists in the positioning
this.setLayout(null);
// sets the label containing all of the buttons etc as visible
this.setVisible(true);
// Adds an action listener to the buttons so functions can be done when it is pressed
logIn.addActionListener(LoginScreen.this);
}
public void actionPerformed(ActionEvent e)
{
// if the button is pressed
if(e.getSource() == logIn)
{
// gets the string that is in the text boxes
String str_username = username.getText();
char[] char_password = password.getPassword();
String str_password = String.valueOf(char_password);
// if the logins are correct, assign a privilege level and send the user to the correct Main Menu
if(str_username.equalsIgnoreCase("StudentA") && str_password.equalsIgnoreCase("password"))
{
final int privilegeLevel = 2;
new StudentMainMenu();
}
else if(str_username.equalsIgnoreCase("StudentB") && str_password.equalsIgnoreCase("password"))
{
final int privilegeLevel = 1;
new StudentMainMenu();
}
else if(str_username.equalsIgnoreCase("Admin") && str_password.equalsIgnoreCase("password123"))
{
final int privilegeLevel = 3;
new StudentMainMenu();
}
// otherwise display a message popout that tells the user they have not entered correct data
else
{
JOptionPane.showMessageDialog(null, "Error - Wrong username/password combination", "ERROR ON LOGIN", JOptionPane.ERROR_MESSAGE);
this.dispose();
new LoginScreen();
}
// an else here to "catch" the user - however there is no way for this to get triggered
}
else
{
System.out.println("error");
}
}
public static void main(String[] args)
{
new LoginScreen();
}
}
以及适用的地方:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.event.*;
public class StudentMainMenu extends JFrame implements ActionListener
{
// Setting up the original login screen components like buttons
JButton questionsAnswers = new JButton();
JButton calculator = new JButton();
JButton diffIntCalc = new JButton();
JButton seriesCalc = new JButton();
JButton help = new JButton();
JButton logOut = new JButton();
JButton adminAccessButton = new JButton();
int privilegeLevel = LoginScreen.privilegeLevel;
// Background setup
ImageIcon StudentMainMenuFile = new ImageIcon("StudentMainMenuResize.png");
JLabel backgroundStudentMainMenu = new JLabel(StudentMainMenuFile);
public StudentMainMenu()
{
// Adds the background
this.add(backgroundStudentMainMenu);
// Sets the close operation to stop the program
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
// Gets the screen size
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
// Calculates where to put the window
int xPos = (screenSize.width - 1000)/2;
int yPos = (screenSize.height - 750)/2;
// Sets location at calculated position ^
this.setLocation(xPos, yPos);
// Sets the size of the window
this.setSize(1000,750);
this.pack();
// using this for testing purposes to see what the program is using for privilegeLevel
JOptionPane.showMessageDialog(null, "privilegeLevel = " + privilegeLevel, "pLevel", JOptionPane.INFORMATION_MESSAGE);
adminAccessButton.setVisible(false);
if(privilegeLevel == 3)
{
adminAccessButton.setVisible(true);
}
// Sets all the components visibility as true
questionsAnswers.setVisible(true);
calculator.setVisible(true);
diffIntCalc.setVisible(true);
seriesCalc.setVisible(true);
help.setVisible(true);
logOut.setVisible(true);
// Sets the bounds for the components
questionsAnswers.setBounds(333, 255, 334, 38);
calculator.setBounds(333, 303, 334, 37);
diffIntCalc.setBounds(333, 350, 334, 37);
seriesCalc.setBounds(333, 396, 334, 37);
help.setBounds(333, 443, 334, 37);
logOut.setBounds(505, 490, 162, 37);
adminAccessButton.setBounds(333, 490, 162, 37);
// Sets the text for the components
questionsAnswers.setText("Questions w/ Answers");
calculator.setText("Calculator");
diffIntCalc.setText("Differentiation & Integration Calculator");
seriesCalc.setText("Series Calculator");
help.setText("Help");
logOut.setText("Log Out");
adminAccessButton.setText("Admin Access");
// Adds the components to the background window
add(questionsAnswers);
add(calculator);
add(diffIntCalc);
add(seriesCalc);
add(help);
add(logOut);
add(adminAccessButton);
// no layout manager assists in the positioning
this.setLayout(null);
// sets the window containing all of the buttons etc as visible
this.setVisible(true);
// Adds an action listener to the buttons so functions can be done when they are pressed
questionsAnswers.addActionListener(StudentMainMenu.this);
calculator.addActionListener(StudentMainMenu.this);
diffIntCalc.addActionListener(StudentMainMenu.this);
seriesCalc.addActionListener(StudentMainMenu.this);
help.addActionListener(StudentMainMenu.this);
logOut.addActionListener(StudentMainMenu.this);
adminAccessButton.addActionListener(StudentMainMenu.this);
}
public void actionPerformed(ActionEvent e)
{
// If Question and Answers is pressed
if(e.getSource() == questionsAnswers)
{
this.dispose();
new QuestionsAnswersMainNew();
}
// If Calculator is pressed
else if(e.getSource() == calculator)
{
this.dispose();
//new Calculator();
}
// If Diff / Int Calculator is pressed
else if(e.getSource() == diffIntCalc)
{
this.dispose();
//new DiffIntChoice();
}
// If Series Calculator is pressed
else if(e.getSource() == seriesCalc)
{
this.dispose();
//new SeriesCalc();
}
// If is Help pressed
else if(e.getSource() == help)
{
this.dispose();
//new Help();
}
// If is Log Out is pressed
else if(e.getSource() == logOut)
{
// Popout aka Option Pane asks if the is sure about logging out
int reply = JOptionPane.showConfirmDialog(null, "Are you sure you want to Log Out?", "Log Out?", JOptionPane.YES_NO_CANCEL_OPTION);
// If the user picks yes
if(reply == JOptionPane.YES_OPTION)
{
// Close the Main Menu, then go back to the Log in Screen
this.dispose();
new LoginScreen();
}
// Else - if they pick no or close the option pane
else
{
// Do Nothing
}
}
// Just here if something weird happens and to ensure a crash doesn't happen
else
{
System.out.println("error");
}
}
public static void main(String[] args)
{
new StudentMainMenu();
}
}
在第二部分中第17行对非静态变量进行静态引用时出错,但我不相信这是主要问题。