2015-10-20 39 views
1

我試圖在單擊單選按鈕時使組件可見。 RadioButton初始化隱藏在initComponents方法中。最初隱藏的radioButton不會在事件中可見

我已經把一個mouseClickListener放在單選按鈕上。如果我初始化隱藏的radioButton它不起作用。工作,如果我初始化它可見(默認):

look at this

我也試圖在崗前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
  1. 使用你的一個JRadioButton,而不是一個MouseListener的一個ItemListener。
  2. 將組件設置爲可見或不可見之後,請確保在父容器(通常爲JPanel)上調用revalidate()repaint(),該容器包含已更改其可見性的組件。重新驗證允許容器的佈局管理器重新佈局其組件,重繪允許Graphics對象重新繪製容器及其所有組件。
  3. 如需更詳細的幫助,請考慮創建併發布minimal example program(請查看鏈接)。

例如,

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(); 
      } 
     }); 
    } 
}