2015-05-17 76 views
1

該程序返回0,需要停止/暫停程序,按下按鈕,然後返回ID。如何在按下按鈕後製作程序返回ID?

static int ID=0; 
static String log=""; 
static String pass=""; 
static SessionFactory factory; 

public static int enterStudent(JPanel panel){ 

    panel.setLayout(null); 
    JLabel jLabel=new JLabel("Login"); 
    panel.add(jLabel); 
    jLabel.setBounds(10,10,100,30); 
    JLabel jLabel1=new JLabel("Password"); 
    panel.add(jLabel1); 
    jLabel1.setBounds(110,10,100,30); 
    final JTextArea textArea=new JTextArea(); 
    textArea.setBounds(10,50,100,50); 
    panel.add(textArea); 
    final JTextArea textArea2=new JTextArea(); 
    textArea2.setBounds(110,50,100,50); 
    panel.add(textArea2); 
    JButton enterButton=new JButton("Enter"); 
    enterButton.setBounds(10,100,200,50); 
    panel.add(enterButton); 
    try { 
     factory = new Configuration().configure().buildSessionFactory(); 
    } catch (Throwable ex) { 
     System.err.println("Failed to create sessionFactory object." + ex); 
     throw new ExceptionInInitializerError(ex); 
    } 

的ActionListener

enterButton.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e2) { 
      log=textArea.getText(); 
      pass=textArea2.getText(); 
      Session session = factory.openSession(); 
      Transaction tx = null; 
      try{ 
       tx = session.beginTransaction(); 
       List students = session.createQuery("FROM Student").list(); 
       for (Iterator iterator = 
          students.iterator(); iterator.hasNext();){ 
        Student student = (Student) iterator.next(); 
        if((student.getLogin().equals(log))&&(student.getPassword().equals(pass))){ 
         ID=student.getId();//this should be returned 
         JOptionPane.showMessageDialog(null,"return="+ID); 
         break; 
        } 
       } 
       tx.commit(); 


      }catch (HibernateException e) { 
       if (tx!=null) tx.rollback(); 
       e.printStackTrace(); 
      }finally { 
       session.close(); 
      } 
     } 
    }); 

    return ID; //returns 0 
} 

這是登錄功能,檢查登錄並傳遞DATABASE。需要返回學生的ID,但是程序返回0

回答

0

您不能從自法一個ActionListener返回任何東西,actionPerformed(...)定義爲返回void,什麼都沒有。幸運的是,你不需要。這是一個Swing GUI,並且在ActionListener內部,通過調用myLabel.setText(...)在JLabel中顯示該ID,或將其顯示在需要顯示的地方。或者如果你不想顯示它,請調用一些課程的setId(...)方法。

請注意,對這個問題的真正規範答案是使用MVC或Model-View-Control類型的設計模式,並且在ActionListener(控件的一部分)中,將模型的id字段設置爲數據庫。如果模型的狀態發生變化,GUI應該將偵聽器附加到模型上,以更新GUI的狀態(顯示的數據)。但是對於你的簡單程序來說,這可能會有點過分殺手。

其他方面的建議:

  • 你的代碼顯示了顯著過度使用static修飾符,而且這樣做可以使它很難擴展或增強你的程序,或者讓它輕鬆地與其他類的工作。
  • 您的代碼不遵循Java命名規則,您將需要學習和使用Java naming conventions。變量名應該全部以小寫字母開頭,而類名則以大寫字母開頭。瞭解這一點,並遵循這一點將使我們能夠更好地理解您的代碼,並讓您更好地理解其他代碼。
  • 雖然空佈局和setBounds()對於Swing新手來說似乎是創建複雜GUI的最簡單和最好的方法,但更多的Swing GUI會創建使用它們時遇到的更嚴重的困難。它們不會在GUI大小調整時調整組件的大小,它們是增強或維護的皇室女巫,當它們放在滾動窗格中時它們會完全失敗,在所有平臺或屏幕分辨率與原始視圖不同時,它們看起來會非常糟糕。

編輯:我現在看到你試圖經由JButton的ActionListener的的enterStudent方法返回一個int。這不會像寫入的那樣工作,因爲您在ActionListener完成之前返回了id字段。解決方案包括使用某種類型的回調方法,可能會傳入您的enterStudent的方法參數,或者如果使用模式對話框(如可用於JOptionPane)。否則,基於這種複雜性的增加,那麼是的,您最好使用基於使用監聽器(回調)的M-V-C結構。

+0

謝謝你的想法「顯示ID」。 – Ererdar

0

這意味着程序控制沒有到達此塊,因此您的ID獲取的默認定義值爲0。

if((student.getLogin().equals(log))&&(student.getPassword().equals(pass))){ 
         ID=student.getId();//this should be returned 
         JOptionPane.showMessageDialog(null,"return="+ID); 
         break; 
        } 

這裏if條件沒有變成true,這意味着getLogin()和getPassword之一沒有值作爲「」。

相關問題