Первоначально скрытое radioButton не отображается на событии
Я пытаюсь сделать компонент видимым, когда я нажимаю на переключатель. RadioButton инициализируется скрытым в методе initComponents.
Я поставил mouseClickListener на переключатель. Это не работает, если я инициализирую radioButton скрытый. Работает, если я инициализирую его видимым (по умолчанию):
Я также попытался инициализировать в pre-post init.
Это myListeners и txtMaas инициализируется скрытым:
private void rbOgretmenMouseClicked(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
txtMaas.setVisible(true);
}
private void rbOgrenciMouseClicked(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
txtMaas.setVisible(false);
}
1 ответ
Решение
- Используйте ItemListener на вашем JRadioButton, а не MouseListener.
- После установки компонента видимым или невидимым, обязательно позвоните
revalidate()
а такжеrepaint()
в родительском контейнере, обычно JPanel, который содержит компонент, видимость которого вы изменили. Повторная проверка позволяет менеджеру компоновки контейнера переупорядочивать его компоненты, а перерисовка позволяет объекту Graphics перекрашивать контейнер и все его компоненты. - Для получения более подробной справки рассмотрите возможность создания и публикации минимального примера программы (см. Ссылку).
например,
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.*;
public class RadioFun extends JPanel {
private static final int PREF_W = 300;
private static final int PREF_H = 150;
private JRadioButton rbOgret = new JRadioButton("Ogret");
private JTextField txtMaas = new JTextField(10);
public RadioFun() {
setLayout(new FlowLayout(FlowLayout.LEADING));
add(rbOgret);
add(txtMaas);
txtMaas.setVisible(false);
rbOgret.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
rbOgretItemStateChanged(e);
}
});
}
// to make the GUI large enough
@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(PREF_W, PREF_H);
}
private void rbOgretItemStateChanged(ItemEvent e) {
boolean visible = e.getStateChange() == ItemEvent.SELECTED;
txtMaas.setVisible(visible);
// call repaint and revalidate on the holding JPanel:
revalidate();
repaint();
}
// the two methods below are to create the GUI on the Swing event thread
private static void createAndShowGui() {
JFrame frame = new JFrame("RadioFun");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new RadioFun());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}