我正在构建一个使用 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/