2013-06-25 6 views
0

Я пытаюсь найти лучший таймер для использования для следующего кода (обратите внимание, что это упрощенная версия моей общей программы). Моя надежда - запустить метод через 3 секунды. Проблема заключается в том, что actionPerformed, checkBlankLogin и resetLoginBlank и положить таймер на задержку resetLoginBlank из 3-х секунд после того, как произошло checkBlankLogin. Но я хочу, чтобы все методы в классе Outerframe непрерывно выполнялись. Таким образом, checkBlankLogin будет продолжать проверять, будет ли его пустым до тех пор, пока человек не введет информацию для "Valid Input", и имя пользователя innerframe будет закрыто. Но я не знаю, как это сделать ... Любая помощь там тоже?Какой таймер использовать для GUI в Java

 import java.awt.*; 
    import java.awt.BorderLayout; 
    import java.awt.event.*; 
    import javax.swing.*; 
    import javax.swing.border.EmptyBorder; 
    import javax.swing.event.*; 
    import java.io.*; 
    import java.io.File; 
    import java.util.*; 
    import java.io.FileNotFoundException; 

    class OuterFrame extends JFrame implements ActionListener 
{ 
Container pane; // container 
JDesktopPane outframe; // outer frame 
JInternalFrame login; // login frame 
//pieces of login frame 
    JLabel loginLBLtitle; 
    JPanel loginPanel; 
    JLabel loginLBLname; 
    JLabel loginBlankName; 
    JLabel loginLBLpass; 
    JLabel loginBlankPass; 
    JTextField loginTXT; 
    JPasswordField loginPASS; 
    JButton loginBUT; 
JInternalFrame apple; 



OuterFrame() 
{ 
    //set up for Outer Frame 
    super("Application"); 
    setSize(450,240); 
    setLocationRelativeTo(null); 
    setResizable(false); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    outframe = new JDesktopPane(); 
    outframe.setBackground(Color.BLUE); 
    //set up for Container 
    pane = getContentPane(); 
    setContentPane(pane); 
    pane.add(outframe); 


    //Login Inner Frame 
    login = new JInternalFrame(); 
    login.setSize(400,200); 
    login.setLocation(20,20); 
    login.setTitle("Member Login"); 
    loginLBLtitle = new JLabel("Sign in with netid and your password."); 
    Font loginFontbody = new Font("SansSerif", Font.PLAIN, 12); 
    Font loginFonthead = new Font("SansSerif", Font.BOLD, 13); 
    loginLBLtitle.setFont(loginFonthead); 
    loginLBLname=new JLabel("User Name:"); 
    loginLBLname.setFont(loginFontbody); 
    loginLBLpass=new JLabel("Password: "); 
    loginLBLpass.setFont(loginFontbody); 
    loginBUT=new JButton("Login"); 
    loginBUT.setFont(loginFontbody); 
    loginBUT.addActionListener(this);   
    loginTXT=new JTextField(20); 
    loginPASS=new JPasswordField(20); 
    loginBlankName=new JLabel(""); 
    loginBlankPass=new JLabel(""); 
    loginPanel=new JPanel(); 
    loginPanel.add(loginLBLtitle); 
    loginPanel.add(loginLBLname); 
    loginPanel.add(loginTXT); 
    loginPanel.add(loginBlankName); 
    loginPanel.add(loginLBLpass); 
    loginPanel.add(loginPASS); 
    loginPanel.add(loginBlankPass); 
    loginPanel.add(loginBUT); 
    //panel.add(lblmess); 
    login.add(loginPanel); 
    login.setVisible(true); 
    //Add Login to Outer Frame 
    outframe.add(login); 
    outframe.setSelectedFrame(login); 
    pane.add(outframe, BorderLayout.CENTER); 
    setVisible(true); 
    loginTXT.requestFocus(); 

} 
public void actionPerformed(ActionEvent e) 
{ 
    //problem area 
    if(e.getSource()==loginBUT) 
    { 
     String uname=loginTXT.getText(); 
     String passw=new String(loginPASS.getPassword()); 
     int i=0; 
     while(i!=5) 
     { 
      if(checkBlankLogin(uname,passw,loginBlankName,loginBlankPass)) 
      { 
       resetLoginBlank(loginBlankName,loginBlankPass); 
      } 
      else 
      { 

      if(!validateUser("accounts.txt",uname,passw,loginLBLtitle)) 
       { 

      } 
     } 
    }     
} 
public void resetLoginBlank(JLabel loginBlankName, JLabel loginBlankPass) 
{ 
    loginBlankName.setText(""); 
    loginBlankPass.setText(""); 
} 
public void resetLoginTitle(JLabel loginBlankTitle) 
{ 
    loginBlankTitle.setText("Sign in with netid and your password."); 
    loginBlankTitle.setForeground(Color.BLACK); 
} 
public boolean checkBlankLogin(String name, String passw, JLabel loginBlankName, JLabel loginBlankPass) 
{ 
    boolean isBlank=false; 
    if(name.length()<1) 
    { 
     loginBlankMess("User name is required.",loginBlankName); 
     isBlank=true; 
    } 
    if(passw.length()<1) 
    { 
     loginBlankMess("Password is required.",loginBlankPass); 
     isBlank=true; 
    } 
    return isBlank; 
} 
public void loginBlankMess(String mess, JLabel lbl) 
{ 
    lbl.setText(mess); 
    lbl.setForeground(Color.RED);     
} 
public boolean validateUser(String filename, String name, String password, JLabel title) 
{ 
     boolean valid = false; 

    try 
    { 
     File file = new File(filename); 
     Scanner scanner = new Scanner(file); 
     ArrayList<String> fileInfo = new ArrayList<String>(); 
     while (scanner.hasNextLine()) 
     { 
      String line = scanner.nextLine(); 
      fileInfo.add(line); 
     } 
     String fullLogin = name + " " + password; 
     if(fileInfo.contains(fullLogin)) 
     { 
      //loginBlankMess("Valid login",namemess); 
      valid=true; 
     } 
     if(!valid) 
     { 
      loginBlankMess("Please enter valid netid and password.", title); 
      resetLoginTitle(title); 
     } 
    } 
    catch(Exception ie) 
    { 
     System.exit(1); 
    } 
    return valid; 
} 
    } 

    public class TheProgram 
    { 
public static void main(String[] args) 
{ 
    new OuterFrame(); 
} 
    }` 
+0

Какой выбор вы рассмотрели? –

+0

Итак, я могу ввести пустое имя и пароль. Вы можете изменить свои тесты на name.trim(). Length() <1 и passw.trim(). Length() <1 –

+0

Gilbert - В чем преимущество использования trim()? И я не думаю, что это было ясно, но «требуется пароль», а «имя пользователя требуется» - это два сообщения, которые появляются, когда пользователь нажимает кнопку «Вход», когда два других текстовых поля (имя пользователя и пароль) пустые , Я надеюсь, что эти сообщения появятся только в течение 3 секунд, а затем исчезнут. – user2518777

ответ

2

Качели-таймеры являются самыми легкими в вашем случае. Вы создаете свой класс для ActionListener и создаете объект таймера. Таймер вызовет метод actionPerformed, когда он истечет.

import javax.swing.Timer; 

class OuterFrame extends JFrame implements ActionListener{ 
    Timer timer = null; 

    public void actionPerformed(ActionEvent e) { 
     if(e.getSource()==loginBUT){ 
      //If the action came from the login button 
      if (checkBlankLogin()){ 
       timer = new Timer(3000, this); 
       timer.setRepeats(false); 
       timer.setInitialDelay(3000); 
       timer.start(); 
      } else if (timer != null){ 
       timer.stop(); 
      } 
     }else if(e.getSource()==timer){ 
      //If the action came from the timer 
      resetLoginBlank(namemess,passwmess)); 
     } 
    } 
} 
+0

Это не сработает, так как метод "resetLoginBlank" вызывается из метода, который находится в методе actionPerformed. – user2518777

+0

@ user2518777 Вы имеете в виду, что хотите вызвать resetLoginBlank из checkBlankLogin, а не actionPerformed? –

+0

Вот где мой код: – user2518777

3

Я хотел бы проверить следующий ресурс (если вы используете Качели для UI):

How to Use Swing Timers (Oracle)

+0

Я использовал этот веб-сайт для получения некоторой информации, но для моего конкретного условия (требуется таймер в методе, который вызывается из другого метода, который вызывается из метода actionPerformed), он не был слишком полезен – user2518777