1

私はJava Swingの開発にかなり慣れていないので、GUIでPropertyChangeListenerを使用する際に問題が発生しています。

したがって、PropertyChangeListenerインターフェイスを実装するMainクラスがあります。

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); 


    }

}

ユーザーがJButtonをクリックすると、このLoginFrameクラスでわかるように、actionPerformedメソッドが実行され (println で確認できるため、動作します)、このメソッドで、次の行でfirePropertyChange()メソッドを実行します。

firePropertyChange("loginButtonClicked", false, true); 

次に、Mainクラスには、このイベントをインターセプトする必要があるpropertyChange()メソッドがありますが、このメソッドに入らず、「GUI ---> propertyChange()」を出力しないため、これは機能しないようです。私のコンソール

なんで?私は何が欠けていますか?

4

1 に答える 1

2

リスナーを に登録する必要がありますaddPropertyChangeListener

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

詳細と例については、プロパティ変更リスナーの作成方法を参照してください。

編集:

しかし、前の 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();
            }
        });
    }
}
于 2013-11-14T16:38:40.680 に答える