用Java实现自动完成——我做得对吗? 算法 开始 输入城市名称-部分或完整 如果用户点击enter,则从JTextField 开始暴力搜索 如果找到匹配项,则将它们放入向量中,然后放入JList中 如果未找到匹配项,请在向量中添加字符串“未找到匹配项” 向包含结果的用户显示JWindow 停止 代码: 封装测试; 导入javax.swing.*; 导入java.awt.Dimension; 导入java.awt.event.*; 导入java.util.Vector; 公共类自动完成测试扩展了JFrame{ JTextField城市=新的JTextField(10); 字符串enteredName=null; 字符串[]城市={“新泽西州”、“新罕布什尔州”, “苏塞克斯”、“埃塞克斯”、“伦敦”、“德里”、“纽约”}; JList list=新JList(); JScrollPane=新的JScrollPane(); ResultWindow r=新的ResultWindow(); //------------------------------------------------------------------------------ 公共静态void main(字符串[]args){ 新的自动完成测试(); } //------------------------------------------------------------------------------ 公共自动完成测试(){ setLayout(新java.awt.FlowLayout()); setVisible(真); 加(城市); //添加(窗格); 包装(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); addKeyListener(新的TextHandler()); } //------------------------------------------------------------------------------ public void initiateSearch(字符串查找){ 向量匹配=新向量(); lookFor=lookFor.toLowerCase(); for(每个字符串:城市){ if(每个.contains(查找)){ 匹配项。添加(每个); System.out.println(“匹配:+每个); } } 这个。重新绘制(); 如果(匹配.size()!=0){ list.setListData(匹配项); r、 搜索结果=列表; r、 窗格=窗格; r、 初始化显示(); }否则{ 匹配项。添加(“未找到匹配项”); list.setListData(匹配项); r、 搜索结果=列表; r、 窗格=窗格; r、 初始化显示(); } } //------------------------------------------------------------------------------ 公共类ResultWindow扩展JWindow{ 公共JScrollPane; 公众查询结果; //------------------------------------------------------------------------------ 公众投票结果(){ } //------------------------------------------------------------------------------ public void initiateDisplay(){ 窗格。setViewportView(搜索结果); 添加(窗格); 包装(); this.setLocation(AutoCompleteTest.this.getX()+2, AutoCompleteTest.this.getY()+ AutoCompleteTest.this.getHeight()); //this.setPreferredSize(city.getPreferredSize()); 此.setVisible(true); } } //------------------------------------------------------------------------------ 类TextHandler实现KeyListener{ @凌驾 public void keyTyped(KeyEvent e){ } @凌驾 按下公共无效键(按键事件e){ if(r.isVisible()){ r、 setVisible(假); } 如果(例如getKeyChar()=='\n'){ initiateSearch(city.getText()); } } @凌驾 公共无效密钥已释放(密钥事件e){ } } //------------------------------------------------------------------------------ } 输出
问题 显示结果的用Java实现自动完成——我做得对吗? 算法 开始 输入城市名称-部分或完整 如果用户点击enter,则从JTextField 开始暴力搜索 如果找到匹配项,则将它们放入向量中,然后放入JList中 如果未找到匹配项,请在向量中添加字符串“未找到匹配项” 向包含结果的用户显示JWindow 停止 代码: 封装测试; 导入javax.swing.*; 导入java.awt.Dimension; 导入java.awt.event.*; 导入java.util.Vector; 公共类自动完成测试扩展了JFrame{ JTextField城市=新的JTextField(10); 字符串enteredName=null; 字符串[]城市={“新泽西州”、“新罕布什尔州”, “苏塞克斯”、“埃塞克斯”、“伦敦”、“德里”、“纽约”}; JList list=新JList(); JScrollPane=新的JScrollPane(); ResultWindow r=新的ResultWindow(); //------------------------------------------------------------------------------ 公共静态void main(字符串[]args){ 新的自动完成测试(); } //------------------------------------------------------------------------------ 公共自动完成测试(){ setLayout(新java.awt.FlowLayout()); setVisible(真); 加(城市); //添加(窗格); 包装(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); addKeyListener(新的TextHandler()); } //------------------------------------------------------------------------------ public void initiateSearch(字符串查找){ 向量匹配=新向量(); lookFor=lookFor.toLowerCase(); for(每个字符串:城市){ if(每个.contains(查找)){ 匹配项。添加(每个); System.out.println(“匹配:+每个); } } 这个。重新绘制(); 如果(匹配.size()!=0){ list.setListData(匹配项); r、 搜索结果=列表; r、 窗格=窗格; r、 初始化显示(); }否则{ 匹配项。添加(“未找到匹配项”); list.setListData(匹配项); r、 搜索结果=列表; r、 窗格=窗格; r、 初始化显示(); } } //------------------------------------------------------------------------------ 公共类ResultWindow扩展JWindow{ 公共JScrollPane; 公众查询结果; //------------------------------------------------------------------------------ 公众投票结果(){ } //------------------------------------------------------------------------------ public void initiateDisplay(){ 窗格。setViewportView(搜索结果); 添加(窗格); 包装(); this.setLocation(AutoCompleteTest.this.getX()+2, AutoCompleteTest.this.getY()+ AutoCompleteTest.this.getHeight()); //this.setPreferredSize(city.getPreferredSize()); 此.setVisible(true); } } //------------------------------------------------------------------------------ 类TextHandler实现KeyListener{ @凌驾 public void keyTyped(KeyEvent e){ } @凌驾 按下公共无效键(按键事件e){ if(r.isVisible()){ r、 setVisible(假); } 如果(例如getKeyChar()=='\n'){ initiateSearch(city.getText()); } } @凌驾 公共无效密钥已释放(密钥事件e){ } } //------------------------------------------------------------------------------ } 输出,java,swing,autocomplete,jframe,jwindow,Java,Swing,Autocomplete,Jframe,Jwindow,问题 显示结果的JWindow的大小(在JScrollPane中是JList)会根据结果而变化-如果城市名称小,JWindow小,如果城市名称大,JWindow大 我试过了所有可能的组合。我尝试使用JWindow的setPreferredDimension()、JList和JScrollPane但问题不会解决。 我希望它能与装饰过的JFrame的大小相匹配,无论发生什么 JList或JComboBox未返回正确的PreferredSize,必须设置此值,与pack()一起用于JWindow(任何
JWindow
的大小(在JScrollPane
中是JList
)会根据结果而变化-如果城市名称小,JWindow
小,如果城市名称大,JWindow
大
我试过了所有可能的组合。我尝试使用JWindow
的setPreferredDimension()
、JList
和JScrollPane
但问题不会解决。我希望它能与装饰过的
JFrame
的大小相匹配,无论发生什么
或JList
未返回正确的JComboBox
,必须设置此值,与PreferredSize
一起用于pack()
(任何更改后必须打包),或与一起使用,然后返回值JWindow
用于getPreferredScrollableViewportSize()
中的JList
JScrollPane
- 不要使用,使用(可以从系统剪贴板插入字符)用于
- 不要重新发明轮子,使用,您可以重定向/返回匹配结果到弹出窗口
- 这个想法可能很简单,你可以说
- 有一个
列
- 不带
JTableHeader
- 添加到那里(请参见教程中的代码示例)
- 然后每个步骤都完成:-),不需要其他任何操作(如果
未返回任何匹配项,则可以更改RowFilter
的JTextField
(确保测试背景
)中的弹出窗口,添加!isVisible
)setVisible
JFrame的宽度
只需如下更改initiateSearch()函数:
public void initiateSearch(String lookFor){
//add the following two statements to set the width of the list.
int newWidth = AutoCompleteTest.this.getSize().width;
list.setPreferredSize(new Dimension(newWidth, list.getPreferredSize().height));
Vector<String> matches = new Vector<String>();
lookFor = lookFor.toLowerCase();
for(String each : cities){
if(each.contains(lookFor)){
matches.add(each);
System.out.println("Match: " + each);
}
}
this.repaint();
if(matches.size()!=0){
list.setListData(matches);
r.searchResult = list;
r.pane = pane;
r.initiateDisplay();
}else{
matches.add("No Match Found");
list.setListData(matches);
r.searchResult = list;
r.pane = pane;
r.initiateDisplay();
}
}
public void initiateSearch(字符串查找){
//添加以下两条语句以设置列表的宽度。
int newWidth=AutoCompleteTest.this.getSize(
public void initiateSearch(String lookFor){
//add the following two statements to set the width of the list.
int newWidth = AutoCompleteTest.this.getSize().width;
list.setPreferredSize(new Dimension(newWidth, list.getPreferredSize().height));
Vector<String> matches = new Vector<String>();
lookFor = lookFor.toLowerCase();
for(String each : cities){
if(each.contains(lookFor)){
matches.add(each);
System.out.println("Match: " + each);
}
}
this.repaint();
if(matches.size()!=0){
list.setListData(matches);
r.searchResult = list;
r.pane = pane;
r.initiateDisplay();
}else{
matches.add("No Match Found");
list.setListData(matches);
r.searchResult = list;
r.pane = pane;
r.initiateDisplay();
}
}
public void initiateDisplay()
{
this.pane.setViewportView(this.searchResult);
this.add(this.pane);
this.pack();
this.setLocation(AutoCompleteTest.this.getX() + 2, AutoCompleteTest.this.getY()
+ AutoCompleteTest.this.getHeight());
int padding = 5;
int height = this.searchResult.getModel().getSize()
* AutoCompleteTest.this.city.getSize().height;
int windowWidth = AutoCompleteTest.this.getSize().width;
this.setSize(windowWidth, height);
this.setVisible(true);
}