Selectievakjes in Java

stemmen
11

Ik kon echt gebruik maken van een-tri vermeld checkbox in Java. Het klinkt als een simpel ding, maar ik heb alleen gezien echt lelijk implementaties [note: koppeling nu gebroken].

Drie radio knoppen nemen gewoon te veel onroerend goed en zal waarschijnlijk worden verwarrend zijn voor de gebruikers in mijn geval. Het is eigenlijk voor een zoekvenster. Ik moet true, false of do not care opties. Is er een andere techniek die mensen gebruiken?

De vraag is gesteld op 11/08/2009 om 23:25
bron van user
In andere talen...                            


9 antwoorden

stemmen
14

Gebruik een drop-down.

antwoordde op 11/08/2009 om 23:26
bron van user

stemmen
0

Ik zou gewoon gebruik maken van de één u op de hoogte.

Zolang uw complexiteit in een andere klasse (dat werkt) en het werkt net als elke andere controle, who cares? (Dat lijkt de veronderstelling achter al swing, de meeste swing lessen lijken te zijn over deze ingewikkelde.)

antwoordde op 11/08/2009 om 23:55
bron van user

stemmen
2

Dat "lelijke implementaties" is een oude link. Een van de suggesties op die pagina werd een paar jaar geleden bijgewerkt. Ik heb niet de oude uitvoering getest, dus ik weet niet of de nieuwe is beter of slechter.

TristateCheckBox Revisited

antwoordde op 12/08/2009 om 00:57
bron van user

stemmen
0

Verander de gebruikersinterface. Tristate check-box is ongebruikelijk en kan echt verwarren gebruikers. De drop-down is een goede optie, maar voor meer dan een gebeurtenis in het dialoogvenster het zal ook leiden tot een veel verwarring gebruiker.

antwoordde op 12/08/2009 om 10:28
bron van user

stemmen
5

Ik vond een manier om een ​​checkbox tri-state te maken door het toevoegen van een luisteraar:


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

Dan in de applicatie code, het is gewoon een enkele regel:


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

Nadat alle feedback, denk ik een drop-down kan een betere keuze zijn. Maar, ik wilde mijn code hier delen voor iedereen.

antwoordde op 12/08/2009 om 18:15
bron van user

stemmen
2

Tristate check-boxen zijn standaard UI idioom voor treeviews met gedeeltelijk gecontroleerd kindnodes. Ze worden veel gebruikt in lagenbeheer in complexe hiërarchische uitzicht zoals Google Earth.

antwoordde op 30/09/2009 om 08:14
bron van user

stemmen
3

Jide hebben open source een aantal zeer mooie functionaliteit in hun gemeenschappelijke Layer , een van die toevallig ook een tristate checkbox zijn

selectievakjes

Ik stel voor dat je gaat lopen de webstart demo te zien of het voldoet aan uw behoeften

antwoordde op 24/03/2012 om 12:43
bron van user

stemmen
4

voer image beschrijving hier

In deze implementatie kan de drie staat alleen worden ingesteld via programmatisch. Om Look and Feel draagbare gebruiken beelden, die in de dezelfde java-pakket moet worden geplaatst.

voer image beschrijving hier voer image beschrijving hier voer image beschrijving hier

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

Monsterframe:

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;
}
antwoordde op 09/04/2013 om 10:18
bron van user

stemmen
4

Ik weet niet waarom iemand de oplossingen met dossiers extra pictogram png zou geven, terwijl Java API geeft grote funcionality voor dwingende paintIcon methode (..).

De beste lichtgewicht oplossing om CheckBox toestand onthouden is IMO ClientProperty attribuut.

voer image beschrijving hier

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

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

antwoordde op 05/11/2014 om 04:03
bron van user

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