1

我已将一些 JToggleButtons 添加到带有 BoxLayout 的 JPanel。按钮已放置在 ButtonGroup 中。现在我想为当前选择的按钮切换一些属性,只有当它被选中时。我正在寻找这样的东西:

buttonGroup.addSomeListener(new SomeListener() {
    @Override
    public void whenToggled() {
        /*set attributes for button*/
    }
});

具体来说,我希望选定的按钮显示 aBevelBorder.LOWERED而不是

button.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));

我的 JPanel 中的按钮有。

编辑

button除非我简单地将类型更改为JButtonJToggleButton 如何在 changelistener 中侦听 mouseOver,否则此代码不会打印出“翻转” ?

public class Test {

   public static void main(String[] args) {

  JPanel panel = new JPanel();
  final JToggleButton button = new JToggleButton();
  button.addChangeListener(new ChangeListener() {
    @Override
    public void stateChanged(ChangeEvent arg0) {
        ButtonModel mod = button.getModel();
        if (mod.isRollover()) {
            System.out.println("rollover");
        }
    }
  });
  JFrame frame = new JFrame();
  frame.add(panel);
  panel.add(button);
  frame.setVisible(true);
  frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);

} }

4

3 回答 3

1

同样,我自己,我会使用 ItemListener。我还考虑将斜面边框与其复合边框的 Toggle 内边框结合起来,因为这会使按钮的大小更饱满。例如:

import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.*;
import javax.swing.border.*;

public class Foo {
   static CompoundBorder lowered; // = BorderFactory.createBevelBorder(BevelBorder.LOWERED);
   static CompoundBorder raised; // = BorderFactory.createBevelBorder(BevelBorder.RAISED);

   public static void main(String[] args) {

      JPanel panel = new JPanel();

      final ButtonGroup btnGrp = new ButtonGroup();
      for (int i = 0; i < 4; i++) {
         JToggleButton toggle = new JToggleButton("Toggle " + (i + 1));
         if (lowered == null) {
            CompoundBorder toggleBorder = (CompoundBorder) toggle.getBorder();
            Border toggleInside = toggleBorder.getInsideBorder();
            lowered = BorderFactory.createCompoundBorder(
                  BorderFactory.createBevelBorder(BevelBorder.LOWERED),
                  toggleInside);
            raised = BorderFactory.createCompoundBorder(
                  BorderFactory.createBevelBorder(BevelBorder.RAISED),
                  toggleInside);
         }
         toggle.setBorder(raised);
         btnGrp.add(toggle);
         panel.add(toggle);
         toggle.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent iEvt) {
               Border border = iEvt.getStateChange() == ItemEvent.SELECTED ? lowered
                     : raised;
               ((JComponent) iEvt.getSource()).setBorder(border);
            }

         });
      }

      JOptionPane.showMessageDialog(null, panel);

   }

}

是的,我同意这不起作用:

     toggle.getModel().addChangeListener(new ChangeListener() {
        @Override
        public void stateChanged(ChangeEvent evt) {
           ButtonModel model = (ButtonModel) evt.getSource();

           // this doesn't work
           if (model.isRollover()) {
              System.out.println(model.getActionCommand() + " is rolled over");
           }

           // but this does
           if (model.isSelected()) {
              System.out.println(model.getActionCommand() + " is selected");
           }
        }
     });
于 2014-04-12T04:29:07.593 回答
0

我猜我问的太快了。我正在寻找一个ChangeListener. 您想将侦听器应用于ButtonModel您的按钮。

button.getModel().addChangeListener(new ChangeListener() {
    @Override
    public void stateChanged(ChangeEvent e) {
        ButtonModel model = (ButtonModel) e.getSource();
        if (model.isSelected()) {
            button.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
        } else {
            button.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
        }
    }
});
于 2014-04-12T02:00:47.893 回答
0

查看这个答案: 获取 JToggleButton 的状态

这是最简单的方法:

JToggleButton jtb = new JToggleButton("Press Me");
jtb.addItemListener(new ItemListener() {
   public void itemStateChanged(ItemEvent ev) {
      if(ev.getStateChange()==ItemEvent.SELECTED){
        System.out.println("button is selected");
      } else if(ev.getStateChange()==ItemEvent.DESELECTED){
        System.out.println("button is not selected");
      }
   }
});
于 2017-10-30T09:00:50.593 回答