0

JTableでテキストを検索するときに、2つの問題が発生します。

1)たとえば、JTextFieldでは、最初に「テキストの検索」を透過的に行う必要があり、それをクリックすると、テキストフィールドが空白になり、そこにテキストを入力できるようになります。Java Swingでこれを実現するにはどうすればよいですか?

2)私の検索コーディングは、

private void search8()
{
String target8 = sear8.getText();
for(int row = 0; row < table8.getRowCount(); row++)
for(int col = 0; col < table8.getColumnCount(); col++)
{
String next8 = (String)table8.getValueAt(row, col);
if(next8.equals(target8))
{
showSearchResults(row, col);
return;
}
}

ただし、大文字と小文字が区別されます。大文字と小文字を区別しない検索にしたいと思います。これをどこで変更すればよいですか?また、たとえば、テキスト「abc」があり、単語「abc」全体を入力する必要がある場合。「a」または「bc」と入力すると、そのセルに移動するような方法はありますか?

親切に案内してください。前もって感謝します。

4

5 に答える 5

3

1.JTextViewのを作成hintします。この例を参照してくださいhttp://code.google.com/p/xswingx/

2.大文字と小文字equalsIgnoreCase( )を区別しない場合との比較に使用します。

////////////////////編集部分//////////////////////

3.ポイント1で述べたようにヒントを実装したくない場合は、を使用します FocusListener

例えば:

JTextField textField = new JTextField("A TextField");
textField.addFocusListener(this);
public void focusGained(FocusEvent e) {

        textField = "" ;
}

詳細については、こちらをご覧ください。

http://docs.oracle.com/javase/tutorial/uiswing/events/focuslistener.html

于 2012-07-27T07:13:43.057 に答える
2

カスタムペイント方法を使用します

@Override
protected void paintComponent(Graphics g) {

    super.paintComponent(g);

    String label = getLabel();
    if (label != null && (getText() == null || getText().length() == 0)) {

        Insets insets = getInsets();
        int width = getWidth() - (insets.left + insets.right);
        int height = getHeight() - (insets.top + insets.bottom);

        // This buffer should be created when the label is changed
        // or the size of the component is changed...
        BufferedImage buffer = ImageUtilities.createCompatibleImage(width, height, Transparency.TRANSLUCENT);
        Graphics2D g2d = buffer.createGraphics();

        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setColor(getForeground());
        g2d.setFont(getFont());

        FontMetrics fm = g2d.getFontMetrics();

        Composite comp = g2d.getComposite();
        g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.25f));

        int textHeight = fm.getHeight();

        int x = insets.left;
        int y = ((height - textHeight) / 2) + fm.getAscent();

        g2d.drawString(label, 0, y);

        g2d.dispose();

        g.drawImage(buffer, insets.left, insets.top, this);

    }

}

MacOSでの実行に問題があったため、を使用しましBufferedImageたが、正常に動作するはずです。

私は通常、ユーザーがフィールドに入力するまで待ってからラベルをクリアしますが、代わりにフォーカスリスナーとフラグを使用してプロセスをトリガーすることもできます

FOCUSLISTENERで更新

public class MyTextField extents JTextField implements FocusListener {

    private boolean hasFocus = false;

    public void addNotify() {
        super.addNotify();
        addFocusListener(this);
    }

    public void removeNotify() {
        removeFocusListener(this);
        super.removeNotify();
    }

    public void focusGained(FocusEvent evt) {

        hasFocus = true;

    }

    public void focusLost(FocusEvent evt) {

        hasFocus = false;

    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        String label = getLabel();
        if (!hasFocus && label != null && (getText() == null || getText().length() == 0)) {
            // As above...
        }
    }
}

またはその効果への何か

于 2012-07-27T08:10:20.027 に答える
1

大文字と小文字を区別する部分には、を使用できますString.compareToIgnoreCase()

于 2012-07-27T07:05:01.417 に答える
1

大文字と小文字を区別しないようにnext8.equalsIgnoreCase(target8) 、の代わりにを使用する必要があり ます。next8.equals(target8)

于 2012-07-27T07:13:23.710 に答える
1

ええ-私は開発者が車輪の再発明を好むことを知っています:-)私はバイアスをかけられて私はすでにすべての必要なビルディングブロックを持っている私のお気に入りのフレームワークSwingXを使用することを好みます:

  • すべてのコレクションコンポーネントで同じように機能する自動検索サポート
  • WYMIWYS(what-you-match-is-what-you-see)、つまり、ダムtoStringの代わりに、レンダリングコンポーネントで実際の文字列表現を使用します
  • 検索コンポーネントはプラグ可能です

少なくとも、私自身のドッグフードを食べるという理論です。デフォルトのファインドバー(インクリメンタルサーチに使用するコンポーネント、つまり入力中にターゲットを検索するコンポーネント)は、必須のプロンプトフィールドの代わりにプレーンテキストフィールドを使用します。カスタム実装:

/**
 * A custom JXFindBar which uses a JXTextField instead of a plain as super.
 */ 
public static class PromptSearchBar extends JXFindBar {

    /**
     * Overridden to replace the plain text field in super
     * with a JXTextField (which supports prompts).
     */
    @Override
    protected void initComponents() {
        super.initComponents();
        searchField = new JXTextField() {
            @Override
            public Dimension getMaximumSize() {
                Dimension superMax = super.getMaximumSize();
                superMax.height = getPreferredSize().height;
                return superMax;
            }

        };
        searchField.setColumns(getSearchFieldWidth());
        ((JXTextField) searchField).setPrompt(getUIString(SEARCH_FIELD_LABEL));
    }

    /**
     * Overridden to update the prompt in addition to super
     */
    @Override
    protected void updateLocaleState(Locale locale) {
        super.updateLocaleState(locale);
        ((JXTextField) searchField).setPrompt(getUIString(SEARCH_FIELD_LABEL, locale));
    }
    /**
     * Overridden to not add the search label.
     */
    @Override
    protected void build() {
        setLayout(new FlowLayout(SwingConstants.LEADING));
        add(searchField);
        add(findNext);
        add(findPrevious);
    }

}

カスタムコードでのインストール:

SearchFactory factory = new SearchFactory() {

    @Override
    public JXFindBar createFindBar() {
        return new PromptSearchBar();
    }

};
SearchFactory.setInstance(factory);
factory.setUseFindBar(true);

それだけです-JXTable、JXTree、JXList、...にフォーカスします。ctr-fを押して、検索フィールドに入力します。次に一致するセルが強調表示されます。

于 2012-07-27T09:58:55.557 に答える