JTree öğesindeki öğeleri renklendirmek istiyorum. Ancak, sadece arka plan rengini sadece etikete eklemek garip görünüyor. Özellikle birden fazla düğüm seçilirse, ortaya çıkan şekil düzensiz ve rahatsız edici olarak görünür.JTree'de renk satırı
Arka plan, ağaç öğesinin tüm genişliğini tüm satırın renklendirilmesini sağlayacak şekilde genişletmenin bir yolu var mı? Sol sınırda başlayarak veya etiketin başında başlayarak, ancak kesinlikle bileşenin sağ kenarına kadar uzanan?
this question'a dayanan, küçük bir müstakil demo.
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);
}
}
Bu kod şu anda oluşturur şeydir. Bu
veya bunu tercih ederim.
Ne super.getTreeCellRendererComponent (döndürdüğü bileşen için setPreferredSize() ararsanız) için Bütün sırayı kaplayacak kadar genişlik var mı? – StanislavL
@StanislavL: Bu, çeşitli yerlerde otomatik boyut hesaplamayı bozar. 'GetPreferredSize' komutunu geçersiz kılmak, yüksekliğin her zamanki gibi hesaplandığından emin olur. Yine de tüm ağacın genişliğini hesaplamak imkansız olacak. Yine de, ilginç bir yaklaşım, kullanıcıların bu konuda oy kullanabilmeleri için bir cevaba değer olabilir. – MvG
Kesinlikle geçersiz olan getPreferredSize() yüksekliğini korumak için daha iyidir. Ayrıca, varsayılan JTree genişlik hesaplamasını sağlam tutmak için JTree genişliğinden daha küçükse, genişliği artırmak için akıllı bir yaklaşım olabilir. – StanislavL