11

アルゴリズム

  1. 始める
  2. 都市名を入力してください - 部分的または完全
  3. ユーザーが Enter キーを押した場合、テキストを取得しますJTextField
  4. 総当たり検索を開始します。
  5. 一致が見つかった場合は、それらを aVectorに入れ、それをa に入れますJList
  6. String一致するものが見つからない場合は、 「一致が見つかりません」を追加しますVector
  7. JWindow結果を含むユーザーへの 表示
  8. 止まる

コード:

package test;
import javax.swing.*;

import java.awt.Dimension;
import java.awt.event.*;
import java.util.Vector;

public class AutoCompleteTest extends JFrame{
    JTextField city = new JTextField(10);
    String enteredName = null;
    String[] cities = {"new jersey","new hampshire",
            "sussex","essex","london","delhi","new york"};
    JList list = new JList();
    JScrollPane pane = new JScrollPane();
    ResultWindow r = new ResultWindow();
//------------------------------------------------------------------------------
    public static void main(String[] args) {
        new AutoCompleteTest();
    }
//------------------------------------------------------------------------------
    public AutoCompleteTest(){
        setLayout(new java.awt.FlowLayout());
        setVisible(true);
        add(city);
//      add(pane);
        pack();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        city.addKeyListener(new TextHandler());
    }
//------------------------------------------------------------------------------
    public void initiateSearch(String lookFor){
        Vector<String> matches = new Vector<>();
        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 class ResultWindow extends JWindow{
        public JScrollPane pane;
        public JList searchResult;
//------------------------------------------------------------------------------
        public ResultWindow(){

        }
//------------------------------------------------------------------------------
        public void initiateDisplay(){
            pane.setViewportView(searchResult);
            add(pane);
            pack();
            this.setLocation(AutoCompleteTest.this.getX() + 2, 
                    AutoCompleteTest.this.getY()+
                    AutoCompleteTest.this.getHeight());

//          this.setPreferredSize(city.getPreferredSize());
            this.setVisible(true);
        }
    }
//------------------------------------------------------------------------------

    class TextHandler implements KeyListener{
        @Override
        public void keyTyped(KeyEvent e){

        }

        @Override
        public void keyPressed(KeyEvent e){
            if(r.isVisible()){
                r.setVisible(false);
            }
            if(e.getKeyChar() == '\n'){
                initiateSearch(city.getText());
            }
        }

        @Override
        public void keyReleased(KeyEvent e){

        }
    }
//------------------------------------------------------------------------------
}

出力

ここに画像の説明を入力

問題

JWindow結果を表示するのサイズ( aJList内のJScrollPane) は、結果に基づいて変化します。都市名が小さい場合JWindowは小さく、都市名が大きい場合JWindowは大きくなります。

考えられるあらゆる組み合わせを試しました。setPreferredDimension()JWindowJListを使用してみましJScrollPaneたが、問題は解決しません。
どうしても飾るサイズに合わせJFrameたい

4

4 に答える 4

7

編集

とにかく、基本的には、サポートされるすべての都市のリストを手動で作成する必要がありますよね?? bx @リトルチャイルド

  • このアイデアは非常に簡単ですJTableJWindow

  • 1つでColumn

  • それなしJTableHeader

  • そこにRowSorterを追加します(チュートリアルのコード例を参照)

  • その後、すべてのステップが完了します:-)、そこには他に何も必要ありません(一致を返さない場合にBackgroundを変更するボーナスかもしれません。ポップアップウィンドウに追加します(必ずテストしてください))JTextFieldRowFiltersetVisibleDocumentListener!isVisible

于 2013-02-13T08:31:04.230 に答える
1

1 つの解決策は、initializeDisplay() を次のように変更することです。

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);
    }
于 2013-02-13T08:42:37.700 に答える
1

JComboBoxを使用する必要があります。オートコンプリートについては、この記事をお読みください。

于 2013-02-13T08:36:14.363 に答える
1

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();
        }

    }

出力例を次に示します。

小さいサイズ

ここに画像の説明を入力

PS: 見栄えを良くするために、レイアウトを使用して、テキスト フィールドが幅全体を埋めるようにしてみてください。

于 2013-02-13T08:32:48.430 に答える