Tristate pól wyboru w Java

głosy
11

I naprawdę może korzystać z Tri-zaznaczono pole wyboru w Javie. Brzmi to jak proste rzeczy, ale widziałem tylko naprawdę brzydkie implementacje [Uwaga: link teraz złamane].

Trzy przyciski radiowe właśnie zajmują zbyt dużo nieruchomości i będzie prawdopodobnie być mylące dla użytkowników w moim przypadku. Jest to w zasadzie na oknie wyszukiwania. Muszę true, false lub „nie obchodzi” opcje. Czy istnieje inna metoda, że ​​ludzie używają?

Utwórz 11/08/2009 o 23:25
źródło użytkownik
W innych językach...                            


9 odpowiedzi

głosy
14

Użyj rozwijanego.

Odpowiedział 11/08/2009 o 23:26
źródło użytkownik

głosy
0

ja po prostu korzystać jedno z nich zamieszczonych.

Tak długo, jak złożoność jest w innej klasy (które działa) i działa podobnie jak każdej innej kontroli, kogo to obchodzi? (To wydaje się być założeniem wszystkich huśtawka, huśtawka większość klas wydają się być o to skomplikowane).

Odpowiedział 11/08/2009 o 23:55
źródło użytkownik

głosy
2

Że „brzydkie” implementacje to stary związek. Jedną z sugestii na tej stronie został zaktualizowany kilka lat temu. Nie testowałem stare realizacji, więc nie wiem, czy nowy jeden jest lepszy lub gorszy.

TristateCheckBox Revisited

Odpowiedział 12/08/2009 o 00:57
źródło użytkownik

głosy
0

Zmienić UI. Tristate check-box jest naprawdę niezwykła i może mylić użytkowników. Spadek w dół jest dobrym rozwiązaniem, ale na więcej niż jednym wystąpieniu w dialog przyniesie również wiele zamieszania do użytkownika.

Odpowiedział 12/08/2009 o 10:28
źródło użytkownik

głosy
5

Znalazłem sposób dokonania wyboru Tri-State poprzez dodanie słuchacza:


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

Następnie w kodzie aplikacji, to tylko jeden wiersz:


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

Po wszystkich informacji zwrotnych, myślę rozwijane może być lepszym wyborem. Ale chciałem podzielić się moją kod tutaj wszyscy.

Odpowiedział 12/08/2009 o 18:15
źródło użytkownik

głosy
2

Trójstanowe pól wyboru są standardowe idiom UI dla treeviews z częściowo sprawdzone dzieci węzłów. Są one szeroko stosowane w zarządzaniu warstwy w złożonych hierarchicznych poglądów, takich jak Google Earth.

Odpowiedział 30/09/2009 o 08:14
źródło użytkownik

głosy
3

Jide zostały otwarte pochodzą niektóre bardzo ładne funkcjonalność w ich wspólnej warstwy , z których się składa, że tristate wyboru

Trójstanowe pola wyboru

Proponuję, żeby udać się uruchomić demo webstart aby sprawdzić, czy spełnia Twoje oczekiwania

Odpowiedział 24/03/2012 o 12:43
źródło użytkownik

głosy
4

wprowadzić opis obrazu tutaj

W tej implementacji trzech stan można ustawić tylko poprzez programowo. Być Look and Feel przenośny używać obrazów, które muszą być umieszczone wewnątrz tego samego pakietu java.

wprowadzić opis obrazu tutaj wprowadzić opis obrazu tutaj wprowadzić opis obrazu tutaj

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

Ramka próbka:

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;
}
Odpowiedział 09/04/2013 o 10:18
źródło użytkownik

głosy
4

Nie wiem, dlaczego ktoś miałby dać rozwiązania z plikami png natomiast dodatkowa ikona Java API daje dużą funkcjonalnością dla przesłanianie metody paintIcon (..).

Najlepszym rozwiązaniem, aby pamiętać, lekki stan wyboru jest IMO ClientProperty atrybut.

wprowadzić opis obrazu tutaj

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

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

Odpowiedział 05/11/2014 o 04:03
źródło użytkownik

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