代码之家  ›  专栏  ›  技术社区  ›  Pixelstix

在JRadioButtons的ButtonGroup中获取焦点以转到当前选定的项目,而不是第一个

  •  1
  • Pixelstix  · 技术社区  · 10 年前

    我有一些 JRadioButtons 在一个 ButtonGroup 。这些都在容器中,组中还有其他项目。每当我点击按钮组时,焦点总是指向组中的第一项。然而,我更希望它转到选中的项目。

    要重现这个问题,请使用下面的代码(添加导入,现在忽略我懒得把它全部放在 SwingUtilities.invokeLater 呼叫)。向下选项卡到单选按钮,然后向下箭头到后面的项目之一,如蓝色。再点击4次,回到单选按钮,你会发现焦点在顶部的“红色”单选按钮上。我希望重点放在“蓝色”单选按钮上。

    public static void main(String[] args)
    {
        JFrame f = new JFrame("JRadioButton Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container parent = f.getContentPane();
        parent.setLayout(new GridBagLayout());
    
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.NORTHWEST;
        gbc.gridx = 1;
        gbc.gridy = 1;
        parent.add(new JLabel("Start"), gbc);
        gbc.gridx++;
        parent.add(new JTextField(10), gbc);
    
        gbc.gridx = 1;
        gbc.gridy++;
        parent.add(new JLabel("End"), gbc);
        gbc.gridx++;
        parent.add(new JTextField(10), gbc);
    
        gbc.gridx = 1;
        gbc.gridy++;
        parent.add(new JLabel("Colors"), gbc);
    
        gbc.gridx++;
        final Box buttons = Box.createVerticalBox();
        parent.add(buttons, gbc);
        final ButtonGroup bg = new ButtonGroup();
        for (String s : "Red,Orange,Yellow,Green,Blue,Indigo,Violet".split(","))
        {
            JRadioButton radioBtn = new JRadioButton(s);
            buttons.add(radioBtn);
            radioBtn.addItemListener(new ItemListener() {
                @Override
                public void itemStateChanged(ItemEvent e)
                {
                    System.out.printf("Itemstate changed to %s\n",
                        e.getStateChange() == ItemEvent.SELECTED ? "SELECTED" : "DESELECTED");
                }
            });
            radioBtn.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e)
                {
                    System.out.println("JRadioButton action listener");
                }
            });
            bg.add(radioBtn);
        }
    
        gbc.gridx = 1;
        gbc.gridy += 2;
        gbc.gridwidth = 2;
        final JLabel currentValue = new JLabel("none");
        parent.add(currentValue, gbc);
        gbc.gridy--;
        JButton btn = new JButton("Show Button Group Value");
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                ButtonModel selection = bg.getSelection();
                for (int i = 0; i < buttons.getComponentCount(); i++)
                {
                    JRadioButton radioBtn = (JRadioButton)buttons.getComponent(i);
                    ButtonModel loopModel = radioBtn.getModel();
                    if (loopModel == selection)
                    {
                        currentValue.setText(radioBtn.getText());
                        return;
                    }
                    currentValue.setText("none");
                }
            }
        });
        parent.add(btn, gbc);
    
        f.pack();
        f.setVisible(true);
    }
    
    2 回复  |  直到 10 年前
        1
  •  1
  •   aterai    10 年前

    您可以使用 FocusTraversalPolicy :

    buttons.setFocusTraversalPolicyProvider(true);
    buttons.setFocusTraversalPolicy(new LayoutFocusTraversalPolicy() {
      @Override public Component getDefaultComponent(Container focusCycleRoot) {
        ButtonModel selection = bg.getSelection();
        for (Component c: focusCycleRoot.getComponents()) {
          JRadioButton radioBtn = (JRadioButton) c;
          ButtonModel loopModel = radioBtn.getModel();
          if (loopModel == selection) {
            return radioBtn;
          }
        }
        return super.getDefaultComponent(focusCycleRoot);
      }
    });
    
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class ButtonGroupFocusTraversalTest {
      public JComponent makeUI() {
        JPanel parent = new JPanel(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.NORTHWEST;
        gbc.gridx = 1;
        gbc.gridy = 1;
        parent.add(new JLabel("Start"), gbc);
        gbc.gridx++;
        parent.add(new JTextField(10), gbc);
    
        gbc.gridx = 1;
        gbc.gridy++;
        parent.add(new JLabel("End"), gbc);
        gbc.gridx++;
        JTextField textField = new JTextField(10);
        parent.add(textField, gbc);
    
        gbc.gridx = 1;
        gbc.gridy++;
        parent.add(new JLabel("Colors"), gbc);
    
        gbc.gridx++;
        final Box buttons = Box.createVerticalBox();
        parent.add(buttons, gbc);
        final ButtonGroup bg = new ButtonGroup();
        for (String s : "Red,Orange,Yellow,Green,Blue,Indigo,Violet".split(",")) {
          JRadioButton radioBtn = new JRadioButton(s);
          buttons.add(radioBtn);
          bg.add(radioBtn);
        }
    
        gbc.gridx = 1;
        gbc.gridy += 2;
        gbc.gridwidth = 2;
        final JLabel currentValue = new JLabel("none");
        parent.add(currentValue, gbc);
        gbc.gridy--;
        JButton btn = new JButton("Show Button Group Value");
        parent.add(btn, gbc);
    
        buttons.setFocusTraversalPolicyProvider(true);
        buttons.setFocusTraversalPolicy(new LayoutFocusTraversalPolicy() {
          @Override public Component getDefaultComponent(Container focusCycleRoot) {
            ButtonModel selection = bg.getSelection();
            for (Component c: focusCycleRoot.getComponents()) {
              JRadioButton radioBtn = (JRadioButton) c;
              ButtonModel loopModel = radioBtn.getModel();
              if (loopModel == selection) {
                return radioBtn;
              }
            }
            return super.getDefaultComponent(focusCycleRoot);
          }
        });
        return parent;
      }
      public static void main(String... args) {
        EventQueue.invokeLater(() -> {
          JFrame f = new JFrame();
          f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
          f.getContentPane().add(new ButtonGroupFocusTraversalTest().makeUI());
          f.setSize(320, 320);
          f.setLocationRelativeTo(null);
          f.setVisible(true);
        });
      }
    }
    
        2
  •  -1
  •   Lochana Thenuwara    8 年前
        buttonGroup.setFocus(selectedRadioButton); 
    

    试试这个。这 将焦点设置为selectedRadioButton 而不是第一个