0

在 JTable 中搜索文本时遇到两个问题:

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.hint为您的 JTextView创建一个。请参阅此示例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它应该可以正常工作。

我通常会等到用户在字段中输入后才清除标签,但您可以使用焦点侦听器和标志来触发流程

用焦点监听器更新

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 并在搜索字段中键入 away:下一个匹配的单元格将突出显示。

于 2012-07-27T09:58:55.557 回答