[英]How to highlight multiple nodes in JTree based on a list
我正在構建一個使用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;
}
}
在“體育”節點下,應突出顯示“足球”和“足球”,但只列出最后一項:“足球”將突出顯示。
你調用setQuery()兩次,第二次調用只是替換渲染器中的查詢。 使用查詢集合或正則表達式來合並“^(football | soccer)。*”之類的模式。
我在renderer.setQuery()方法中將整個列表作為字符串發送。 然后我檢查了查詢是否包含“value”(getTreeCellRendererComponent()的參數)。
在所有:
第26行:renderer.setQuery(list.toString()); 第93行:rollOver = Objects.nonNull(查詢)&&!query.isEmpty()&& query.contains(value.toString());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.