gpt4 book ai didi

java - 编写 Swing 组件 : How do I add the ability to add ActionListeners?

转载 作者:行者123 更新时间:2023-12-02 08:00:41 26 4
gpt4 key购买 nike

我想通过组合几个现有组件来创建一个(希望是简单的)自定义 Swing 组件。就我而言,它是一个开关,由一个 JLabel 和两个用于打开和关闭的 JButton 组成。我通过扩展 JPanel 开始 OnOffSwitch。构造函数添加子组件,并将其自身设置为按钮的 ActionListener。该类有一个 isOn() 方法用于查询组件的当前状态。

我现在想要添加将 ActionListener 添加到 OnOffSwitch 类的功能。我希望通过扩展像 JPanel 这样的 Swing 组件来免费提供此功能,但 JPanel 没有此功能。从源代码的外观来看,每个具有此功能的 Swing 组件都会重新实现它本身:将监听器添加到列表、触发 ActionEvents 等。

实现我想要的目标的正确方法是什么?我可以从各种 Swing 组件中复制/粘贴该代码(或重写其要点),或者我可以实现我自己的 OnOffSwitchListener 接口(interface)。为了保持一致,我的所有组件似乎都应该使用 ActionListener。

最佳答案

我会使用 JToggelButton,如图 here ,或委托(delegate)给包含的按钮,如 @duffymo 建议的那样。如果您确实需要自定义OnOffSwitchEvent,则EventListenerList中概述了标准接线。 ,其实例包含在每个 JComponent 中。

附录:以下是委托(delegate)给包含两个按钮的 ButtonGroup 的示例。标签用符号装饰,但 Icon 的任何实现都更加灵活。

BttonGroupTest iamge

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ButtonGroup;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JToggleButton;

/** @see https://stackoverflow.com/questions/6035834 */
public class ButtonGroupTest extends JComponent {

private static final String ON = "On";
private static final String OFF = "Off";
private final JToggleButton bOn = new JToggleButton(ON);
private final JToggleButton bOff = new JToggleButton(OFF);
private final JLabel label = new JLabel(" \u2301 ");
private final ButtonHandler handler = new ButtonHandler();

public ButtonGroupTest() {
this.setLayout(new FlowLayout());
label.setOpaque(true);
label.setBackground(Color.red);
label.setFont(label.getFont().deriveFont(36f));
ButtonGroup bg = new ButtonGroup();
this.add(bOn);
bg.add(bOn);
bOn.setSelected(true);
bOn.addActionListener(handler);
this.add(label);
this.add(bOff);
bg.add(bOff);
bOff.addActionListener(handler);
}

public void addActionListener(ActionListener listener) {
bOn.addActionListener(listener);
bOff.addActionListener(listener);
}

private class ButtonHandler implements ActionListener {

@Override
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if (ON.equals(cmd)) {
label.setBackground(Color.red);
} else {
label.setBackground(Color.black);
}
}
}

private void display() {
JFrame f = new JFrame("ButtonGroupTest");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(this);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {

@Override
public void run() {
new ButtonGroupTest().display();
}
});
}
}

关于java - 编写 Swing 组件 : How do I add the ability to add ActionListeners?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6035834/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com