【问题标题】:Is there a way in Java to make buttons receive focus on click by defaultJava中有没有办法让按钮默认获得点击焦点
【发布时间】:2012-09-07 08:45:35
【问题描述】:

似乎JButton 在单击时不会自动获得焦点,除非我使用.setRequestFocusEnabled(true) 明确配置按钮。我正在使用的应用程序在许多不同的地方创建了很多按钮(即不是通过工厂方法),我需要所有这些按钮在单击时请求焦点。

是否有一种简单的方法可以更改默认行为,以便按钮默认要求点击焦点,例如通过设置某些属性?或者我需要把他们全部打下来,然后在每个按钮上一一呼叫.setRequestFocusEnabled(true)

【问题讨论】:

    标签: java onclick click jbutton buttonclick


    【解决方案1】:

    JButton应该在被点击时获得焦点。您可能有已修改为不执行此操作的按钮。然而,这并不能解决你的问题。

    您可以在创建整个 UI 后更改按钮(假设 GUI 在打开时未修改) - 这样您每个帧/对话框只需要一个调用站点:

    public static class FocusHelper {
        public static void alterButtons(Component container) {
            if (component instanceof Container) {
                Component[] children = ((Container) component).getComponents();
                for (Component child : children) {
                    alterButtons(child);
                }
            } else if (component instanceof JButton) {
                ((JButton) component).setRequestFocusEnabled(true);
            }
        }
    }
    

    帮助方法只是扫描整个组件层次结构中的按钮并为每个 JButton 调用 setRequestFocusEnabled()(您可能需要检查其他组件类型,例如 AbstractButton,具体取决于您想要实现的目标)。您只需从创建 GUI 的任何位置调用该方法并传递顶级容器(JFrame、JDialog 或任何其他容器组件)。

    【讨论】:

      【解决方案2】:

      也许你可以创建一个继承自 JButton 的子类并在那里实现功能:

      public class MyJButton extends JButton {
          public MyJButton(String string, Icon icon) {
              super(string, icon);
              this.setRequestFocusEnabled(true);
          }
      
          public MyJButton(Action action) {
              super(action);
              this.setRequestFocusEnabled(true);
          }
      
          public MyJButton(String string) {
              super(string);
              this.setRequestFocusEnabled(true);
          }
      
          public MyJButton(Icon icon) {
              super(icon);
              this.setRequestFocusEnabled(true);
          }
      
          public MyJButton() {
              super();
              this.setRequestFocusEnabled(true);
          }
      }
      

      现在你必须用 MyJButton 对象替换你所有的 JButtons

      【讨论】:

      • 或者,您可以简单地覆盖 init(): @Override protected void init(String text, Icon icon) { super.init(text, icon); this.setRequestFocusEnabled(true); }。这应该有效,因为all of the JButton constructors eventually call this method.
      • 嗯,我正在寻找一种避免更换所有按钮的方法。但是如果没有这样的方法,那么肯定我将不得不更换。我想我宁愿使用工厂模式,而不是像这样子类化。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-20
      • 2021-09-16
      • 2014-10-07
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      • 2023-03-08
      相关资源
      最近更新 更多