Java - сделать jCheckBox недоступным для проверки или наоборот, не отключая его

Я делаю проект для своего класса, и у меня следующая ситуация: это JDialog, который получает объект в конструкторе для работы с ним. Объект «Альбом» имеет два атрибута, которые могут принимать значения 0 или 1 в соответствии с логическим значением MySQL. Когда окно инициализируется, оно проверяет состояние этих двух атрибутов. Если один из них установлен в 1, соответствующий jCheckBox проверяется. В противном случае (случай 0) он остается непроверенным, и то же самое для второго атрибута.

Что я хочу получить, так это сделать два jCheckBox нередактируемыми, не отключая их, то есть они по-прежнему выглядят как «включенные», но если вы нажмете, ничего не произойдет, потому что я не хочу, чтобы они выглядели серыми как отключенные.

Я пробовал несколько вещей, таких как создание потока, который постоянно проверяет состояние флажков, и если он не установлен в атрибуте альбома, он меняет его на правильное состояние, но это не работает, вы можете установить или снять оба флажка как желанный.

Что я мог сделать?

Вот что у меня пока есть.

public class JDVerAlbum extends javax.swing.JDialog {

    /**
     * Creates new form JDVerAlbum
     */
    Album a;
    /**
     * 
     * @deprecated 
     */
    public JDVerAlbum(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
    }

    public JDVerAlbum(java.awt.Frame parent, boolean modal, Album a) {
        super(parent, modal);
        this.a=a;
        initComponents();
        inicializar();
    }

    private void inicializar(){
        Statement stm = Controlador.connect();
        String s = null;
        try {
            ResultSet rs = stm.executeQuery("SELECT grupo.nombre from album, grupo where album.nombre='"+a.getName()+"' and album.idgrupo=grupo.id;");
            rs.next();
            s = rs.getString(1);
        } catch (SQLException ex) {
            Logger.getLogger(JDVerAlbum.class.getName()).log(Level.SEVERE, null, ex);
        }

        jLabelAlbum.setText(a.getName()+" - "+s);
        this.setTitle("Quaver Records - Ver álbum - "+jLabelAlbum.getText());
        jTextFieldAño.setText(""+a.getReleaseYear());
        jTextFieldTipo.setText(""+a.getType());
        if(a.getPhysicalSales()==1){
            jCheckBoxFisica.setSelected(true);
        }
        if(a.getDigitalSales()==1){
            jCheckBoxDigital.setSelected(true);
        }
    }

person Pedro Adame    schedule 10.05.2014    source источник
comment
Это должен быть флажок? Как насчет ярлыка, поскольку они не редактируются?   -  person kuporific    schedule 10.05.2014
comment
Это не обязательно, но было бы здорово, поскольку графический интерфейс выглядит следующим образом: prntscr.com/3hztky   -  person Pedro Adame    schedule 10.05.2014


Ответы (1)


Вы можете удалить MouseListener, который есть у JCheckBox, который дает ему такое поведение:

 JCheckBox checkBox = new JCheckBox("Check Box");
 EventListener[] listeners = checkBox.getListeners(MouseListener.class);
 for (EventListener eventListener : listeners) {
     checkBox.removeMouseListener((MouseListener) eventListener);
 }

Также рассмотрите возможность установки для свойства focusable JCheckBox значения false:

checkBox.setFocusable(false);

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

person Hovercraft Full Of Eels    schedule 10.05.2014
comment
Спасибо, удаление MouseListener из CheckBox сработало, так как установка setFocusable() в false не помогла. :) - person Pedro Adame; 10.05.2014
comment
@ user3623998: вы не понимаете, я рекомендую вам использовать оба, если вы действительно хотите отключить флажок от взаимодействия с пользователем, но при этом разрешить его установку / снятие с помощью программы. Если вы оставите его доступным для фокуса, а пользователь перейдет к нему, он сможет отметить его и снять отметку, нажав клавишу пробела. - person Hovercraft Full Of Eels; 10.05.2014
comment
Правда, пробовал. Я использую оба метода сейчас. Еще раз спасибо! - person Pedro Adame; 10.05.2014