2009-08-11 8 views
11

मैं वास्तव में जावा में एक त्रि-निर्दिष्ट चेकबॉक्स का उपयोग कर सकता हूं। यह एक साधारण चीज़ की तरह लगता है, लेकिन मैंने केवल ugly implementations देखा है [नोट: लिंक अब टूटा हुआ]।जावा में ट्रिस्टेट चेकबॉक्स

तीन रेडियो बटन बस बहुत अधिक रियल एस्टेट लेते हैं और शायद मेरे मामले में उपयोगकर्ताओं के लिए भ्रमित हो जाएंगे। यह मूल रूप से एक खोज संवाद के लिए है। मुझे सच, झूठी या "परवाह नहीं है" विकल्पों की ज़रूरत है। क्या कोई अलग तकनीक है जो लोग उपयोग करते हैं?

उत्तर

5

मैं बस एक श्रोता को जोड़कर एक त्रिकोणीय राज्य चेकबॉक्स बनाने के लिए एक रास्ता मिल गया:


jCheckBox1.addActionListener(new TriStateActionListener(getResourceMap().getIcon("TriStateIcon"))); 

सब के बाद:


public class TriStateActionListener implements ActionListener{ 
    final protected Icon icon; 

    public TriStateActionListener(Icon icon){ 
     this.icon=icon; 
    } 

    public static Boolean getState(javax.swing.JCheckBox cb){ 
     if (cb.getIcon()==null) return null; 
     if (cb.isSelected()) return true; 
     else return false; 
    } 

    public void actionPerformed(ActionEvent e) { 
     javax.swing.JCheckBox cb=(javax.swing.JCheckBox)e.getSource(); 
     if (!cb.isSelected()){ 
      cb.setIcon(icon); 
     } 
     else if (cb.getIcon()!=null){ 
      cb.setIcon(null); 
      cb.setSelected(false); 
     } 
    } 
} 
फिर आवेदन कोड में

, यह सिर्फ एक पंक्ति है फीडबैक, मुझे लगता है कि एक ड्रॉप-डाउन बेहतर विकल्प हो सकता है। लेकिन, मैं अपने कोड को हर किसी के लिए यहां साझा करना चाहता था।

14

ड्रॉप-डाउन का उपयोग करें।

+1

+1 अच्छा विचार। यदि कोई UI घटक कोड और गैर-मानक के लिए कठिन है, तो यह उपयोगकर्ता को भी इस तरह से महसूस करेगा। पिछली बार जब आपने इस तरह से त्रि-राज्य चेकबॉक्स का उपयोग किया था? मेरे पास कभी नहीं है –

+8

हालांकि मैं @ बायरन के बिंदु से सहमत हूं, फिर भी एक त्रि-राज्य चेक बॉक्स वास्तव में उपयोगकर्ताओं के दृष्टिकोण से काफी मानक है। –

+5

कौन सा उपयोगकर्ता? मैं एक डेवलपर और पावर उपयोगकर्ता हूं, और मैं त्रि-राज्य चेकबॉक्स को तुच्छ जानता हूं, आमतौर पर क्योंकि यह स्पष्ट नहीं है कि तीसरा राज्य क्या है; आम तौर पर, इसका मतलब है कि कुछ विवरण आपके से छुपाए जा रहे हैं। यह एक उपयोगिता और अभिगम्यता दुःस्वप्न है। – Rob

0

मैं बस आपके द्वारा पोस्ट किए गए एक का उपयोग करता हूं।

जब तक आपकी जटिलता किसी अन्य वर्ग (जो काम करती है) में होती है और यह किसी भी अन्य नियंत्रण की तरह कार्य करती है, जो परवाह करता है? (ऐसा लगता है कि स्विंग के पीछे यह धारणा है, ज्यादातर स्विंग वर्ग इस जटिल के बारे में प्रतीत होते हैं।)

2

कि "बदसूरत कार्यान्वयन" एक पुराना लिंक है। उस पृष्ठ पर दिए गए सुझावों में से एक को कुछ साल पहले अपडेट किया गया था। मैंने पुराने कार्यान्वयन का परीक्षण नहीं किया है, इसलिए मुझे नहीं पता कि नया कोई बेहतर या बुरा है या नहीं।

TristateCheckBox Revisited

+0

हां, मुझे लगता है कि हेनज़ कबाब ने यह बहुत अच्छा किया। मैं यह भी सिफारिश करता हूं! – codevour

0

बदलें यूआई। ट्रिस्टेट चेक-बॉक्स असामान्य है और वास्तव में उपयोगकर्ताओं को भ्रमित कर सकता है। ड्रॉप डाउन अच्छा विकल्प है लेकिन अधिक के लिए संवाद के भीतर एक घटना यह उपयोगकर्ता को बहुत भ्रम लाएगी।

2

ट्रिस्टेट चेक-बॉक्स आंशिक रूप से चेक किए गए बच्चों के नोड्स के साथ ट्रीव्यू के लिए मानक यूआई मुहावरे हैं। वे Google धरती जैसे जटिल पदानुक्रमित दृश्यों में परत प्रबंधन में व्यापक रूप से उपयोग किए जाते हैं।

3

Jide खुला उनके Common Layer में कुछ बहुत अच्छी कार्यक्षमता sourced है, जिनमें से एक एक त्रिकोणीय राज्य चेकबॉक्स होने वाला

Tristate checkboxes

मुझे लगता है कि आप webstart demo चलाने जाने को देखने के लिए अगर यह अपनी आवश्यकताओं को पूरा सुझाव है

4

enter image description here

इस कार्यान्वयन तीन राज्य केवल प्रोग्राम के रूप में के माध्यम से स्थापित किया जा सकता में

। पोर्टेबल महसूस करने और महसूस करने के लिए यह छवियों का उपयोग करें, जो एक ही जावा पैकेज के अंदर रखा जाना चाहिए।

enter image description here enter image description here enter image description here

public class TristateCheckBox extends JCheckBox { 

    private static final long serialVersionUID = 1L; 
    private boolean halfState; 
    private static Icon selected = new javax.swing.ImageIcon(TristateCheckBox.class.getResource("selected.png")); 
    private static Icon unselected = new javax.swing.ImageIcon(TristateCheckBox.class.getResource("unselected.png")); 
    private static Icon halfselected = new javax.swing.ImageIcon(TristateCheckBox.class.getResource("halfselected.png")); 

    @Override 
    public void paint(Graphics g) { 
     if (isSelected()) { 
      halfState = false; 
     } 
     setIcon(halfState ? halfselected : isSelected() ? selected : unselected); 
     super.paint(g); 
    } 

    public boolean isHalfSelected() { 
     return halfState; 
    } 

    public void setHalfSelected(boolean halfState) { 
     this.halfState = halfState; 
     if (halfState) { 
      setSelected(false); 
      repaint(); 
     } 
    } 
} 

नमूना फ्रेम:

public class NewJFrame19 extends javax.swing.JFrame { 

    private final TristateCheckBox myCheckBox; 

    public NewJFrame19() { 
     myCheckBox = new TristateCheckBox(); 
     myCheckBox.setText("123123"); 
     add(myCheckBox); 

     jButton1 = new javax.swing.JButton(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     getContentPane().setLayout(new java.awt.FlowLayout()); 

     jButton1.setText("jButton1"); 
     jButton1.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       jButton1ActionPerformed(evt); 
      } 
     }); 
     getContentPane().add(jButton1); 

     pack(); 
    } 

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
     myCheckBox.setHalfSelected(true); 
    }           

    public static void main(String args[]) { 

     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Windows".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException ex) { 
      java.util.logging.Logger.getLogger(NewJFrame19.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(NewJFrame19.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(NewJFrame19.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(NewJFrame19.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 
     /* Create and display the form */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new NewJFrame19().setVisible(true); 
      } 
     }); 
    } 
    private javax.swing.JButton jButton1; 
} 
+1

हमने इस दृष्टिकोण का उपयोग चेकबॉक्स के लिए किया था जो ऑन/ऑफ स्टेटस के एकत्रीकरण को दर्शाता है। इंटरैक्शन सभी चालू/बंद टॉगल करता है, मध्यवर्ती राज्य केवल व्यक्तिगत तत्वों के साथ बातचीत के माध्यम से पहुंच योग्य होता है। काफी अच्छी तरह से काम करता है और मुझे लगता है कि यूआई डिज़ाइन के मामले में यह अधिक ध्वनि है। –

3

मुझे पता है, जबकि जावा एपीआईके लिए महान funcionality देता है क्यों किसी को भी अतिरिक्त आइकन png फ़ाइलों के साथ समाधान देना होगा न पेंट आइकन (..) विधि ओवरराइडिंग।

चेकबॉक्स राज्य को याद रखने का सबसे अच्छा हल्का समाधान आईएमओ क्लाइंटप्रोपर्टी विशेषता है।

enter image description here

/* 
* 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");

संबंधित मुद्दे