2015-08-19 82 views
1

請問,我該如何從JComboBox中用戶選擇的內容中自動出現一些JTextField? 我的例子很簡單。我的箱子裏有一個JComboBox,有一些操作。根據用戶從此JComboBox中選擇的內容,我出現一個或多個JTextField。自動出現JTextField

我有這樣的代碼:

public static void main(String[] args) { 

    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      CalculatriceFenetre fenetre = new CalculatriceFenetre(); 
      fenetre.setVisible(true); 
     } 
    }); 
} 

public class CalculatriceFenetre extends JFrame { 

    private JTextField field1, field2; 
    private JComboBox liste; 

    public CalculatriceFenetre() { 
     super(); 

     build(); 
    } 

    private void build() { 
     setTitle("Calculatrice"); 
     setSize(400, 200); 
     setLocationRelativeTo(null); 
     setResizable(false); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setContentPane(buildContentPane()); 
    } 

    private JPanel buildContentPane() { 
     JPanel panel = new JPanel(); 
     panel.setLayout(new FlowLayout()); 
     panel.setBackground(Color.white); 

     field1 = new JTextField(); 
     field1.setColumns(10); 

     field2 = new JTextField(); 
     field2.setColumns(10); 
     field2.setVisible(false); 

     panel.add(field1); 
     panel.add(field2); 

     liste = new JComboBox(new OperateursModel()); 
     liste.addActionListener(new CustomActionListener()); 
     panel.add(liste); 

     return panel; 
    } 

    class CustomActionListener implements ActionListener { 

     public void actionPerformed(ActionEvent e) { 
      if (liste.getSelectedItem().equals("op1")) { 
       field2.setVisible(true); 
      } 
     } 
    } 

public class OperateursModel extends DefaultComboBoxModel { 
private ArrayList<String> operateurs; 

public OperateursModel(){ 
    super(); 
    operateurs = new ArrayList<String>(); 
    operateurs.add("op1"); 

} 

public String getSelectedOperateur(){ 
    return (String)getSelectedItem(); 
} 

@Override 
public Object getElementAt(int index) { 
    return operateurs.get(index); 
} 

@Override 
public int getSize() { 
    return operateurs.size(); 
} 

@Override 
public int getIndexOf(Object element) { 
    return operateurs.indexOf(element); 
    } 
} 
+0

爲什麼不只是創建所需的所有JtextField,並且在組合框選擇上,將JTextField的可見性設置爲true/false?除非您需要滿足任意數量的JTextFields,否則這種方法更容易。 – user3437460

+0

這是我做的。我設置了我的JTextField的可見性,但它不起作用 – Mehdi

+0

您是否在代碼中添加了調試語句來驗證ActionEvent是否發生?模型中只有一個元素(爲什麼還在使用自定義模型?),我不確定是否可以重新選擇相同的項目。 – camickr

回答

2

就像我提到的,這是一個簡單的方法來解決你的問題。首先創建所需的所有JTextField,並切換其可見性,而不是在運行時刪除和添加它。

enter image description here

import java.util.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

class DynamicTextFieldsApp 
{ 
    public static void main(String[] args){ 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      JFrame f = new JFrame("JTextField Toggler"); 
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      f.setVisible(true); 
      f.add(new DisplayPanel()); 
      f.pack(); 
      f.setLocationRelativeTo(null); 
     }}); 
    } 
} 

一個簡單的JPanel與組合框和幾個JTextField的。

class DisplayPanel extends JPanel 
{ 
    public static final int PLAYERS = 5; 
    private JComboBox cmbPlayerNumber; 
    private JTextField[] txtPlayerName; 
    private JLabel lblPlayerNumber; 

    public DisplayPanel(){ 
     setPreferredSize(new Dimension(170, 240)); 
     createComponents(); 
     initComponents(); 
     loadComponents(); 
     setBoundsForComponents();  
    } 

    private void createComponents(){ 
     cmbPlayerNumber = new JComboBox(new String[]{"1", "2", "3", "4", "5"}); 
     txtPlayerName = new JTextField[PLAYERS]; 
     lblPlayerNumber = new JLabel("Num of Players");  
    } 

    private void initComponents(){ 
     for(int x=0; x<PLAYERS; x++){ 
      txtPlayerName[x] = new JTextField("No Name " + (x+1)); 
      txtPlayerName[x].setVisible(false);  
     } 
     cmbPlayerNumber.setSelectedIndex(-1); 
     cmbPlayerNumber.addActionListener(new CmbListener());  
    } 

    private void loadComponents(){ 
     add(cmbPlayerNumber); 
     add(lblPlayerNumber); 
     for(int x=0; x<PLAYERS; x++) 
      add(txtPlayerName[x]);   
    } 

    private void setBoundsForComponents(){ 
     setLayout(null); 
     lblPlayerNumber.setBounds(10, 0, 150, 30);   
     cmbPlayerNumber.setBounds(10, 30, 150, 30); 
     for(int x=0; x<PLAYERS; x++) 
      txtPlayerName[x].setBounds(10, (30*x)+70, 150, 30); 
    } 

    private class CmbListener implements ActionListener 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
      int numOfPlayers = cmbPlayerNumber.getSelectedIndex() + 1; 
      for(int x=0; x<numOfPlayers; x++) 
       txtPlayerName[x].setVisible(true); 
      for(int x=numOfPlayers; x<PLAYERS; x++){ 
       txtPlayerName[x].setVisible(false);    
       txtPlayerName[x].setText("No name " + (x+1));     
      }    
     } 
    }     
} 

當然,您可以使用一些佈局管理器而不是空佈局。

3

而這取決於用戶從到此JComboBox的選擇,我會出現一個或一個以上的JTextField。

然後,您可以編寫一個ActionListener來處理從組合框中選擇項目。

您可以從Swing教程How to Use a Combo Box中的部分開始,查看使用ActionListener的工作示例。

你的情況,你想一個文本字段添加到框架,使代碼將是這樣的:

JTextField textField = new JTextField(10); 
frame.add(textField); 
frame.revalidate(); 
frame.repaint(); 

而且,也沒有必要爲你創建一個自定義ComboBoxModel。您可以將項目添加到默認模型。再次,該教程將告訴你如何做到這一點。

+0

我編輯了我的問題。我用ActionListener出現filed2。在ActionListener之前,我設置了filed2(false)的可見性,並在ActionListener之後將可見性設置爲(true)。 – Mehdi