Como fazer um .setFocusable(false) em um JCheckBox?

5 respostas
J

Como fazer um .setFocusable(false) em um JCheckBox?

O meu não está funcionando.

5 Respostas

E

setFocusable != setEnabled

No seu caso você está confundindo as coisas. Pelo que imagino você quer desabilitar completamente o JCheckBox, não?

Quando você dá um setFocusable(false) em um JCheckBox, você ainda consegue ticar ou limpar o JCheckBox com o mouse, mas não consegue jogar o foco nele com as teclas TAB ou então ticar ou limpar com a tecla Espaço. Ou seja, só faz metade do que você provavelmente está querendo.

E

Fiz um exemplo bobo que chama setFocusable(false) no JCheckBox chkBox002 (o segundo checkbox) se você clicar o botão “Set Nonfocusable”. Veja o que ocorre, para entender qual o seu problema.

package guj;

import javax.swing.SwingUtilities;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JFrame;
import java.awt.GridBagLayout;
import javax.swing.JCheckBox;
import java.awt.GridBagConstraints;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import java.awt.FlowLayout;

public class ExemploCheckbox extends JFrame {

    private static final long serialVersionUID = 1L;
    private JPanel jContentPane = null;
    private JPanel pnlCheckboxes = null;
    private JCheckBox chkBox001 = null;
    private JCheckBox chkBox002 = null;
    private JCheckBox chkBox003 = null;
    private JCheckBox chkBox004 = null;
    private JPanel pnlBotoes = null;
    private JButton btnSetFocusable = null;
    private JButton btnSetNonfocusable = null;

    private JPanel getPnlCheckboxes() {
        if (pnlCheckboxes == null) {
            pnlCheckboxes = new JPanel();
            pnlCheckboxes.setLayout(new BoxLayout(getPnlCheckboxes(), BoxLayout.Y_AXIS));
            pnlCheckboxes.add(getChkBox001(), null);
            pnlCheckboxes.add(getChkBox002(), null);
            pnlCheckboxes.add(getChkBox003(), null);
            pnlCheckboxes.add(getChkBox004(), null);
        }
        return pnlCheckboxes;
    }

    private JCheckBox getChkBox001() {
        if (chkBox001 == null) {
            chkBox001 = new JCheckBox();
            chkBox001.setText("Checkbox 001");
        }
        return chkBox001;
    }

    private JCheckBox getChkBox002() {
        if (chkBox002 == null) {
            chkBox002 = new JCheckBox();
            chkBox002.setText("Checkbox 002");
        }
        return chkBox002;
    }

    private JCheckBox getChkBox003() {
        if (chkBox003 == null) {
            chkBox003 = new JCheckBox();
            chkBox003.setText("Checkbox 003");
        }
        return chkBox003;
    }

    private JCheckBox getChkBox004() {
        if (chkBox004 == null) {
            chkBox004 = new JCheckBox();
            chkBox004.setText("Checkbox 004");
        }
        return chkBox004;
    }

    private JPanel getPnlBotoes() {
        if (pnlBotoes == null) {
            pnlBotoes = new JPanel();
            pnlBotoes.setLayout(new FlowLayout());
            pnlBotoes.add(getBtnSetFocusable(), null);
            pnlBotoes.add(getBtnSetNonfocusable(), null);
        }
        return pnlBotoes;
    }

    private JButton getBtnSetFocusable() {
        if (btnSetFocusable == null) {
            btnSetFocusable = new JButton();
            btnSetFocusable.setText("Set Focusable");
            btnSetFocusable.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent e) {
                    chkBox002.setFocusable(true);
                }
            });
        }
        return btnSetFocusable;
    }

    private JButton getBtnSetNonfocusable() {
        if (btnSetNonfocusable == null) {
            btnSetNonfocusable = new JButton();
            btnSetNonfocusable.setText("Set Nonfocusable");
            btnSetNonfocusable.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent e) {
                    chkBox002.setFocusable(false);
                }
            });
        }
        return btnSetNonfocusable;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                ExemploCheckbox thisClass = new ExemploCheckbox();
                thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                thisClass.setVisible(true);
            }
        });
    }

    public ExemploCheckbox() {
        super();
        initialize();
    }

    private void initialize() {
        this.setSize(300, 200);
        this.setContentPane(getJContentPane());
        this.setTitle("Exemplo JCheckBox non-Focusable");
    }

    private JPanel getJContentPane() {
        if (jContentPane == null) {
            jContentPane = new JPanel();
            jContentPane.setLayout(new BorderLayout());
            jContentPane.add(getPnlCheckboxes(), BorderLayout.CENTER);
            jContentPane.add(getPnlBotoes(), BorderLayout.SOUTH);
        }
        return jContentPane;
    }
}
J

entanglement:
setFocusable != setEnabled

No seu caso você está confundindo as coisas. Pelo que imagino você quer desabilitar completamente o JCheckBox, não?

Quando você dá um setFocusable(false) em um JCheckBox, você ainda consegue ticar ou limpar o JCheckBox com o mouse, mas não consegue jogar o foco nele com as teclas TAB ou então ticar ou limpar com a tecla Espaço. Ou seja, só faz metade do que você provavelmente está querendo.

Não amigo, acho que não me expressei bem.
Eu não quero desabilitar, quero que fique habilitado, porém não quero que receba o foco nunca.

E

Então rode o programa que postei acima. Você vai ver que o checkbox, com setFocusable(false), fica habilitado direitinho (tanto é que que você pode marcá-lo e desmarcá-lo, já que ele está habilitado), mas nunca recebe o foco. OK?

E

De qualquer maneira, dá para fazer uma gambiarra dos infernos. Crie mais um botão no programa acima. Ele faria algo como:

boolean force;

    private JButton getBtnSetNonFocusableReadOnly() {
        if (btnSetNonFocusableReadOnly == null) {
            btnSetNonFocusableReadOnly = new JButton();
            btnSetNonFocusableReadOnly.setText("Set Nonfocusable and Read Only");
            btnSetNonFocusableReadOnly.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent e) {
                    force = chkBox002.isSelected();
                    chkBox002.setFocusable(false);
                    chkBox002.getModel().addChangeListener(new ChangeListener() {
                        @Override
                        public void stateChanged(ChangeEvent arg0) {
                            chkBox002.setSelected(force);
                        }
                    });
                }
            });
        }
        return btnSetNonFocusableReadOnly;
    }

(Ou seja, você põe um ChangeListener que fica amarrado nesse CheckBox. Se algo tentar mudar o valor (por exemplo, um clique de mouse, ou então alguma ação do programa), esse change listener força o checkbox para assumir o valor da variável “force”.

Criado 16 de dezembro de 2010
Ultima resposta 16 de dez. de 2010
Respostas 5
Participantes 2