2016-01-15 46 views
1

我有一些JRadioButtonsButtonGroup。这些都在一个容器内,并且组中还有其他项目。每当我选择按钮组时,焦点总是转到组中的第一项。但是,我宁愿去选择的项目。获取焦点在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); 
} 

回答

1

你也许能够使用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); 
    }); 
    } 
} 
+0

我可以发誓,我已在尝试类似的东西有一点,并不能得到它的工作。您的解决方案效果非常好!那谢谢啦! – Pixelstix

相关问题