Tristate πλαίσια ελέγχου σε Java

ψήφοι
11

Θα μπορούσα πραγματικά να χρησιμοποιήσετε ένα tri-δήλωσε πλαίσιο ελέγχου σε Java. Ακούγεται σαν ένα απλό πράγμα, αλλά έχω δει μόνο πραγματικά άσχημο υλοποιήσεις [σημείωση: σύνδεση τώρα σπασμένα].

Τρία κουμπιά επιλογής μόνο καταλαμβάνουν πολύ ακινήτων και κατά πάσα πιθανότητα θα προκαλέσει σύγχυση για τους χρήστες στη δική μου περίπτωση. Είναι βασικά για ένα διάλογο αναζήτησης. Χρειάζομαι αλήθεια, ψευδείς ή «δεν με νοιάζει» επιλογές. Είναι μια διαφορετική τεχνική που χρησιμοποιούν οι άνθρωποι εκεί;

Δημοσιεύθηκε 11/08/2009 στις 23:25
πηγή χρήστη
Σε άλλες γλώσσες...                            


9 απαντήσεις

ψήφοι
14

Χρησιμοποιήστε ένα drop-down.

Απαντήθηκε 11/08/2009 στις 23:26
πηγή χρήστη

ψήφοι
0

Θα χρησιμοποιήσετε μόνο το ένα που δημοσιεύτηκε.

Εφ 'όσον η πολυπλοκότητα σας είναι σε άλλη κατηγορία (που λειτουργεί) και ενεργεί ακριβώς όπως και κάθε άλλο έλεγχο, ποιος νοιάζεται; (Αυτό φαίνεται να είναι η παραδοχή πίσω από όλα swing, τα περισσότερα μαθήματα swing φαίνεται να είναι σχετικά με αυτό το περίπλοκο.)

Απαντήθηκε 11/08/2009 στις 23:55
πηγή χρήστη

ψήφοι
2

Αυτό το «άσχημο εφαρμογές» είναι ένα παλιό σύνδεσμο. Μία από τις προτάσεις σε αυτή τη σελίδα ενημερώθηκε μερικά χρόνια πριν. Δεν το έχω δοκιμάσει την παλιά εφαρμογή, οπότε δεν ξέρω αν ο νέος είναι καθόλου καλύτερα ή χειρότερα.

TristateCheckBox Revisited

Απαντήθηκε 12/08/2009 στις 00:57
πηγή χρήστη

ψήφοι
0

Αλλάξτε το UI. 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

Tristate το check-κουτιά είναι πρότυπο UI ιδίωμα για Treeviews με εν μέρει ελέγχεται κόμβους παιδιά. Χρησιμοποιούνται ευρέως στη διαχείριση στρώμα στο συγκρότημα ιεραρχική απόψεις, όπως το Google Earth.

Απαντήθηκε 30/09/2009 στις 08:14
πηγή χρήστη

ψήφοι
3

Jide έχουν ανοιχτές προέρχονται μερικά πολύ ωραία λειτουργικότητα τους κοινή Layer , ένα από τα οποία συμβαίνει να είναι ένα tristate πλαίσιο ελέγχου

tristate πλαίσια ελέγχου

Θα ήθελα να προτείνω να πάτε τρέξει το demo 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