gpt4 book ai didi

java - 如何在JXTreeTable的子节点设置字体和背景颜色

转载 作者:行者123 更新时间:2023-12-01 10:50:31 25 4
gpt4 key购买 nike

我有一个简单的 Java swing 应用程序。所以我有一个带有 JXTreeTable 的 JPanel。我可以在这个TreeTable中插入带有子节点的soma行,这样就可以了。

现在,如果我尝试运行我的应用程序,我可以看到:

enter image description here

这也可以。因此,现在如果我尝试扩展一个或多个节点,我可以看到这一点:

enter image description here

我想知道是否可以更改渲染(为 NODE 子项设置另一个背景或其他字体颜色。

这是我用来创建 JXTreeTable 的代码。

private void createTable(List<Entrate> v,String tipoConto){
tableCatEntrate = new CustomTreeTableEntrate(v,tipoConto);
daiProprietaJTableCatEntrate();
jscrollPaneCatEntrate.setViewportView(tableCatEntrate);
}

这是 CustomTreeTableEntralte 类:

public class CustomTreeTableEntrate extends JXTreeTable{

public CustomTreeTableEntrate(List<Entrate> listaConti,String tipoConto){
setTreeTableModel(new RandomTextTreeTableModel(listaConti,tipoConto));
setRowSelectionAllowed(false);
this.setDefaultRenderer(Object.class, new CustomTreeTableSpeseXCategoriaSpese());
}
class RandomTextTreeTableModel extends DefaultTreeTableModel {
public final NumberFormat decimalFormatter2 = new DecimalFormat("#,##0.00");
DefaultMutableTreeTableNode Root = null;
final String[] ColName = {"","Acquisti/Vendite","Uscite","Entrate","Saldo"};
//public LinkedHashMap<String, Entrate> mappaConti = new LinkedHashMap<String, Entrate>();
String tipoConto;

RandomTextTreeTableModel(List<Entrate>listaConti,String tipoConto) {
Root = new DefaultMutableTreeTableNode();
this.setRoot(Root);
for (Entrate conti : listaConti) {
DefaultMutableTreeTableNode node = new DefaultMutableTreeTableNode(conti);
Root.add(node);
if(conti.getListaContiFigli()!=null){
for (Entrate contoFiglio : conti.getListaContiFigli()) {
node.add(new DefaultMutableTreeTableNode(contoFiglio));
mappaConti.put(contoFiglio.getDescrizione(), contoFiglio);
}
}
contoTotale.setTotale(conti.getTotale()+contoTotale.getTotale());
contoTotale.setTotalePubblico(conti.getTotalePubblico()+contoTotale.getTotalePubblico());
contoTotale.setEntrate(conti.getEntrate()+contoTotale.getEntrate());
contoTotale.setUscite(conti.getUscite()+contoTotale.getUscite());
}

DefaultMutableTreeTableNode node = new DefaultMutableTreeTableNode(contoTotale);
Root.add(node);
}

@Override
public Object getValueAt(Object arg0, int arg1) {
try{
if(arg1==0){
int numberElement = ((DefaultMutableTreeTableNode)arg0).getChildCount();
if(numberElement<=0)
return null;
//Conti c = (Conti)((DefaultMutableTreeTableNode)arg0).getChildAt(0).getUserObject();
return "";
}
Entrate c = (Entrate)((DefaultMutableTreeTableNode)arg0).getUserObject();
if(c==null)
return null;
if (arg1 == 0) {
return "";
}else if (arg1 == 1) {
return c.getDescrizione();
}else if (arg1 == 2) {
return decimalFormatter2.format(c.getUscite());
}else if (arg1 == 3) {
return decimalFormatter2.format(c.getEntrate());
}else if (arg1 == 4 && tipoConto!=null && tipoConto.equalsIgnoreCase(WFConst.TIPO_CONTO_DEFAULT_AMMINISTRAZIONE_PRIVATO)) {
return decimalFormatter2.format(c.getTotale());
}else if (arg1 == 4 && tipoConto!=null && tipoConto.equalsIgnoreCase(WFConst.TIPO_CONTO_DEFAULT_AMMINISTRAZIONE_PUBBLICO)) {
return decimalFormatter2.format(c.getTotalePubblico());
}
}catch(Exception e){
e.printStackTrace();
}
return arg0;
}



}

}

这是 TreeTableRenderer,我认为问题出在这个类中,因为如果我尝试执行调试,我无法进入 getTreeCellRendererComponent。

public class CustomTreeTableSpeseXCategoriaSpese extends JLabel implements TreeCellRenderer, TableCellRenderer {
/**
*
*/
DefaultTreeCellRenderer defaultRenderer = new DefaultTreeCellRenderer();
private static final long serialVersionUID = 4842418316518803090L;
private Font fontTotale = new Font("Verdana", Font.BOLD, 12);
private Font fontNegativo = new Font("Verdana", Font.BOLD, 12);




public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
setOpaque(true);



if(column ==1){
setHorizontalAlignment(SwingConstants.LEFT);
}else{
setHorizontalAlignment(SwingConstants.RIGHT);
}

if (row== table.getRowCount()-1) {
setForeground(Color.BLACK);
setBackground( Color.RED );
setFont(fontTotale);
}else if(row != table.getRowCount() && column !=4){
setForeground( Color.BLACK );
setBackground(new Color(200, 200, 200));
setFont(UtilitySwing.getTableFont());
}else if(row != table.getRowCount()-1 && column ==4){
String valore = value.toString();
if(valore.startsWith("-")){
setForeground(Color.red);
setFont(fontNegativo);
}else{
setForeground(Color.blue);
setFont(fontNegativo);
}
}
setText(value != null ? value.toString() : "<null>");
return this;
}



@Override
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean selected, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
setOpaque(true);

if(expanded){
setForeground(Color.PINK);
setBackground( Color.PINK );
setFont(fontTotale);
}
return this;
}
}

最佳答案

您已经在使用 TreeCellRenderer,所以您已经很接近了。您需要做的就是访问模型(例如 DefaultTreeModel)并使用 getPathToRoot() 来查看您在树中的深度,并相应地更改渲染器。

一个例子:

DefaultTreeCellRenderer defaultTreeCellRenderer = new DefaultTreeCellRenderer() {
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean selected, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
setOpaque(true);

DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
if (model.getPathToRoot((TreeNode) value).length > 2) {
//Do your rendering goodness here
} else if (expanded) {
setForeground(Color.PINK);
setBackground(Color.PINK);
setFont(fontTotale);
}
return this;
}
};

注意我做了一些假设,因此请根据您的需要进行更正。

  1. 模型是一个DefaultTreeModel
  2. 该节点是一个TreeNode
  3. 您只关心节点是否至少有 3 层深度

此外,请查看 JavaDoc使用此功能以确保它是您所需要的。

关于java - 如何在JXTreeTable的子节点设置字体和背景颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33940724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com