Tristate caselle di controllo in Java

voti
11

Io ho usato realmente una casella di controllo tri-ha dichiarato in Java. Sembra una cosa semplice, ma ho visto veramente solo brutte implementazioni [Nota: link ora interrotto].

Tre pulsanti di opzione solo occupano troppo immobiliare e saranno probabilmente confusione per gli utenti nel mio caso. Si tratta fondamentalmente di una finestra di ricerca. Ho bisogno vero, falso o do not care opzioni. C'è una tecnica diversa che la gente usa?

È pubblicato 11/08/2009 alle 23:25
fonte dall'utente
In altre lingue...                            


9 risposte

voti
14

Utilizzare un menu a discesa.

Risposto il 11/08/2009 a 23:26
fonte dall'utente

voti
0

Mi basta usare quello che hai postato.

Finché la vostra complessità è in un'altra classe (che funziona) e si comporta come qualsiasi altro controllo, chi se ne frega? (Che sembra essere l'ipotesi dietro tutto swing, la maggior parte delle classi Swing sembrano essere su questo complicato.)

Risposto il 11/08/2009 a 23:55
fonte dall'utente

voti
2

Che "brutto implementazioni" è un vecchio collegamento. Uno dei suggerimenti in quella pagina è stato aggiornato un paio di anni fa. Non ho ancora testato la vecchia implementazione, in modo da non so se il nuovo è meglio o peggio.

TristateCheckBox Revisited

Risposto il 12/08/2009 a 00:57
fonte dall'utente

voti
0

Cambiare l'interfaccia utente. Tristate check-box è insolito e può davvero confondere gli utenti. La discesa è buona opzione, ma per più di una comparsa all'interno di dialogo che porterà anche un sacco di confusione per l'utente.

Risposto il 12/08/2009 a 10:28
fonte dall'utente

voti
5

Ho trovato un modo per fare una casella di controllo tri-state con la semplice aggiunta di un ascoltatore:


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

Poi nel codice dell'applicazione, è solo una sola riga:


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

Dopo tutte le risposte, io sto pensando un menu a discesa può essere una scelta migliore. Ma, ho voluto condividere il mio codice qui per tutti gli altri.

Risposto il 12/08/2009 a 18:15
fonte dall'utente

voti
2

Tri-check-box sono idioma UI standard per treeviews con nodi figli parzialmente controllato. Essi sono ampiamente utilizzati nella gestione dei layer in complesse viste gerarchiche come Google Earth.

Risposto il 30/09/2009 a 08:14
fonte dall'utente

voti
3

JIDE hanno open source alcune funzionalità molto bello nella loro livello di Comune , uno dei quali sembra essere una casella di controllo a tre stati

caselle di controllo a tre stati

Vorrei suggerire che si va eseguire il webstart demo per vedere se soddisfa le vostre esigenze

Risposto il 24/03/2012 a 12:43
fonte dall'utente

voti
4

entrare descrizione dell'immagine qui

In questa versione il tre stato può essere impostato solo tramite programmazione. Per essere Look and Feel portatile che usa le immagini, che devono essere posizionati all'interno dello stesso pacchetto Java.

entrare descrizione dell'immagine qui entrare descrizione dell'immagine qui entrare descrizione dell'immagine qui

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

struttura del campione:

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;
}
Risposto il 09/04/2013 a 10:18
fonte dall'utente

voti
4

Non so perché qualcuno dovrebbe dare le soluzioni con i file supplementari icona png mentre API Java dà grande funcionality per sovrascrivendo il metodo paintIcon (..).

La migliore soluzione leggera per ricordare lo stato CheckBox è IMO ClientProperty attributo.

entrare descrizione dell'immagine qui

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

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

Risposto il 05/11/2014 a 04:03
fonte dall'utente

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