Tristate en Java Checkboxes

voix
11

Je pourrais vraiment utiliser une case à cocher tri-indiqué en Java. On dirait une chose simple, mais je ne l' ai vu vraiment des implémentations laids [note: lien maintenant cassé].

Trois boutons radio prennent juste trop l'immobilier et sera probablement source de confusion pour les utilisateurs dans mon cas. Il est essentiellement une boîte de dialogue de recherche. J'ai besoin vrai, faux ou « ne se soucient pas » options. Y at-il une technique différente que les gens utilisent?

Créé 11/08/2009 à 23:25
source utilisateur
Dans d'autres langues...                            


9 réponses

voix
14

Utilisez une liste déroulante.

Créé 11/08/2009 à 23:26
source utilisateur

voix
0

Je venais d'utiliser celui que vous avez posté.

Tant que votre complexité est dans une autre classe (qui fonctionne) et il agit comme tout autre contrôle, qui se soucie? (Cela semble être l'hypothèse derrière tout swing, la plupart des classes de swing semblent être sur ce complexe.)

Créé 11/08/2009 à 23:55
source utilisateur

voix
2

Que « les mises en œuvre laid » est un ancien lien. L'une des suggestions sur cette page a été mise à jour il y a quelques années. Je ne l'ai pas testé l'ancienne implémentation, donc je ne sais pas si le nouveau est meilleur ou pire.

TristateCheckBox revisité

Créé 12/08/2009 à 00:57
source utilisateur

voix
0

Changer l'interface utilisateur. case est inhabituel et Tristate peut vraiment dérouter les utilisateurs. La baisse est en baisse bonne option, mais pour plus d'une occurrence dans ce dialogue sera également apporter beaucoup de confusion à l'utilisateur.

Créé 12/08/2009 à 10:28
source utilisateur

voix
5

J'ai trouvé un moyen de faire une case à cocher trois états en ajoutant simplement un auditeur:


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

Ensuite, dans le code de l'application, il est juste une seule ligne:


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

Après tous les commentaires, je pense une liste déroulante peut être un meilleur choix. Mais, je voulais partager mon code ici pour tout le monde.

Créé 12/08/2009 à 18:15
source utilisateur

voix
2

cases à cocher sont Tristate langage d'interface utilisateur standard pour arborescences avec partiellement vérifiés nœuds enfants. Ils sont largement utilisés dans la gestion des couches dans complexes vues hiérarchisées telles que Google Earth.

Créé 30/09/2009 à 08:14
source utilisateur

voix
3

JIDE ont ouvert le code source des fonctionnalités très agréable dans leur couche commune , l' un qui se trouve être une case à cocher trois états

cases à cocher trois états

Je suggère que vous allez exécuter la démo webstart pour voir si elle répond à vos besoins

Créé 24/03/2012 à 12:43
source utilisateur

voix
4

entrez la description d'image ici

Dans cette mise en œuvre des trois états peut être uniquement réglé par programmation. Pour être Look and Feel portable, il utilise des images qui doivent être placés à l'intérieur du même package java.

entrez la description d'image ici entrez la description d'image ici entrez la description d'image ici

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

Base de sondage:

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;
}
Créé 09/04/2013 à 10:18
source utilisateur

voix
4

Je ne sais pas pourquoi quelqu'un voudrait donner les solutions avec les fichiers d'icônes supplémentaires en java api donne une grande fonctionalité pour remplaçant méthode paintIcon (..).

La meilleure solution légère de se rappeler l' état CheckBox est l' OMI ClientProperty attribut.

entrez la description d'image ici

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

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

Créé 05/11/2014 à 04:03
source utilisateur

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