Reputation: 1614
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);
} }
Upvotes: 1
Views: 2498
Reputation: 2508
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");
}
}
});
Upvotes: 0
Reputation: 285403
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");
}
}
});
Upvotes: 1
Reputation: 1614
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));
}
}
});
Upvotes: 0