我对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---
为什么?我错过了什么?
您必须使用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’。我想这不是我应该构建应用程序的方式。我应该怎么做,或者如何解决错误? 问题答案: 这样做是没有意义的。你将创建子类