Tôi muốn tô màu các thành phần trong JTree. Tuy nhiên, chỉ cần thêm màu nền cho nhãn có vẻ lạ. Đặc biệt nếu nhiều hơn một nút được chọn, hình dạng kết quả trông rách rưới và mất tập trung.Hàng màu trong JTree
Có cách nào để làm nền mở rộng toàn bộ chiều rộng của phần tử cây, sao cho toàn bộ hàng được tô màu? Hoặc là bắt đầu từ biên giới bên trái hoặc bắt đầu ở đầu nhãn, nhưng chắc chắn mở rộng cho đến khi biên giới bên phải của thành phần?
Đây là bản trình diễn khép kín nhỏ, dựa trên this question.
import java.awt.*;
import javax.swing.*;
import javax.swing.tree.*;
public class SO26724913 {
public static void main(String[] args) {
DefaultMutableTreeNode a = new DefaultMutableTreeNode("a");
DefaultMutableTreeNode b = new DefaultMutableTreeNode("b");
DefaultMutableTreeNode c = new DefaultMutableTreeNode("c");
a.add(b);
a.add(c);
final JTree tree = new JTree(a);
tree.setCellRenderer(new DefaultTreeCellRenderer() {
@Override
public Component getTreeCellRendererComponent
(JTree tree, Object value, boolean selected,
boolean expanded, boolean leaf, int row, boolean focus)
{
JComponent c = (JComponent)
super.getTreeCellRendererComponent
(tree, value, selected, expanded, leaf, row, focus);
DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
String data = (String)node.getUserObject();
if ("b".equals(data)) {
c.setBackground(Color.RED);
c.setOpaque(true);
}
else {
c.setBackground(null);
c.setOpaque(false);
}
return c;
}
});
JFrame frm = new JFrame();
frm.getContentPane().add(tree);
frm.setSize(200, 200);
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setVisible(true);
}
}
Đây là mã hiện đang tạo.
Tôi thích hoặc là
hoặc điều này.
gì nếu bạn gọi phương thức setPreferredSize() cho thành phần được trả về bởi super.getTreeCellRendererComponent() để có chiều rộng đủ lớn để bao gồm toàn bộ hàng? – StanislavL
@StanislavL: Điều đó sẽ phá vỡ tính toán kích thước tự động ở một vài nơi. Thay thế 'getPreferredSize' thay vì đảm bảo chiều cao được tính như bình thường. Tuy nhiên, tính toán chiều rộng của toàn bộ cây sẽ trở thành không thể. Tuy nhiên, cách tiếp cận thú vị, có thể đáng để trả lời để người dùng có thể bỏ phiếu cho vấn đề này. – MvG
Chắc chắn ghi đè getPreferredSize() là tốt hơn để giữ chiều cao. Nó cũng có thể là cách tiếp cận thông minh để tăng độ rộng chỉ khi nó nhỏ hơn chiều rộng JTree để giữ nguyên tính toán chiều rộng JTree mặc định. – StanislavL