java - 检测 JSpinner 按钮事件

标签 java swing jbutton look-and-feel jspinner

我需要创建一些 JSpinner 控件,我可以在其中检测按钮按下情况,同时使用当前外观。我发现我可以很容易地做到这一点,如下所示:

class CustomSpinnerUI extends BasicSpinnerUI {
    @Override
    protected Component createNextButton() {
        // Add custom ActionListener.
    }

    @Override
    protected Component createPreviousButton() {
        // Add custom ActionListener.
    }
}

问题是,通过这样做,我最终得到了一个看起来很讨厌的微调器,它没有使用与我的其他 UI 相同的外观和感觉。我目前正在使用 Nimbus,但我需要支持不同的 L&F 配置。

我考虑过可能设置某种动态代理,但找不到任何合适的 Spinner 接口(interface)来支持我这样做。

谁能想出解决这个问题的方法?我想我要么需要在不对 BasicSpinnerUI 进行子类化的情况下访问按钮 ActionListeners,要么想办法让我的 CustomSpinnerUI 使用正确的 L&F。

编辑:“默认外观”->“当前外观”。

最佳答案

(公认的假设)问题“如何访问用于挂接自定义 actionListener 的按钮”的肮脏技术答案是遍历微调器的子级并将监听器添加到按钮,由它们的名称标识:

    JSpinner spinner = new JSpinner();
    Action action = new AbstractAction() {

        @Override
        public void actionPerformed(ActionEvent e) {
            LOG.info("button " + ((Component) e.getSource()).getName());
        }
    };
    for (Component child : spinner.getComponents()) {
        if ("Spinner.nextButton".equals(child.getName())) {
            ((JButton) child).addActionListener(action);
        }
        if ("Spinner.previousButton".equals(child.getName())) {
            ((JButton) child).addActionListener(action);
        }
    }
  • 这很脏,因为它依赖于 LAF 可能尊重也可能不尊重的未记录的实现细节:Metal,Nimbus 做; Win 没有(我认为这是一个疏忽,但那是另一回事 :-)
  • 这只是技术问题,因为从最近对该问题的评论来看,真正的问题似乎在别处

关于java - 检测 JSpinner 按钮事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7673821/

相关文章:

java - 如何从数组中删除对象

java - 默认皮肤 LibGDX?

java - 如何在标题边框周围添加空间?

java - 单击 TableRowSorter 时获取所选行中的用户对象

java - 我如何知道 JFrame 何时处于最大化状态 Java Swing

Java Swing JButton 时间延迟(闪烁)

java - 通过图形类时遇到问题

java - 从 Java hibernate Windows

Java - 如何将字符串除以数字?

java - 如何在 ActionListener 中将 .getSource() 与多个 JButton 一起使用