Como fazer um .setFocusable(false) em um JCheckBox?
O meu não está funcionando.
Como fazer um .setFocusable(false) em um JCheckBox?
O meu não está funcionando.
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.
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;
}
}
setFocusable != setEnabledNão amigo, acho que não me expressei bem.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.
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?
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”.