- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想通过组合几个现有组件来创建一个(希望是简单的)自定义 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
的任何实现都更加灵活。
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/
在另一个 ActionListener 中嵌入一个 ActionListener 更好,还是将它们作为单独的 ActionListener 更好?我有 JComboBox1、JComboBox2 和
我为我的程序制作了一个面板。它仅由 RadioButtons 组成。选择单选按钮后,我想在其他代码中设置一个 boolean 值。此面板将用作更大面板或框架的组件,该面板或框架也应该能够监听此面板内发
我想知道(如果可能的话)如何更新 JButton 的 ActionListener 执行的操作。我需要在整个程序中保留一个按钮,但根据当前情况更改它的功能。 最佳答案 首先使用removeAction
我的程序的先前版本旨在显示多个系列的魔术图像,所有这些图像都使用相同类型的 ActionListener。例如,在显示每幅图像之间设置时间的所有技巧时,我通过使用扩展 ActionListener 的
也许我做错了。让我知道使用 Swing 和 AWT,我在框架上设置了几个按钮,每个按钮都有一个与其特定功能 I.E 相对应的 ActionListener。 JButton foo_button =
我想把第一个ActionListener(About)改成第二个ActionListener(About2)如果不将第一个复制到第二个,有什么办法可以做到这一点吗? About.addActionLi
我想在单击按钮 b 后检查选中了哪些复选框,但是我的复选框是在我单击按钮 b1 之后声明的 我的意思是,我应该全局声明 checkbox[] 吗?我该怎么做? b1.addActionListener
我有一个这样的方法,它被赋予一个 JButton 数组,并在它们被按下时返回它们的文本: public static String foo(JButton[] buttons) { for (
这个问题在这里已经有了答案: Detect enter press in JTextField (10 个答案) 关闭 7 年前。 我有一个具有三个功能的程序;读取文件、写入文件以及在文件中搜索特定
我有一个 actionlistener,当我单击一个按钮时触发,让我们称之为框,我有另一个 actionlistener 用于另一个按钮调用它重新启动。我想要做的是,当我单击一个框按钮时,除了在该 a
我正在想办法如何让一个类(class)听另一个类(class)的课。这就是我们的想法。 我有一个 MainFrame 类,它只是一个容器类,即 JFrame 容器,它采用 JPanel 类型的参数。基
实现 java.awt.event.ActionListener 接口(interface)的最佳方法是什么? 让您的类实现 ActionListener 并将其添加为 ActionListener:
我有一个框架(此处名为“MainApplication”),它主要有一个 JPanel 来根据上下文显示信息。 启动时,MainApplication 有一个空的 JPanel。 然后它创建一个“Lo
我发现已经有人提出了一些关于这个主题的问题,但我还没有找到答案。我正在编写一个代码,其中用户在 JTextField 中键入内容,然后单击按钮后,他的单词将被替换为与他的单词具有相同数量的字符数的星号
我将稍微解释一下我的代码: 我有一个带有项目列表的 JComboBox当按下 JButton“Select”时,它会注册 JComboBox 中最后一个选定项目的最后一个索引。 现在我需要访问主目录中
我收到错误,“AbstractButton 类型中的方法 addActionListener(ActionListener) 不适用于此代码的参数 (new ActionListener(){})”:
哪种方式实现 ActionListener 更正确?性能上有什么重大差异吗? 在类中实现 ActionListener: public class MainFrame implements Actio
在 Java 中,我对 JButton 数组使用 ActionListener。我希望 ActionListener 的较早部分将新的 ImageIcon 设置为 JButton,该更改将立即显示,然
这里有新海报;如果我违反了任何规则/搞砸了任何事情,请告诉我,我会删除该帖子。 我有一个 MainMenu JFrame,里面有一个 JPanel (mainMenu)。 mainMenu 有一个按钮
我在一个主类中有两个 Action Listener 内部类。每一个都对应于它自己的按钮。其中一个 Action 监听器被编码为生成数组列表。另一个只是将该数组列表写入文本字段。 我的问题是如何从其他
我是一名优秀的程序员,十分优秀!