fiz*_*ban 2 java swing custom-controls actionlistener
我想通过组合几个现有组件来创建一个(简单的,有希望的)自定义Swing组件.在我的例子中,它是一个开关开关,由一个JLabel和两个用于On和Off的JButton组成.我通过扩展JPanel来开始OnOffSwitch.构造函数添加子组件,并将其自身设置为按钮的ActionListener.该类有一个isOn()方法,用于查询组件的当前状态.
我现在想要添加将ActionListeners添加到OnOffSwitch类的功能.我希望通过扩展像JPanel这样的Swing组件来免费提供这个功能,但是JPanel没有这个功能.通过源代码的外观,具有此功能的每个Swing组件都会自行重新实现它:向列表添加侦听器,触发ActionEvents等等.
实现我想要的正确方法是什么?我可以从各种Swing组件中复制/粘贴该代码(或重写其中的要点),或者我可以实现自己的OnOffSwitchListener接口.为了保持一致,似乎所有组件都应该使用ActionListeners.
我会使用一个JToggelButton如图所示这里,或委托给包含的按钮,如@duffymo建议.如果您确实需要自定义OnOffSwitchEvent,则会列出标准接线EventListenerList,每个接口都包含一个实例JComponent.
附录:这是一个委托给ButtonGroup包含两个按钮的例子.标签上饰有符号,但任何实现Icon都更加灵活.

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();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
我个人认为你不需要自定义Swing组件.您的UI类不需要扩展任何Swing类; 你不太可能提供很多自定义行为.(我可能会承认组成其他人的JPanel.)
我宁愿构图而不是继承.拥有一个具有Swing数据成员的UI类,并为其提供在需要时添加和删除Listener的方法.您可以通过这种方式更改行为,而无需重写UI类.它只不过是一个容器.
public class MyUI
{
private Button b = new Button();
public void addButtonListener(ActionListener listener) { this.b.addActionListener(listener); }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2417 次 |
| 最近记录: |