首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >组成Swing组件:如何添加添加ActionListeners的功能?

组成Swing组件:如何添加添加ActionListeners的功能?
EN

Stack Overflow用户
提问于 2011-05-18 03:07:57
回答 3查看 2.8K关注 0票数 2

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

现在,我想添加向OnOffSwitch类添加ActionListeners的功能。我原以为通过扩展像JPanel这样的Swing组件,这个功能是免费的,但是JPanel没有这个功能。从源代码来看,每个具有此功能的Swing组件都会重新实现它:向列表添加侦听器、触发ActionEvents等。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-18 03:18:26

我个人认为你不需要一个自定义的Swing组件。您的UI类不需要扩展任何Swing类;您不太可能提供太多自定义行为。(我可能会承认,这是一个由其他人组成的JPanel。)

我更喜欢组合而不是继承。创建一个具有Swing数据成员的UI类,并为其提供在需要时添加和删除侦听器的方法。您可以通过这种方式更改行为,而不必重写UI类。它只不过是一个容器。

代码语言:javascript
运行
复制
public class MyUI
{
    private Button b = new Button();

    public void addButtonListener(ActionListener listener) { this.b.addActionListener(listener); }
}
票数 5
EN

Stack Overflow用户

发布于 2011-05-18 03:27:46

我会使用一个JToggelButton,如here所示,或者委托给所包含的按钮,如@duffymo所建议的。如果您确实需要一个自定义的OnOffSwitchEvent,可以在EventListenerList中列出标准的连接,每个JComponent中都包含一个实例。

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

代码语言:javascript
运行
复制
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();
            }
        });
    }
}
票数 7
EN

Stack Overflow用户

发布于 2011-05-18 03:16:49

从源代码看,每个具有此ActionListener功能的Swing组件都会重新实现它自己:向列表添加侦听器,触发ActionEvents,等等。

是啊。这就是您在编写自定义Swing组件时必须做的事情。

正如您所说,您可以从现有的Swing组件复制ActionListener代码,

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6035834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档