Tôi không biết tại sao mọi người sẽ cung cấp những giải pháp với các tập tin thêm icon png trong khi java api cho funcionality tuyệt vời cho ghi đè phương thức paintIcon (..).
Giải pháp gọn nhẹ nhất để nhớ trạng thái CheckBox là IMO Thuộc tính ClientProperty.
/*
* Tri-state checkbox example
* @s1w_
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class TCheckBox extends JCheckBox implements Icon, ActionListener {
final static boolean MIDasSELECTED = true; //consider mid-state as selected ?
public TCheckBox() { this(""); }
public TCheckBox(String text) {
super(text);
putClientProperty("SelectionState", 0);
setIcon(this);
addActionListener(this);
}
public TCheckBox(String text, int sel) {
/* tri-state checkbox has 3 selection states:
* 0 unselected
* 1 mid-state selection
* 2 fully selected
*/
super(text, sel > 1 ? true : false);
switch (sel) {
case 2: setSelected(true);
case 1:
case 0:
putClientProperty("SelectionState", sel);
break;
default:
throw new IllegalArgumentException();
}
addActionListener(this);
setIcon(this);
}
@Override
public boolean isSelected() {
if (MIDasSELECTED && (getSelectionState() > 0)) return true;
else return super.isSelected();
}
public int getSelectionState() {
return (getClientProperty("SelectionState") != null ? (int)getClientProperty("SelectionState") :
super.isSelected() ? 2 :
0);
}
public void setSelectionState(int sel) {
switch (sel) {
case 2: setSelected(true);
break;
case 1:
case 0: setSelected(false);
break;
default: throw new IllegalArgumentException();
}
putClientProperty("SelectionState", sel);
}
final static Icon icon = UIManager.getIcon("CheckBox.icon");
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
icon.paintIcon(c, g, x, y);
if (getSelectionState() != 1) return;
int w = getIconWidth();
int h = getIconHeight();
g.setColor(c.isEnabled() ? new Color(51, 51, 51) : new Color(122, 138, 153));
g.fillRect(x+4, y+4, w-8, h-8);
if (!c.isEnabled()) return;
g.setColor(new Color(81, 81, 81));
g.drawRect(x+4, y+4, w-9, h-9);
}
@Override
public int getIconWidth() {
return icon.getIconWidth();
}
@Override
public int getIconHeight() {
return icon.getIconHeight();
}
public void actionPerformed(ActionEvent e) {
TCheckBox tcb = (TCheckBox)e.getSource();
if (tcb.getSelectionState() == 0)
tcb.setSelected(false);
tcb.putClientProperty("SelectionState", tcb.getSelectionState() == 2 ? 0 :
tcb.getSelectionState() + 1);
// test
System.out.println(">>>>IS SELECTED: "+tcb.isSelected());
System.out.println(">>>>IN MID STATE: "+(tcb.getSelectionState()==1));
}
}
sử dụng: TCheckBox tcb = new TCheckBox("My CheckBox");
Nguồn
2014-11-05 04:03:21
1 ý tưởng tốt. nếu một thành phần giao diện người dùng khó mã hóa và không chuẩn, nó cũng sẽ cảm thấy như vậy đối với người dùng. Lần cuối cùng bạn sử dụng hộp kiểm tri-state theo cách đó là khi nào? Tôi không bao giờ có. –
Mặc dù tôi đồng ý với @ byron's point, một hộp kiểm tri-state thực sự khá chuẩn từ quan điểm của người dùng. –
Người dùng nào? Tôi là một nhà phát triển và người sử dụng năng lượng, và tôi coi thường các hộp kiểm tri-bang, thường là vì nó không rõ ràng những gì nhà nước thứ ba có nghĩa là; thông thường, nó có nghĩa là một số chi tiết đang được ẩn khỏi bạn. Đó là một cơn ác mộng khả năng sử dụng và khả năng tiếp cận. – Rob