检测 JSpinner 按钮事件

发布于 2024-12-08 14:41:03 字数 724 浏览 5 评论 0原文

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

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

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

问题是,通过这样做,我最终会得到一个看起来很恶心的旋转器,它不使用与我的 UI 其余部分相同的外观和感觉。我目前正在使用 Nimbus,但我需要支持不同的 L&F 配置。

我考虑过设置某种动态代理,但找不到任何合适的 Spinner 接口来帮助我做到这一点。

有人能想办法解决这个问题吗?我想我要么需要在不子类化 BasicSpinnerUI 的情况下访问按钮 ActionListeners,要么找到一种方法让我的 CustomSpinnerUI 使用正确的 L& F。

编辑:“默认外观和感觉”-> “当前的外观和感觉”。

I need to create some JSpinner controls where I can detect the button presses, whilst using the current look and feel. I have found I can do this easily enough as follows:

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

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

The problem is that by doing this I end up with a nasty-looking spinner which doesn't use the same look and feel as the rest of my UI. I'm currently using Nimbus but I need to support different L&F configurations.

I thought about possibly setting up some sort of dynamic proxy, but couldn't find any suitable Spinner interfaces to enable me to do that.

Can anyone think of a way around the problem? I figure I either need to get at the button ActionListeners without subclassing BasicSpinnerUI, or work out a way to have my CustomSpinnerUI use the correct L&F.

Edit: "default look and feel" -> "current look and feel".

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

风尘浪孓 2024-12-15 14:41:03

对于(公认假设的)问题“如何访问用于挂钩自定义 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 没有(我认为这是一个疏忽,但这是一个不同的故事:-)
  • 它只是技术性的,因为真正的问题似乎在其他地方,从最近对该问题的评论来看

a dirty technical answer to (concededly assumed) problem "how to access the buttons for hooking-in a custom actionListener" is to loop through the spinner's children and add the listeners to the buttons, identified by their name:

    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);
        }
    }
  • that's dirty because it relies on an undocumented implementation detail which a LAF may or may not respect: Metal, Nimbus do; Win doesnt (which I consider an oversight but that's a different story :-)
  • it is technical only, as the real problem seems to be somewhere else, judging by a recent comment on the question
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文