Tristate Checkboxes v Javě

hlasů
11

Mohl bych opravdu použít políčko tri-uvedeno v Javě. Zní to jako jednoduchá věc, ale viděl jsem jen opravdu ošklivé implementacích [Poznámka: odkaz teď zlomený].

Tři přepínací tlačítka prostě zabírají příliš mnoho nemovitostí a bude pravděpodobně být matoucí pro uživatele v mém případě. Je to v podstatě pro dialog vyhledávání. Musím true, false nebo do not care možnosti. Je tam jiná technika, která lidé používají?

Položena 11/08/2009 v 23:25
zdroj uživatelem
V jiných jazycích...                            


9 odpovědí

hlasů
14

Použijte rozbalovací nabídku.

Odpovězeno 11/08/2009 v 23:26
zdroj uživatelem

hlasů
0

Jen bych použít tu, kterou zaslali.

Tak dlouho, jak vaše složitost je v jiné třídě (který funguje), a to se chová stejně jako všechny ostatní kontroly, koho to zajímá? (To se zdá být předpokladem za všechny švihu, většina houpačka tříd se zdá být o to složitější.)

Odpovězeno 11/08/2009 v 23:55
zdroj uživatelem

hlasů
2

Že „ošklivé implementace“ je starý odkaz. Jedním z návrhů na této stránce byl aktualizován před pár lety. I nebyly testovány staré implementace, takže nevím, jestli ten nový je lepší nebo horší.

TristateCheckBox Revisited

Odpovězeno 12/08/2009 v 00:57
zdroj uživatelem

hlasů
0

Změna UI. Tristate check-box je neobvyklé a může skutečně zmást uživatele. Pokles dolů je dobrá volba, ale pro více než jeden výskyt v rámci dialogu to přinese i spoustu zmatku uživateli.

Odpovězeno 12/08/2009 v 10:28
zdroj uživatelem

hlasů
5

Našel jsem způsob, jak políčko tri-state pouhým přidáním posluchače:


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

Pak v kódu aplikace, je to jen jeden řádek:


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

Poté, co všechny zpětné vazby, myslím drop-down může být lepší volbou. Ale chtěl jsem se podělit můj kód zde pro všechny ostatní.

Odpovězeno 12/08/2009 v 18:15
zdroj uživatelem

hlasů
2

Tristate check-boxy jsou standardní rozhraní idiom pro treeviews s částečně kontrolovaných dětských uzlů. Oni jsou široce používány v oblasti řízení vrstvy ve složitých hierarchické zobrazení, jako je Google Earth.

Odpovězeno 30/09/2009 v 08:14
zdroj uživatelem

hlasů
3

Jide mají open source některé velmi pěkné funkce v jejich společném vrstvy , z nichž jeden se stane být tristate checkbox

tristate políčka

Navrhoval bych, že jdete spuštění WEBSTART demo aby zjistil, jestli to vyhovuje vašim potřebám

Odpovězeno 24/03/2012 v 12:43
zdroj uživatelem

hlasů
4

zadejte popis obrázku zde

V této implementaci tři stav lze nastavit pouze přes programově. Chcete-li být Vzhled a chování přenosný to pouze obrázky, které musí být umístěny uvnitř stejné java balíček.

zadejte popis obrázku zde zadejte popis obrázku zde zadejte popis obrázku zde

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

Vzorek rám:

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;
}
Odpovězeno 09/04/2013 v 10:18
zdroj uživatelem

hlasů
4

Nevím, proč by někdo dát řešení se nová ikona PNG, zatímco Java API dává velkou funcionality pro potlačení metody paintIcon (..).

Nejlepším řešením lehké si pamatovat CheckBox stav je IMO ClientProperty atribut.

zadejte popis obrázku zde

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

používání: TCheckBox tcb = new TCheckBox("My CheckBox");

Odpovězeno 05/11/2014 v 04:03
zdroj uživatelem

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