Я играл с качелями, и я сделал экран входа в систему, но после того, как пользователь ввел правильно и вернется, если он попытается ввести неверные учетные данные, предупреждающее сообщение показывает больше, чем 1 раз. Я думаю, что это имеет какое-то отношение к revalite(), находящемуся в actionPerformed(). Пожалуйста помоги!Swing - revalidate() with actionPerformed() problems
это класс, который содержит все GUI:
package Login;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
public class loginScreen implements ActionListener{
JFrame loginFrame = new JFrame("Welcome");
//login()components
JTextField userName = new JTextField();
JTextField password = new JTextField();
JButton login = new JButton("Login");
//login()components
//welcome()components
JLabel message = new JLabel("Welcome user!");
JButton back = new JButton("Get Back");
//welcome()components
//ArrayLists
ArrayList<String> users = new ArrayList<String>(Arrays.asList("1", "user1", "user2"));
ArrayList<String> passwords = new ArrayList<String>(Arrays.asList("1", "pass1", "pass2"));
//ArrayLists
public loginScreen(){
loginFrame.setSize(200, 180);
loginFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
loginFrame.setVisible(true);
loginFrame.setLayout(new GridLayout(1, 1));
loginFrame.add(login());
}
public void refresh(JPanel panel){
loginFrame.getContentPane().removeAll();
loginFrame.getContentPane().add(panel);
loginFrame.getContentPane().revalidate();
//loginFrame.getContentPane().repaint();
}
public boolean testCredentials(String userName, String password){
boolean isCorrect = false;
for (int i = 0; i < users.size(); i++) {
if (userName.equals(users.get(i))) {
if (password.equals(passwords.get(i))) {
isCorrect = true;
}
}
}
return isCorrect;
}
public JPanel login(){
JPanel panel = new JPanel();
panel.setLayout(null);
//userName
userName.setSize(150, 25);
userName.setLocation(20, 20);
//userName
//password
password.setSize(150, 25);
password.setLocation(20, 60);
//password
//login
login.setSize(100, 30);
login.setLocation(50, 100);
login.addActionListener(this);
//login
panel.add(userName);
panel.add(password);
panel.add(login);
return panel;
}
public JPanel welcome(){
JPanel panel = new JPanel();
panel.setLayout(null);
//message
message.setSize(100, 30);
message.setLocation(50, 30);
//message
//back
back.setSize(100, 30);
back.setLocation(50, 90);
back.addActionListener(this);
//back
panel.add(message);
panel.add(back);
return panel;
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == login) {
if (testCredentials(userName.getText(), password.getText()) == true) {
refresh(welcome());
} else {
JOptionPane.showMessageDialog(null, "Wrong username or password!");
}
}
if (e.getSource() == back) {
refresh(login());
}
}
}
этот класс содержит основной():
package Login;
public class Main {
public static void main(String[] args) {
loginScreen l = new loginScreen();
}
}
Рассмотрим обеспечение [работоспособный пример] (https://stackoverflow.com/help/mcve), который демонстрирует вашу проблему. Это не дамп кода, а пример того, что вы делаете, что подчеркивает проблему, с которой вы сталкиваетесь. Это приведет к меньшему путанице и лучшим ответам. – MadProgrammer
Рассмотрите возможность использования «CardLayout», см. [Как использовать CardLayout] (http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html). – MadProgrammer
Избегайте использования «пустых» макетов, идеальные макеты пикселей - это иллюзия в современном дизайне ui. Слишком много факторов, которые влияют на индивидуальный размер компонентов, ни один из которых вы не можете контролировать. Swing был разработан для работы с менеджерами компоновки в ядре, отбросив их, не будет конца проблем и проблем, которые вы будете тратить все больше и больше времени на исправление – MadProgrammer