문제

I've added some JToggleButtons to a JPanel with a BoxLayout. The buttons have been placed in a ButtonGroup. Now I want to toggle some attributes for the currently selected button, only while it is selected. I'm looking for something like this:

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

Specifically I want selected buttons to display a BevelBorder.LOWERED as opposed to the

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

that the buttons in my JPanel have.

EDIT

this code doesn't print out "rollover" unless I simply change the type of button to JButton How can a JToggleButton listen for mouseOver in a changelistener?

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);

} }

도움이 되었습니까?

해결책

Again, myself, I'd use an ItemListener. I'd also consider combining the beveled border with Toggle's inside border of its compound border as this will make the button fuller in size. For example:

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);

   }

}

Yep, I agree that this does not work:

     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");
           }
        }
     });

다른 팁

Guess I asked my question too fast. I was looking for a ChangeListener. You want to apply the listener to the ButtonModel of your button.

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));
        }
    }
});

Check out this answer : Getting the state of JToggleButton

This is the simplest way to do it :

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");
      }
   }
});
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top