自动出现JTextField

时间:2015-08-19 18:43:18

标签: java swing jframe 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);
    }
}

2 个答案:

答案 0 :(得分:3)

  

根据用户从这个JComboBox中选择的内容,我会出现一个或多个JTextField。

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

您可以先阅读How to Use a Combo Box上的Swing教程中的部分,了解使用ActionListener的工作示例。

在您的情况下,您想要向框架添加文本字段,以便代码类似于:

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

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

答案 1 :(得分: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);
        }});
    }
}

带有comboBox和几个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));                   
            }               
        }
    }                   
}

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