Java 如何设置JToggleButton的切换状态?
我已经向带有BoxLayout的JPanel添加了一些JToggleButtons。按钮已放置在按钮组中。现在,我想为当前选中的按钮切换一些属性,仅当它处于选中状态时。我在找这样的东西:Java 如何设置JToggleButton的切换状态?,java,swing,border,jtogglebutton,Java,Swing,Border,Jtogglebutton,我已经向带有BoxLayout的JPanel添加了一些JToggleButtons。按钮已放置在按钮组中。现在,我想为当前选中的按钮切换一些属性,仅当它处于选中状态时。我在找这样的东西: buttonGroup.addSomeListener(new SomeListener() { @Override public void whenToggled() { /*set attributes for button*/ } }); 具体来说,我希望所选按钮
buttonGroup.addSomeListener(new SomeListener() {
@Override
public void whenToggled() {
/*set attributes for button*/
}
});
具体来说,我希望所选按钮显示一个bevelorder.LOWERED
,而不是
button.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
我的JPanel中的按钮都有
编辑
除非我简单地将button
的类型更改为JButton
,否则此代码不会打印出“鼠标翻转”,JToggleButton如何在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);
}
}我想我的问题问得太快了。我正在寻找一个
变更监听器
。您希望将侦听器应用于按钮的按钮模型
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));
}
}
});
再说一次,我自己,我会使用一个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);
}
}
看看这个答案:
这是最简单的方法:
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");
}
}
});
我自己,我会使用Itemlistener。所以我想切换mouseOver
的效果。你还会使用ItemListener吗?@user2651804:不,那么你是对的,你需要在按钮的模型中添加一个ChangeListener。在刚刚试验button.getModel().isRollover()
时,一个简单的测试表明JToggleButtons
不触发变更事件或不侦听滚动,而正常的JButton
会吗?我对我的问题进行了编辑,询问如何使用ChangeListener来监听JToggleButton的滚动。我希望你能看看:)@user2651804:yep,请看编辑。我不确定JToggleButtons是否连接到使用滚动属性。
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");
}
}
});