Tristate Checkboxes în Java

voturi
11

Aș putea folosi într - adevăr o casetă de selectare a declarat-tri în Java. Se pare ca un lucru simplu, dar am văzut doar într - adevăr implementări urâte [Nota: link acum rupt].

Trei butoane radio doar să ia prea mult imobiliare și va fi, probabil, confuz pentru utilizatorii în cazul meu. Este practic un dialog de căutare. Am nevoie de adevărat, fals sau „nu-mi pasă“ opțiuni. Există o tehnică diferită pe care oamenii folosesc?

Întrebat 11/08/2009 la 23:25
sursa de către utilizator
În alte limbi...                            


9 răspunsuri

voturi
14

Utilizați o drop-down.

Publicat 11/08/2009 la 23:26
sursa de către utilizator

voturi
0

Mi-ar folosi doar cel pe care îl postat.

Atâta timp cât complexitatea dumneavoastră este într-o altă clasă (care funcționează) și acționează la fel ca orice alt control, cui îi pasă? (Aceasta pare să fie ipoteza în spatele tuturor swing, cele mai multe clase de leagăn par să fie despre acest complicat.)

Publicat 11/08/2009 la 23:55
sursa de către utilizator

voturi
2

Că „implementări urât“ este un link vechi. Una dintre sugestiile de pe acea pagina a fost actualizat cu câțiva ani în urmă. Nu am testat punerea în aplicare vechi, așa că nu știu dacă cel nou este mai bine sau mai rău.

TristateCheckBox Revisited

Publicat 12/08/2009 la 00:57
sursa de către utilizator

voturi
0

Modificarea interfeței de utilizare. Tristate de check-box este neobișnuită și poate confunda cu adevărat utilizatori. Drop-down este bună opțiune, dar pentru mai mult de un eveniment din cadrul de dialog va aduce, de asemenea, o mulțime de confuzie pentru utilizator.

Publicat 12/08/2009 la 10:28
sursa de către utilizator

voturi
5

Am găsit o modalitate de a face o casetă de selectare tri-stat pur și simplu prin adăugarea unui ascultător:


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);
        }
    }
}

Apoi, în codul de aplicație, este doar o singură linie:


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

După toate feedback-ul, mă gândesc drop-down poate fi o alegere mai bună. Dar, am vrut să împărtășesc codul meu aici pentru toți ceilalți.

Publicat 12/08/2009 la 18:15
sursa de către utilizator

voturi
2

Tristate check-cutii sunt standard idiom UI pentru treeviews cu noduri parțial verificate pentru copii. Ele sunt utilizate pe scară largă în managementul strat în vederi complexe, cum ar fi Google ierarhică Earth.

Publicat 30/09/2009 la 08:14
sursa de către utilizator

voturi
3

Jide au deschis surse unele funcționalități foarte frumos în lor Layer comune , dintre care una se întâmplă să fie o casetă de selectare tristate

casetele de selectare tristate

Aș sugera că te duci executați demo WebStart pentru a vedea dacă îndeplinește nevoile dvs.

Publicat 24/03/2012 la 12:43
sursa de către utilizator

voturi
4

introduceți descrierea imaginii aici

În această punere în aplicare trei de stat poate fi setat numai prin intermediul programatic. Pentru a fi Look and feel portabil folosi imagini, care trebuie să fie plasate în interiorul aceluiași pachet java.

introduceți descrierea imaginii aici introduceți descrierea imaginii aici introduceți descrierea imaginii aici

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();
        }
    }
}

Cadru eșantion:

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;
}
Publicat 09/04/2013 la 10:18
sursa de către utilizator

voturi
4

Nu știu de ce cineva ar da soluțiile cu fișiere icon suplimentare în timp ce png Java api oferă o mare de functionalitati imperative paintIcon metoda (..).

Cea mai bună soluție ușor de reținut CheckBox de stat este OMI ClientProperty atribut.

introduceți descrierea imaginii aici

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

utilizare: TCheckBox tcb = new TCheckBox("My CheckBox");

Publicat 05/11/2014 la 04:03
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more