我尝试在JTextField
内添加JFrame
。但它没有在窗口中显示。我使用以下代码将文本字段添加到框架中:
public static void main(String[] args) throws Exception {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
JFrame frame = new JFrame();
frame.setTitle("Auto Completion Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(200, 200, 500, 400);
ArrayList<String> items = new ArrayList<String>();
Locale[] locales = Locale.getAvailableLocales();
for (int i = 0; i < 100; i++) {
String item = ""+i+"item";
items.add(item);
}
JTextField txtInput = new JTextField();
setupAutoComplete(txtInput, items);
txtInput.setColumns(30);
frame.getContentPane().setLayout(new FlowLayout());
frame.getContentPane().add(txtInput, BorderLayout.NORTH);
frame.setSize(1000,700);
frame.setVisible(true);
}
我用于自动填充文字的方法如下:
private static boolean isAdjusting(JComboBox cbInput) {
if (cbInput.getClientProperty("is_adjusting") instanceof Boolean) {
return (Boolean) cbInput.getClientProperty("is_adjusting");
}
return false;
}
private static void setAdjusting(JComboBox cbInput, boolean adjusting) {
cbInput.putClientProperty("is_adjusting", adjusting);
}
public static void setupAutoComplete(final JTextField txtInput, final ArrayList<String> items) {
final DefaultComboBoxModel model = new DefaultComboBoxModel();
final JComboBox cbInput = new JComboBox(model) {
public Dimension getPreferredSize() {
return new Dimension(super.getPreferredSize().width, 0);
}
};
setAdjusting(cbInput, false);
for (String item : items) {
model.addElement(item);
}
cbInput.setSelectedItem(null);
cbInput.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (!isAdjusting(cbInput)) {
if (cbInput.getSelectedItem() != null) {
txtInput.setText(cbInput.getSelectedItem().toString());
}
}
}
});
txtInput.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
setAdjusting(cbInput, true);
if (e.getKeyCode() == KeyEvent.VK_SPACE) {
if (cbInput.isPopupVisible()) {
e.setKeyCode(KeyEvent.VK_ENTER);
}
}
if (e.getKeyCode() == KeyEvent.VK_ENTER || e.getKeyCode() == KeyEvent.VK_UP || e.getKeyCode() == KeyEvent.VK_DOWN) {
e.setSource(cbInput);
cbInput.dispatchEvent(e);
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
txtInput.setText(cbInput.getSelectedItem().toString());
cbInput.setPopupVisible(false);
}
}
if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
cbInput.setPopupVisible(false);
}
setAdjusting(cbInput, false);
}
});
txtInput.getDocument().addDocumentListener(new DocumentListener() {
public void insertUpdate(DocumentEvent e) {
updateList();
}
public void removeUpdate(DocumentEvent e) {
updateList();
}
public void changedUpdate(DocumentEvent e) {
updateList();
}
private void updateList() {
setAdjusting(cbInput, true);
model.removeAllElements();
String input = txtInput.getText();
if (!input.isEmpty()) {
for (String item : items) {
if (item.toLowerCase().startsWith(input.toLowerCase())) {
model.addElement(item);
}
}
}
cbInput.setPopupVisible(model.getSize() > 0);
setAdjusting(cbInput, false);
}
});
txtInput.setLayout(new BorderLayout());
txtInput.add(cbInput, BorderLayout.SOUTH);
}
我是java swing应用程序开发的新手。你能建议我这么做吗?
答案 0 :(得分:1)
不是将组合框添加到JTextField,而是通过向其添加面板将其添加到框架中。
删除:
frame.getContentPane().setLayout(new FlowLayout());
frame.getContentPane().add(txtInput,BorderLayout.NORTH);
为什么要将布局设置为流动并将文本字段添加为borderlayout?
向框架添加主面板:
JPanel mainapnel = new JPanel(new BorderLayout());
frame.add(mainpanel);
将JTextField添加到面板:
mainpanel.add(txtInput, BorderLayout.NORTH);
修改强>
撤消设置JTextField的布局,而不是将ComboBox添加到JTextfield,将其添加到面板:
mainpanel.add(cbInput, BorderLayout.CENTER);