Tristate avmerkingsboksene i Java

stemmer
11

Jeg kunne virkelig bruke en tri-fremgår boksen i Java. Det høres ut som en enkel ting, men jeg har bare sett virkelig stygge implementeringer [Merk: Link nå brutt].

Tre radioknapper bare ta opp for mye fast eiendom, og vil trolig være forvirrende for brukerne i mitt tilfelle. Det er i utgangspunktet for et søk dialog. Jeg trenger sann, usann eller ikke bryr seg alternativer. Er det en annen teknikk som folk bruker?

Publisert på 11/08/2009 klokken 22:25
kilden bruker
På andre språk...                            


9 svar

stemmer
14

Bruk en rullegardinmenyen.

Svarte 11/08/2009 kl. 22:26
kilden bruker

stemmer
0

Jeg vil bare bruke den du postet.

Så lenge din kompleksitet er i en annen klasse (som fungerer), og det fungerer akkurat som enhver annen kontroll, hvem bryr seg? (Det synes å være forutsetningen bak alle swing, de fleste swing klasser synes å være om dette komplisert.)

Svarte 11/08/2009 kl. 22:55
kilden bruker

stemmer
2

At "stygge implementeringer" er en gammel link. Ett av forslagene på den siden ble oppdatert et par år siden. Jeg har ikke testet den gamle gjennomføringen, så jeg vet ikke om den nye er noe bedre eller verre.

TristateCheckBox Revisited

Svarte 11/08/2009 kl. 23:57
kilden bruker

stemmer
0

Endre brukergrensesnittet. Tristate check-box er uvanlig og kan virkelig forvirre brukerne. Rullegardin er godt alternativ, men for mer enn én forekomst innenfor dialogen vil det også gi mye forvirring for brukeren.

Svarte 12/08/2009 kl. 09:28
kilden bruker

stemmer
5

Jeg har funnet en måte å gjøre en tri-state boksen ved å legge en lytter:


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

Deretter i applikasjonskoden, det er bare en enkelt linje:


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

Etter alle tilbakemeldinger, jeg tenker en drop-down kan være et bedre valg. Men, jeg ønsket å dele min kode her for alle andre.

Svarte 12/08/2009 kl. 17:15
kilden bruker

stemmer
2

Tredelt avmerkingsboksene er standard UI idiom for treeviews med delvis sjekket barn noder. De er mye brukt i lag i komplekse hierarkiske visninger som Google Earth.

Svarte 30/09/2009 kl. 07:14
kilden bruker

stemmer
3

Jide har åpent hentet noen veldig fin funksjonalitet i deres felles lag , hvorav skjer for å være en tristate avkrysnings

Tredelt boksene

Jeg foreslår at du går kjører WebStart demo for å se om det oppfyller dine behov

Svarte 24/03/2012 kl. 11:43
kilden bruker

stemmer
4

skriv bildebeskrivelse her

I denne implementeringen tre tilstand kan bare settes via programmatisk. Å være Utseende bærbar den bruke bilder, som må plasseres inne i det samme java-pakken.

skriv bildebeskrivelse her skriv bildebeskrivelse her skriv bildebeskrivelse her

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

Prøve ramme:

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;
}
Svarte 09/04/2013 kl. 09:18
kilden bruker

stemmer
4

Jeg vet ikke hvorfor noen skulle gi løsninger med ekstra ikon png filer mens Java API gir stor funksjonaliteten for å overstyre paintIcon (..) metoden.

Den beste lett løsning å huske avmerkingsbokser staten er IMO ClientProperty attributt.

skriv bildebeskrivelse her

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

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

Svarte 05/11/2014 kl. 04:03
kilden bruker

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