Java 创建包含JTextFields的可编辑JList

Java 创建包含JTextFields的可编辑JList,java,jtextfield,jlist,Java,Jtextfield,Jlist,我想创建可编辑的JList。这是我的示例代码: package okienko; import java.awt.EventQueue; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.De

我想创建可编辑的
JList
。这是我的示例代码:

package okienko;

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;

class Frane extends JFrame {

    private JPanel contentPane;
    private JList<String> list;
    private JLabel lblLabel;
    private DefaultListModel<String> model;


    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            public void run() {
                try {
                    Frane frame = new Frane();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }


    public Frane() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        GridBagLayout gbl_contentPane = new GridBagLayout();
        gbl_contentPane.columnWidths = new int[]{0, 0};
        gbl_contentPane.rowHeights = new int[]{0, 0, 0};
        gbl_contentPane.columnWeights = new double[]{1.0, Double.MIN_VALUE};
        gbl_contentPane.rowWeights = new double[]{0.0, 1.0, Double.MIN_VALUE};
        contentPane.setLayout(gbl_contentPane);

        lblLabel = new JLabel("LABEL");
        GridBagConstraints gbc_lblLabel = new GridBagConstraints();
        gbc_lblLabel.insets = new Insets(0, 0, 5, 0);
        gbc_lblLabel.gridx = 0;
        gbc_lblLabel.gridy = 0;
        contentPane.add(lblLabel, gbc_lblLabel);

        JScrollPane scrollPane = new JScrollPane();
        GridBagConstraints gbc_scrollPane = new GridBagConstraints();
        gbc_scrollPane.fill = GridBagConstraints.BOTH;
        gbc_scrollPane.gridx = 0;
        gbc_scrollPane.gridy = 1;
        contentPane.add(scrollPane, gbc_scrollPane);

        model = new DefaultListModel<String>();
        list = new JList<String>(model);
        JTextField field = new JTextField("TEXT");
        field.setEditable(true);
        model.addElement(field.getText());

        scrollPane.setViewportView(list);
        list.addKeyListener(new KeyListener() {

            @Override
            public void keyTyped(KeyEvent e) {
            }

            @Override
            public void keyReleased(KeyEvent e) {
            }

            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getExtendedKeyCode() == 10) {
                    JTextField tf = new JTextField("A");
                    model.addElement(tf.getText());
                }
            }
        });
    }

}
包okienko;
导入java.awt.EventQueue;
导入java.awt.GridBagConstraints;
导入java.awt.GridBagLayout;
导入java.awt.Insets;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入javax.swing.DefaultListModel;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JList;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTextField;
导入javax.swing.border.EmptyBorder;
类Frane扩展了JFrame{
私有JPanel内容窗格;
私人名单;
私人JLabel-lblLabel;
私有模型;
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
公开募捐{
试一试{
Frane帧=新Frane();
frame.setVisible(true);
}捕获(例外e){
e、 printStackTrace();
}
}
});
}
公共场所(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
立根(100100450300);
contentPane=newjpanel();
setboorder(新的EmptyBorder(5,5,5,5));
setContentPane(contentPane);
GridBagLayout gbl_contentPane=新的GridBagLayout();
gbl_contentPane.columnWidths=newint[]{0,0};
gbl_contentPane.rowHeights=newint[]{0,0,0};
gbl_contentPane.columnWeights=newdouble[]{1.0,double.MIN_VALUE};
gbl_contentPane.rowWeights=newdouble[]{0.0,1.0,double.MIN_VALUE};
setLayout(gbl_contentPane);
lblLabel=新的JLabel(“标签”);
GridBagConstraints gbc_lblLabel=新的GridBagConstraints();
gbc_lblLabel.insets=新的insets(0,0,5,0);
gbc_lblLabel.gridx=0;
gbc_lblLabel.gridy=0;
contentPane.add(lblLabel,gbclbllabel);
JScrollPane scrollPane=新的JScrollPane();
GridBagConstraints gbc_scrollPane=新的GridBagConstraints();
gbc_scrollPane.fill=GridBagConstraints.BOTH;
gbc_scrollPane.gridx=0;
gbc_scrollPane.gridy=1;
添加(滚动窗格,gbc_滚动窗格);
model=新的DefaultListModel();
列表=新JList(型号);
JTextField=新的JTextField(“文本”);
字段设置为可编辑(true);
model.addElement(field.getText());
scrollPane.setViewportView(列表);
addKeyListener(新的KeyListener(){
@凌驾
public void keyTyped(KeyEvent e){
}
@凌驾
公共无效密钥已释放(密钥事件e){
}
@凌驾
按下公共无效键(按键事件e){
如果(例如getExtendedKeyCode()==10){
JTextField tf=新的JTextField(“A”);
model.addElement(tf.getText());
}
}
});
}
}
所以我想要一个
列表
,在那里我可以输入新行,每行都是一个单独的
JTextField
。我的代码创建一个
列表
,其中包含一个
文本字段
,按下
回车键后,添加
JTextField
。但它只显示传递给
JTextField
的构造函数的文本

ENTER
键后,我想编写自己的文本,再次按
ENTER
键时,我想创建一个新字段
我还想通过单击鼠标在字段之间切换并编辑这些字段。
是否可以创建此类
JList
?也许我的问题还有其他解决办法。我愿意听取建议。

当新项目(某种类型的
对象
)添加到
JList
时,将调用
对象
toString()
方法。生成的
字符串
JList
中显示为
JLabel
。因此,您不能直接将
JTextField
添加到
JList
中。因为
JTextField
toString()
不会返回任何可读信息

如果要在
JList
中添加
JTextField
s,则必须通过扩展
JList
来创建
List
类,并且必须修改它以将
JTextField
添加为项,而不是
JLabel
s。但我不认为这对你来说是一项简单的任务,而且会很混乱

执行任务的最简单方法是在
JFrame
中有一个
JTextField
,当您键入文本并按
enter
时,该文本将作为项目显示在
JLabel

要编辑项目,您可以使用另一个
JTextField
。你可以把它藏起来。当您双击
JList
中的项目时,它将可见。您可以在此处编辑文本,按enter键后,该项将被更新,
JTextField
将再次隐藏

我想这可能对你有帮助