2013-11-14 23 views
1

我很新的Java Swing develompment,我發現在我的GUI中使用PropertyChangeListener有些困難。無法攔截擴展PropertyChangeListener的Main類中的PropertyChangeEvent,爲什麼?

所以我有一個主要類,它實現的PropertyChangeListener接口:

package com.test.login4; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 

import javax.swing.JFrame; 


public class Main implements PropertyChangeListener { 

    private static LoginFrame loginFrame; 

    private static final GUI gui = new GUI(); 

    public static void main(String[] args) { 
      System.out.println("Main ---> main()"); 
      loginFrame = new LoginFrame(); 
      loginFrame.setVisible(true); 


    } 

    public void actionPerformed(ActionEvent e) { 
     // TODO Auto-generated method stub 
     System.out.println("Main ---> actionPerformed()"); 

    } 

    @Override 
    public void propertyChange(PropertyChangeEvent evt) { 
     // TODO Auto-generated method stub 
     System.out.println("GUI ---> propertyChange()"); 

    } 

} 

然後我有LoginFrame類:

package com.test.login4; 

import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.IOException; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JTextField; 



public class LoginFrame extends JFrame implements ActionListener { 

    private static final int FIXED_WIDTH = 550; 
    private static final Dimension INITAL_SIZE = new Dimension(FIXED_WIDTH, 230); 

    private boolean loginResult = true; 

    public LoginFrame() { 

     System.out.println("Inside LoginFrame ---> LoginFrame()"); 

     this.setTitle("XCloud Login"); 

     //this.setPreferredSize(INITAL_SIZE); 
     this.setSize(INITAL_SIZE); 
     this.setResizable(false); 

     Container mainContainer = this.getContentPane(); // main Container into the main JFrame 


     // JPanel creation and settings of the MigLayout on it: 
     // JPanel externalPanel = new JPanel(); 
     JPanelWithBackground externalPanel = null; 

     try { 
      // externalPanel = new JPanelWithBackground("resources/logo.png"); 
      externalPanel = new JPanelWithBackground("src/com/test/resources/logo.png"); 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     externalPanel.setLayout(new net.miginfocom.swing.MigLayout("fill")); 

     externalPanel.add(new JLabel("Username"), "w 50%, wrap"); 
     JTextField userNameTextField = new JTextField(20); 

     externalPanel.add(userNameTextField, "w 90%, wrap"); 

     externalPanel.add(new JLabel("Password"), "w 50%, wrap"); 
     JTextField pswdTextField = new JTextField(20); 
     externalPanel.add(pswdTextField, "w 90%, wrap"); 

     JButton loginButton = new JButton("Login"); 
     loginButton.setActionCommand("loginAction"); 
     loginButton.addActionListener(this); 

     externalPanel.add(loginButton, "w 25%, wrap"); 

     mainContainer.add(externalPanel); 
     // mainFrame.add(mainContainer); 
     // loginFrame.setVisible(true); 
     this.setVisible(true); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     // TODO Auto-generated method stub 
     System.out.println("Button cliccked"); 

     firePropertyChange("loginButtonClicked", false, true); 


    } 

} 

正如你可以在這個LoginFrame見類當用戶點擊的JButton的actionPerformed執行方法(和它的工作,因爲我看到它通過的println)和在該方法中執行的firePropertyChange()方法由該行:

firePropertyChange("loginButtonClicked", false, true); 

然後在 class我有propertyChange()方法必須攔截此事件,但這似乎不起作用,因爲不要輸入此方法並且不打印「GUI ---> propertyChange()」在我的控制檯上

爲什麼?我錯過了什麼?

+1

* 「TNX 安德烈」 * 這3條線路的噪音,我可以不用做。不要包括sigs。在問題中。 –

回答

2

您有addPropertyChangeListener註冊該偵聽器,即:

Main listener = new Main(); 
loginFrame.addPropertyChangeListener(listener); 

的細節和例子見How to Write a Property Change Listener

編輯:

但我在哪裏插入你previuos 2行代碼?在 類\方法

您不會在發佈的示例中分配Main類的實例,因此我不確定它的用途是什麼。發佈的示例也不能編譯。要查看輸出,請添加以下行:

loginFrame.addPropertyChangeListener(new Main()); 

但它只是一個破解。總而言之,您需要分配一個實施PropertyChangeListener的實例,並使用addPropertyChangeListener方法將其註冊到面板。

編輯:

下面是一個說明一個基本的監聽器示例:

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class ListenerDemo { 
    public static final String PROP_NAME = "loginButtonClicked"; 

    public ListenerDemo() { 
     DemoPanel panel = new DemoPanel(); 

     panel.addPropertyChangeListener(PROP_NAME, new PropertyChangeListener() { 
      @Override 
      public void propertyChange(PropertyChangeEvent evt) { 
       System.out.println(evt.getPropertyName()); 
      } 
     }); 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationByPlatform(true); 
     frame.add(panel); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    class DemoPanel extends JPanel { 
     public DemoPanel() { 
      JButton button = new JButton("Test"); 
      button.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        firePropertyChange(PROP_NAME, false, true); 
       } 
      }); 
      add(button); 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new ListenerDemo(); 
      } 
     }); 
    } 
} 
+1

可以看到一個相關示例[here](http://stackoverflow.com/a/10523401/230513)。 – trashgod

+0

mmm tnx,但我在哪裏插入你的previuos 2行代碼?在什麼類\方法? – AndreaNobili

+0

@AndreaNobili請看最後的編輯。所發佈的樣本不完整,因此很難理解其最終結構。 – tenorsax

相關問題