Java üç durumlu Onay kutuları

oy
11

Gerçekten Java bir üç-onay kutusunu kullanabilirsiniz. Bu basit bir şey gibi geliyor, ama sadece gerçekten gördüğüm çirkin uygulamaları [not: şimdi kırık link].

Üç radyo düğmeleri sadece çok gayrimenkul almak ve muhtemelen benim durumumda kullanıcılar için kafa karıştırıcı olacak. Bir arama diyalog temelde bu. Ben seçenekleri umurumda değil false, true ihtiyaç veya. insanlar kullanmak, farklı bir teknik var mı?

Oluştur 11/08/2009 saat 23:25
kaynak kullanıcı
Diğer dillerde...                            


9 cevaplar

oy
14

Bir açılır menüyü kullanın.

Cevap 11/08/2009 saat 23:26
kaynak kullanıcı

oy
0

Sadece yayınlanmıştır birini kullanmayı tercih ediyorum.

Sürece karmaşıklığı (çalışır) başka bir sınıfta ve sadece umurunda başka kontrolü, gibi davranır olarak? (Yani, en salıncak sınıfları bu karmaşık ilgili olduklarını salıncak her arkasında varsayım gibi görünüyor.)

Cevap 11/08/2009 saat 23:55
kaynak kullanıcı

oy
2

Yani "çirkin uygulamaları" eski bağlantıdır. o sayfadaki önerilerden biri birkaç yıl önce güncellendi. Eski uygulama test etmedim, bu yüzden yenisi daha iyi ya da kötü olup olmadığını bilmiyorum.

TristateCheckBox Revisited

Cevap 12/08/2009 saat 00:57
kaynak kullanıcı

oy
0

UI değiştirin. Tristate onay kutusu sıradışı ve gerçekten kullanıcıların kafasını karıştırabilir. damla aşağı iyi bir seçenektir ancak diyalog içerisinde birden fazla olay için de kullanıcıya kargaşasına getirecektir.

Cevap 12/08/2009 saat 10:28
kaynak kullanıcı

oy
5

Ben sadece bir dinleyici ekleyerek üç-durumlu onay kutusunu yapmak için bir yol buldu:


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

Ardından uygulama kodunda, sadece tek bir çizgi var:


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

Tüm geribildirim sonra, bir açılır daha iyi bir seçim olabilir düşünüyorum. Ama herkes için buraya kodumu paylaşmak istedim.

Cevap 12/08/2009 saat 18:15
kaynak kullanıcı

oy
2

Tristate işaret kutularının kısmen kontrol çocuklar düğümlerle treeviews için standart UI deyim vardır. Çıktıkları Google Earth gibi karmaşık hiyerarşik görünümlerde katman yönetiminde kullanılmaktadır.

Cevap 30/09/2009 saat 08:14
kaynak kullanıcı

oy
3

Jide açık onların bazı çok güzel işlevsellik kaynaklı var Ortak Katman biri tristate onay kutusu olur,

durumlu onay kutuları

Seni koşarken gitmek öneririz Webstart demo gereksinimlerinizi karşılayıp karşılamadığını

Cevap 24/03/2012 saat 12:43
kaynak kullanıcı

oy
4

Burada görüntü açıklama girin

Bu uygulamada üç devlet sadece programlı aracılığıyla ayarlanabilir. olmak Bakın ve aynı java paket içerisinde yerleştirilmelidir görüntüleri kullanmak taşınabilir hissedin.

Burada görüntü açıklama girin Burada görüntü açıklama girin Burada görüntü açıklama girin

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

Örnek çerçeve:

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;
}
Cevap 09/04/2013 saat 10:18
kaynak kullanıcı

oy
4

Ben ise kimse ek simgesi png dosyaları ile çözümler verecekti nedenini bilmiyorum java API için büyük Funcionality verir basan paintIcon (..) yöntemini.

CheckBox durumunu hatırlamak iyi hafif çözüm IMO olduğunu ClientProperty özniteliği.

Burada görüntü açıklama girin

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

kullanımı: TCheckBox tcb = new TCheckBox("My CheckBox");

Cevap 05/11/2014 saat 04:03
kaynak kullanıcı

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