java - 如何根据列表突出显示 JTree 中的多个节点

标签 java swing awt rendering jtree

我正在构建一个使用 JTree 的应用程序。我无法根据列表中的结果突出显示多个节点。

我尝试使用 DefaultTreeRenderer 进行渲染,但它突出显示列表中的最后一项。我每次迭代列表时都会调用 JTree setcellrenderer 。

import java.awt.*;
import java.util.ArrayList;
import java.util.Objects;
import javax.swing.*;
import javax.swing.tree.DefaultTreeCellRenderer;


public final class MainPanel extends JPanel {
  private final JTree tree = new JTree();
  private final HighlightTreeCellRenderer renderer = new HighlightTreeCellRenderer();
  private ArrayList<String> list = new ArrayList<String>();

  public MainPanel() {
    super(new BorderLayout(5, 5));
    list.add("football");
    list.add("soccer");

    JPanel n = new JPanel(new BorderLayout());

    n.setBorder(BorderFactory.createTitledBorder("Highlight Search"));

    tree.setCellRenderer(renderer);
    for(String str:list)
    renderer.setQuery(str);


    setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
    add(n, BorderLayout.NORTH);
    add(new JScrollPane(tree));
    setPreferredSize(new Dimension(320, 240));
  }







  public static void main(String... args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        createAndShowGui();
      }
    });
  }

  public static void createAndShowGui() {
    try {
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
      ex.printStackTrace();
      Toolkit.getDefaultToolkit().beep();
    }
    JFrame frame = new JFrame("@title@");
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.getContentPane().add(new MainPanel());
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }
}

class HighlightTreeCellRenderer extends DefaultTreeCellRenderer {
  private static final Color ROLLOVER_ROW_COLOR = new Color(0xDC_F0_FF);
  private String query;
  private boolean rollOver;

  @Override public void updateUI() {
    setTextSelectionColor(null);
    setTextNonSelectionColor(null);
    setBackgroundSelectionColor(null);
    setBackgroundNonSelectionColor(null);
    super.updateUI();
  }

  public void setQuery(String query) {
    this.query = query;
  }

  @Override public Color getBackgroundNonSelectionColor() {
    return rollOver ? ROLLOVER_ROW_COLOR : super.getBackgroundNonSelectionColor();
  }

  @Override public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
    Component c = super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
    if (selected) {
      c.setForeground(getTextSelectionColor());
    } else {
      rollOver = Objects.nonNull(query) && !query.isEmpty() && Objects.toString(value, "").startsWith(query);
      c.setForeground(getTextNonSelectionColor());
      c.setBackground(getBackgroundNonSelectionColor());
    }

    return c;
  }
}

在“Sports”节点下,“soccer”和“football”都应突出显示,但只有列表中的最后一项:“soccer”突出显示。

最佳答案

您调用 setQuery() 两次,第二次调用只是替换渲染器中的查询。使用查询集合或正则表达式来合并模式,例如“^(football|soccer).*”

关于java - 如何根据列表突出显示 JTree 中的多个节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56671868/

相关文章:

java - 如何在边框布局中添加多个按钮

java - SLF4J:Hibernate3 与 RESTeasy

java - 如何在 JAVA GUI 中创建类似于 Google 搜索样式的搜索栏

java - 限制 JPQL 中的结果数量

java - 如何在Java中旋转矩形?

java - 如何为Jpanel设置模型?

java - 自定义绘画未按预期工作

Java - JPanel 与 Canvas

java spaceship 游戏

java - JSlider 事件触发两次