Java 将相关文本显示为JTextfield中的字母
我正在用java编写代码,当我在JTextField中输入一些字母时,相关的项目应该从我的数据库中选取,并显示在下拉菜单/列表中。以下是我正在使用的代码,但存在一个问题:Java 将相关文本显示为JTextfield中的字母,java,Java,我正在用java编写代码,当我在JTextField中输入一些字母时,相关的项目应该从我的数据库中选取,并显示在下拉菜单/列表中。以下是我正在使用的代码,但存在一个问题: package rough2; import java.awt.*; import javafx.scene.input.KeyEvent; import java.awt.event.KeyListener; import javax.swing.*; public cl
package rough2;
import java.awt.*;
import javafx.scene.input.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;
public class Rough2 extends JFrame{
public static final int MAXITEMS = 100;
JPanel panel = new JPanel();
JTextField textField = new JTextField(10);
String[] myDataBase = { "Alice", "Bob", "Rose", "Coggu", "Alpha", "david","peter", "max" };
String[] listItems;
JList theList = new JList();
public Rough2() {
this.add(panel);
panel.setPreferredSize(new Dimension(500, 300));
panel.add(textField);
panel.add(theList);
textField.addKeyListener(new KeyListener() {
@Override
public void keyTyped(java.awt.event.KeyEvent e) {
String compareString = ("" + textField.getText()+ e.getKeyChar());
listItems = new String[MAXITEMS];
if (compareString.trim().length() > 0 ){
int counter = 0;
for (int i = 0; i < myDataBase.length; i++) {
if (counter < MAXITEMS) {
if (myDataBase[i].length() >= compareString.length() &&
myDataBase[i].substring(0, compareString.length()).equalsIgnoreCase(compareString)) {
listItems[counter] = myDataBase[i];
counter++;
}
}
}
}
theList.setListData(listItems);
}
@Override
public void keyPressed(java.awt.event.KeyEvent e) {
}
@Override
public void keyReleased(java.awt.event.KeyEvent e) {
}
});
}
public static void main(String[] args) {
// TODO code application logic here
final Rough2 answer = new Rough2();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
answer.pack();
answer.setVisible(true);
}
});
}
}
2;
导入java.awt.*;
导入javafx.scene.input.KeyEvent;
导入java.awt.event.KeyListener;
导入javax.swing.*;
公共类2扩展了JFrame{
公共静态最终整数最大项=100;
JPanel面板=新的JPanel();
JTextField textField=新的JTextField(10);
字符串[]myDataBase={“Alice”、“Bob”、“Rose”、“Coggu”、“Alpha”、“david”、“peter”、“max”};
字符串[]列表项;
JList theList=新JList();
公共服务2(){
本条添加(面板);
面板。设置首选尺寸(新尺寸(500300));
panel.add(textField);
面板。添加(列表);
addKeyListener(新的KeyListener(){
@凌驾
public void keyTyped(java.awt.event.KeyEvent e){
字符串比较字符串=(“”+textField.getText()+e.getKeyChar());
listItems=新字符串[MAXITEMS];
如果(compareString.trim().length()>0){
int计数器=0;
for(int i=0;i=compareString.length()&&
myDataBase[i]。子字符串(0,compareString.length())。equalsIgnoreCase(compareString)){
listItems[counter]=myDataBase[i];
计数器++;
}
}
}
}
setListData(列表项);
}
@凌驾
按下public void键(java.awt.event.KeyEvent e){
}
@凌驾
public void keyereleased(java.awt.event.KeyEvent e){
}
});
}
公共静态void main(字符串[]args){
//此处的TODO代码应用程序逻辑
最终粗选2答案=新粗选2();
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
答案:pack();
回答:setVisible(true);
}
});
}
}
问题是结果显示在列表中,而不是我想要的文本字段下的下拉菜单中
还有一个问题。那就是当我写假设“Al”找到结果时,它会给我“Alice”作为结果,但一旦我从“Al”中删除“l”,它就不会显示任何内容。所有的结果或输出都消失了,或者换句话说,我得到了一个空白列表
请帮我解决这两个问题:
代码中的两个问题是:
delete
键),以从比较中排除public class Rough2 extends JFrame{
public static final int MAXITEMS = 100;
JPanel panel = new JPanel(new BorderLayout()); // You should use a layout on the panel for the textfield and the list
JTextField textField = new JTextField(5);
String[] myDataBase = { "Alice", "Bob", "Rose", "Coggu", "Alpha", "david","peter", "max" };
String[] listItems;
JList theList = new JList();
public Rough2() {
this.add(panel);
panel.setPreferredSize(new Dimension(500, 300));
panel.add(textField, BorderLayout.NORTH); // you should add the components using the layout
panel.add(theList, BorderLayout.WEST); // added using the layout also
textField.addKeyListener(new KeyListener() {
@Override
public void keyTyped(java.awt.event.KeyEvent e) {
char newChar = e.getKeyChar();
String compareString = "";
if (isAsciiPrintable(newChar)) { //you should check if the key that triggered the event is a printable character
compareString = ("" + textField.getText() + newChar); // add the character if it's printable
}
else {
compareString = ("" + textField.getText()); // do not add it if it's not printable
}
System.out.println(compareString);
listItems = new String[MAXITEMS];
if (compareString.trim().length() > 0 ){
int counter = 0;
for (int i = 0; i < myDataBase.length; i++) {
if (counter < MAXITEMS) {
if (myDataBase[i].length() >= compareString.length() &&
myDataBase[i].substring(0, compareString.length()).equalsIgnoreCase(compareString)) {
listItems[counter] = myDataBase[i];
counter++;
}
}
}
}
theList.setListData(listItems);
}
@Override
public void keyPressed(java.awt.event.KeyEvent e) {
}
@Override
public void keyReleased(java.awt.event.KeyEvent e) {
}
});
}
public static boolean isAsciiPrintable(char ch) {
return ch >= 32 && ch < 127;
}
public static void main(String[] args) {
// TODO code application logic here
final Rough2 answer = new Rough2();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
answer.pack();
answer.setVisible(true);
}
});
}
}
祝你好运 是的,这适用于删除字符,但适用于1。我想说的是,我想把相关的单词显示为文本字段中的字母,比如GoogleWorks。当您在搜索字段中写入一些字母时,它会显示相关单词。此外,我不想使用“JList”,因为我想在文本字段下方添加一些组件,如按钮,如果我使用“JList”,它将向左或向右移动这些组件的位置,但我希望它们位于相同的位置,与谷歌搜索字段和按钮的工作原理相同。@MaqsoodAhmad请在您的问题上添加额外的说明。您可以检查这个问题以获得更好的筛选示例:,当然,您可以通过以下
CustomComboxDemo
来使用任何面板更新您的下拉条目:是的,我已经看到了链接,但它们是关于JComboBox的,我想使用JTextField进行更新。换句话说,我希望得到与JComboBox相同的结果,如链接()所示,但使用JTextField.@MaqsoodAhmad检查我编辑的答案和我添加的第二个代码示例。干杯。可能是你在寻找自动完成?
import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Arrays;
import java.util.List;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
public class Rough4 extends JFrame {
Popup pop;
JTextField mainTxt;
List<String> options;
DefaultListModel model;
JList l;
String[] myDataBase = { "Alice", "Bob", "Rose", "Coggu", "Alpha", "david","peter", "max" };
Rough4() {
options = Arrays.asList(myDataBase);
mainTxt = new JTextField();
mainTxt.setPreferredSize(new Dimension(100,20));
mainTxt.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
char newChar = e.getKeyChar();
if (isAsciiPrintable(newChar)) {
csearch(mainTxt.getText()+newChar);
}
else {
csearch(mainTxt.getText());
}
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
});
JPanel panel = new JPanel();
panel.add(mainTxt);
this.add(panel);
this.setPreferredSize(new Dimension(500,500));
PopupFactory factory= PopupFactory.getSharedInstance();
int x=200;
int y=30;
model = new DefaultListModel();
l = new JList(model);
l.setOpaque(true);
l.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e)
{
if(l.getSelectedIndex()!=-1)
{
mainTxt.setText((String)l.getSelectedValue());
}
}
});
pop = factory.getPopup(mainTxt,l,x+5,y+30);
this.pack();
this.setVisible(true);
}
public boolean isAsciiPrintable(char ch) {
return ch >= 32 && ch < 127;
}
public void csearch(String letter) {
model.removeAllElements();
for (String option: options) {
if (option.toLowerCase().startsWith(letter.toLowerCase())) {
model.addElement(option);
}
}
l.setModel(model);
pop.show();
}
public final static void main(String[] args) {
Rough4 r = new Rough4();
}
}