我想创建可编辑的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());
}
}
});
}
}
所以我希望有一个list
我可以在其中输入新行,其中每行将是一个单独的JTextField
。我的代码创建了一个list
,其中包含一个textfield
,然后在按下ENTER
键之后添加了JTextField
。但它只显示传递给JTextField
的构造函数的文本。
按ENTER
键后,我想写自己的文字,当我再次按ENTER
键时,我想要创建一个新字段。
我还想通过单击鼠标在字段之间切换并编辑这些字段
是否有可能创建这种JList
?也许我的问题有其他解决方案。我愿意接受建议。
答案 0 :(得分:0)
当新项目(某种Object
)添加到JList
时,会调用Object
的{{1}}方法。结果toString()
在String
中显示为JList
。因此,您无法直接向JLabel
添加JTextField
。因为JList
toString()
不会返回任何可读信息。
如果您想在JTextField
中添加JTextField
,则必须通过扩展JList
来创建List
课程,并且您必须修改它以添加JList
{1}}作为项而不是JTextField
s。但我不认为这对你来说是一项简单的任务,而且会非常混乱......
执行任务的最简单方法是在JLabel
中设置JTextField
,当您输入文字并按JFrame
时,该文字将显示为{{enter
中的项目1}}。
要编辑项目,您可以拥有另一个JLabel
。你可以隐藏它。当您双击JTextField
中的某个项目时,它将会显示。您可以在那里编辑文本,按Enter键后,该项目将会更新,JList
将再次隐藏..
我认为这对你有帮助..