मुझे पता है, जबकि जावा एपीआईके लिए महान funcionality देता है क्यों किसी को भी अतिरिक्त आइकन png फ़ाइलों के साथ समाधान देना होगा न पेंट आइकन (..) विधि ओवरराइडिंग।
चेकबॉक्स राज्य को याद रखने का सबसे अच्छा हल्का समाधान आईएमओ क्लाइंटप्रोपर्टी विशेषता है।
/*
* 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));
}
}
उपयोग: TCheckBox tcb = new TCheckBox("My CheckBox");
स्रोत
2014-11-05 04:03:21
+1 अच्छा विचार। यदि कोई UI घटक कोड और गैर-मानक के लिए कठिन है, तो यह उपयोगकर्ता को भी इस तरह से महसूस करेगा। पिछली बार जब आपने इस तरह से त्रि-राज्य चेकबॉक्स का उपयोग किया था? मेरे पास कभी नहीं है –
हालांकि मैं @ बायरन के बिंदु से सहमत हूं, फिर भी एक त्रि-राज्य चेक बॉक्स वास्तव में उपयोगकर्ताओं के दृष्टिकोण से काफी मानक है। –
कौन सा उपयोगकर्ता? मैं एक डेवलपर और पावर उपयोगकर्ता हूं, और मैं त्रि-राज्य चेकबॉक्स को तुच्छ जानता हूं, आमतौर पर क्योंकि यह स्पष्ट नहीं है कि तीसरा राज्य क्या है; आम तौर पर, इसका मतलब है कि कुछ विवरण आपके से छुपाए जा रहे हैं। यह एक उपयोगिता और अभिगम्यता दुःस्वप्न है। – Rob