Tristate Флажки в Java

голоса
11

Я мог бы реально использовать три-заявил флажок в Java. Это звучит как простая вещь, но я только видел действительно уродливые реализаций [Примечание: ссылка в настоящее время нарушена].

Три кнопки радио просто занимают слишком много недвижимости, и, вероятно, будет сбивать с толку пользователей в моем случае. Это в основном для диалога поиска. Мне нужно истина, ложь или «не все равно» варианты. Есть ли другой метод, который люди используют?

Задан 11/08/2009 в 23:25
источник пользователем
На других языках...                            


9 ответов

голоса
14

Используйте раскрывающийся.

Ответил 11/08/2009 в 23:26
источник пользователем

голоса
0

Я бы просто использовать тот, который вы размещены.

Пока ваша сложность в другом классе (который работает), и он действует точно так же, как и любой другой элемент управления, который заботится? (Это, кажется, предположение позади все качели, большинство свинг классов, кажется, об этом сложнее.)

Ответил 11/08/2009 в 23:55
источник пользователем

голоса
2

То, что «некрасивая реализация» старая ссылка. Одно из предложений на этой странице, была обновлена ​​пару лет назад. Я не проверял старую реализацию, так что я не знаю, если новое одно лучше или хуже.

TristateCheckBox Revisited

Ответил 12/08/2009 в 00:57
источник пользователем

голоса
0

Изменение пользовательского интерфейса. Tristate флажке необычно и действительно может запутать пользователей. Выпадающий хороший вариант, но для более одного вхождения в диалоге он также принесет много путаницы пользователя.

Ответил 12/08/2009 в 10:28
источник пользователем

голоса
5

Я нашел способ сделать треся состояния флажка, просто добавив слушатель:


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

Затем в коде приложения, это только одна строка:


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

После того, как все отзывы, я думаю, выпадающие может быть лучшим выбором. Но, я хотел бы поделиться моим кодом здесь для всех остальных.

Ответил 12/08/2009 в 18:15
источник пользователем

голоса
2

Трехуровневые Флажки являются стандартной идиомой UI для Treeviews с частично проверенными дочерними узлами. Они широко используются в управлении слоями в сложных иерархических взглядах, такие как Google Earth.

Ответил 30/09/2009 в 08:14
источник пользователем

голоса
3

Jide были открыты соерсед некоторые очень хорошие функциональные возможности их общего уровня , один из которых , случается, Tristate флажок

трехуровневые флажки

Я хотел бы предложить , что вы идете запустить Webstart демо , чтобы увидеть , если она соответствует вашим потребностям

Ответил 24/03/2012 в 12:43
источник пользователем

голоса
4

введите описание изображения здесь

В этом варианте осуществления три состояния могут быть установлены только с помощью программно. Чтобы посмотреть и чувствовать себя портативный его использовать изображения, которые должны быть размещены внутри того же пакета Java.

введите описание изображения здесь введите описание изображения здесь введите описание изображения здесь

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

Пример кадра:

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;
}
Ответил 09/04/2013 в 10:18
источник пользователем

голоса
4

Я не знаю , почему кто - то дадут решения с дополнительными иконками в формате PNG файлов в то время как Java API дает большую funcionality для переопределения метода PaintIcon (..).

Лучшее легкое решение помнить CheckBox состояние ИМО ClientProperty атрибут.

введите описание изображения здесь

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

Применение: TCheckBox tcb = new TCheckBox("My CheckBox");

Ответил 05/11/2014 в 04:03
источник пользователем

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