2015-06-10 2 views
-1

Я играл с качелями, и я сделал экран входа в систему, но после того, как пользователь ввел правильно и вернется, если он попытается ввести неверные учетные данные, предупреждающее сообщение показывает больше, чем 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(); 

} 
} 
+0

Рассмотрим обеспечение [работоспособный пример] (https://stackoverflow.com/help/mcve), который демонстрирует вашу проблему. Это не дамп кода, а пример того, что вы делаете, что подчеркивает проблему, с которой вы сталкиваетесь. Это приведет к меньшему путанице и лучшим ответам. – MadProgrammer

+0

Рассмотрите возможность использования «CardLayout», см. [Как использовать CardLayout] (http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html). – MadProgrammer

+0

Избегайте использования «пустых» макетов, идеальные макеты пикселей - это иллюзия в современном дизайне ui. Слишком много факторов, которые влияют на индивидуальный размер компонентов, ни один из которых вы не можете контролировать. Swing был разработан для работы с менеджерами компоновки в ядре, отбросив их, не будет конца проблем и проблем, которые вы будете тратить все больше и больше времени на исправление – MadProgrammer

ответ

1

Мой "подозрение" означает, что каждый раз, когда вы "вернуться" в на экране входа в систему вы вызываете метод login, который регистрирует loginScreen как ДРУГОЙ ActionListener на кнопку login.

Вы должны изолировать свои функциональные возможности в отдельных единицах работы, позволяя им выполнять только одно задание, для которого они предназначены.

Например, loginScreen не следует делать навигационные решения, но должны быть уведомляя какой-то наблюдатель, что государство Логин прошло/не удалось, и позволить ему принимать решения о том, что он должен делать в этом случае

вы хотели бы взглянуть на Model-View-Controller парадигме

0

может быть, потому, что вы добавляете один и тот же action listener каждый раз вы называете refresh ...

вы можете добавить action listener только о сть ... как это:

public void initialize(){ 
     login.addActionListener(this); 
     back.addActionListener(this); 
} 

и называют это после того, как конструктор ...

public static void main(String[] args) { 
     loginScreen l = new loginScreen(); 
     l.initialize(); 
} 
Смежные вопросы