JToggleButton与JButton的不同之处在于,JToggleButton包括一个按下状态,可以在按下弹起之间切换,通常用作开关按钮。
1、重构JToggleButton式样时的几种状态:
自定义JToggleButton式样时,可以想到的状态无非就是正常状态、按下状态以及鼠标悬停状态,那么在重构JToggleButton时,处理鼠标事件监听
addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
//当鼠标进入时,鼠标进入状态改为0,并重绘按钮
isMouseEntered = 0;
repaint();
super.mouseEntered(e);
}
@Override
public void mouseExited(MouseEvent e) {
//鼠标移出
isMouseEntered = 1;
repaint();
}
@Override
public void mousePressed(MouseEvent arg0) {
//鼠标按下
isMouseEntered = 2;
repaint();
}
@Override
public void mouseClicked(MouseEvent arg0) {
}
@Override
public void mouseReleased(MouseEvent e) {
//鼠标释放
isMouseEntered = 0;
repaint();
}
});
之后,通过isMouseEntered标志位处理相应的状态绘制,但此时,要注意到,绘制完状态,为什么看不到JToggleButton的按下状态呢!!
因为丢掉了一个重要状态isSelected(),mousePress状态不能标志选中状态,当鼠标释放时又弹回了正常状态,要看到按下/弹起的开关状态,需要对isSelected()也进行重新绘制
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
if (isSelected()) {
AlphaComposite composite1 = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
g2.setComposite(composite1);
drawSelectedBackground(g2, this);
}
switch(isMouseEntered) {
case 0:
...
case 1:
...
}
}
至此,JToggleButton的式样算是绘制全了,可以看到完整的一套自定义式样了。
2、给JToggleButton加ButtonGroup,对于多个JToggleButton要同时使用,但当前又只能有一个是选中状态,可以通过给这些关联的JToggleButton加一个分组,让他们处在同一个分组之中,ButtonGroup规定当前分组下的所有元素,同一时刻只能有一个是选中状态。
ButtonGroup可以很方便的控制几个Button的状态,当选中其中一个的时候,其他元素会自动把isSelected置为false,不需要额外的代码控制。