自动出现 JTextField

Appear automatically JTextField

请问,我怎样才能自动显示用户在 JComboBox 中选择的一些 JTextField? 我的例子很简单。我的盒子里有一个 JComboBox,可以进行一些操作。根据用户从这个 JComboBox 中选择的内容,我会出现一个或多个 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);
    }
}

And depending on what the user choose from this JComboBox, I appear one or more JTextField.

然后你可以写一个ActionListener来处理从组合框中选择一个项目。

您可以先阅读 Swing 教程中关于 How to Use a Combo Box 的部分,了解使用 ActionListener.

的工作示例

在您的情况下,您希望向框架添加一个文本字段,因此代码类似于:

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

此外,您无需创建自定义 ComboBoxModel。您可以只将项目添加到默认模型。同样,本教程将向您展示如何执行此操作。

正如我提到的,这是解决您的问题的简单方法。首先创建您需要的所有 JTextField 并切换其可见性,而不是在 运行 时间删除和添加它。

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

带有组合框和几个 JTextField 的简单 JPanel。

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

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