我有一个jTextfield,我必须从jList获取输入。在FocusGained属性上,jList应该出现在jTextfield的正下方,并且jList应该在FocusLost属性上消失。我做了一些编码,但我遇到了问题。在FocusGained属性中,jList会出现,但是在点击它时,它会转到其他jTextfield的背面,该jTextfield位于上一个文本字段的下方。 以下是我的代码:
private void txtAccountFocusGained(java.awt.event.FocusEvent evt) {
jScrollPane3.setLocation(txtAccount.getX(), txtAccount.getY()+txtAccount.getHeight());
jScrollPane3.setVisible(true); //scrollpane associated with list
listAccount.setVisible(true); //listAccount is jList
}
private void listAccountMouseClicked(java.awt.event.MouseEvent evt) {
txtAccount.setText((String)listAccount.getSelectedValue());
jScrollPane3.setVisible(false); //scrollpane associated with list
txtSalesLedger.requestFocus(); //it is next field
}
答案 0 :(得分:1)
使用JComboBox
代替JTextField
。
您可以致电JComboBox.setEditable( true )
,然后JComboBox
会有一个编辑器JTextField
。正是您想要的,用户可以输入任何文本,但也可以使用箭头图标打开列表框。此外,您可以通过调用JComboBox.showPopup()
自动显示列表。如果将焦点侦听器添加到JComboBox的编辑器文本字段,则还可以在用户单击文本字段时显示该弹出窗口。可以使用箭头图标关闭弹出列表。
以下是示例代码:
final JComboBox comboBox = new JComboBox(
new Object[] { "", "Item #1", "Another item", "Something else" } );
comboBox.setEditable( true );
comboBox.getEditor().getEditorComponent().addFocusListener( new FocusAdapter() {
@Override
public void focusGained( final FocusEvent event ) {
comboBox.showPopup();
}
} );
注意:组合框的第一项是空字符串。我添加了这个,以便组合框的编辑器文本字段最初不会显示任何值。如果你想要一个初始值,你可以删除它。