当前位置: 首页 > 知识库问答 >
问题:

无法在扩展PropertyChangeListener的主类中拦截PropertyChangeEvent,为什么?

景元忠
2023-03-14

我对Java Swing开发非常陌生,我发现在GUI中使用PropertyChangeListener有一些困难。

所以我有一个Main类,它实现了Property tyChangeListener接口:

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

然后在Main类中,我有一个propertyChange()方法,该方法必须截获此事件,但这似乎不起作用,因为不要输入此方法,也不要打印“GUI---

为什么?我错过了什么?

共有1个答案

阳建弼
2023-03-14

您必须使用addProperty tyChangeListener注册侦听器,即:

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

有关详细信息和示例,请参见如何编写属性更改侦听器。

编辑:

但是我应该在哪里插入你之前的两行代码呢?在哪个类\方法中?

在发布的示例中,您没有分配类Main的实例,因此我不确定它的用途。发布的示例也不会编译。要查看输出,请添加以下行:

loginFrame.addPropertyChangeListener(new Main());

但这只是一种黑客行为。总而言之,您需要分配一个实现Property tyChangeListener的实例,并使用addProperty tyChangeListener方法将其注册到面板中。

编辑:

以下是一个演示基本侦听器的示例:

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();
            }
        });
    }
}
 类似资料:
  • 扩展说明 服务提供方和服务消费方调用过程拦截,Dubbo 本身的大多功能均基于此扩展点实现,每次远程方法执行,该拦截都会被执行,请注意对性能的影响。 约定: 用户自定义 filter 默认在内置 filter 之后。 特殊值 default,表示缺省扩展点插入的位置。比如:filter="xxx,default,yyy",表示 xxx 在缺省 filter 之前,yyy 在缺省 filter 之后

  • 问题内容: 我不明白为什么Java注释中没有继承关系,就像Java类一样。我认为这将非常有用。 例如:我想知道给定的注释是否为验证者。通过继承,我可以自反地浏览超类,以了解此注释是否扩展了。否则,我该如何实现? 那么,谁能给我这个设计决定的理由? 问题答案: 关于未采用这种方式进行设计的原因,你可以在JSR 175设计常见问题解答中找到答案,其中说: 你为什么不支持注释子类型化(一种注释类型扩展了

  • 我正在开发一个Quarkus扩展,它提供了一个拦截器(及其注释),以围绕此扩展提供的业务方法添加一些重试逻辑。这里没有什么新内容,当我在使用此扩展的应用程序中注释bean的公共方法时,这是有效的。 但是该扩展还提供了一些也带注释的@ApplationScoped bean,但拦截器没有拦截其中任何一个。 似乎拦截器不会检查/应用扩展本身。 我想知道这是有意的行为,还是我的扩展设置中的问题,如果是,

  • 我试图使用graal nashorn interop来编写与Java交互的NodeJ。我从。但我不能延长课程。javascript代码是 我的错误是这似乎指向了我所引用的java代码以及javascript运行位置的类加载器问题(即两个不同的类加载器)。在使用graal/nodejs时,有没有办法做到这一点?

  • 问题内容: 我想在Java-SE应用程序中使用拦截器,并且将weld作为CDI实现,并且在这里进行测试: 主班: 服务等级: 拦截器类: Aaa和输出: 我的问题 第一:为什么我在调用methodCallNumberTwo()时没有在methodCall()中调用拦截器? 第二:有办法改变吗? 我仅研究拦截器的行为,并且想了解。先感谢您! 问题答案: 不会调用拦截器,因为您是在对象的同一实例上调用

  • 问题内容: 我正在学习Flask,并且对如何构造代码有些困惑。因此,我尝试如下扩展Flask主类: 这样,当我想启动应用程序时,我可以执行以下操作: 这样,我可以在类中对方法和路由进行排序,但是问题是使用自装饰器时: 引发错误为unresolved reference ‘route’。我想这不是我应该构建应用程序的方式。我应该怎么做,或者如何解决错误? 问题答案: 这样做是没有意义的。你将创建子类