带有TableCellRenderer的Java JTable排序

带有TableCellRenderer的Java JTable排序,java,swing,jtable,tablecellrenderer,Java,Swing,Jtable,Tablecellrenderer,我对Java有点陌生,我在排序和TableCellRenderer方面遇到了问题 我有一个包含15列的表,其中有一些列使用TableCellRenderer根据单元格上的值将前景颜色更改为绿色或红色 在我尝试按某个列进行排序之前,一切都很正常(排序部分还可以)。。。 问题是格式化颜色不能反映排序操作所做的更改。在排序之前,颜色将保持在其在表格上的原始位置不变。有没有一个简单的方法来克服这个问题 我进行了搜索,但没有找到可以实现的解决方案 短暂性脑缺血发作 JL 编辑:发布相关源代码(未完成实现)

我对Java有点陌生,我在排序和TableCellRenderer方面遇到了问题

我有一个包含15列的表,其中有一些列使用
TableCellRenderer
根据单元格上的值将前景颜色更改为绿色或红色

在我尝试按某个列进行排序之前,一切都很正常(排序部分还可以)。。。 问题是格式化颜色不能反映排序操作所做的更改。在排序之前,颜色将保持在其在表格上的原始位置不变。有没有一个简单的方法来克服这个问题

我进行了搜索,但没有找到可以实现的解决方案

短暂性脑缺血发作

JL

编辑:发布相关源代码(未完成实现)

private void buildTab(){
myIUserInterface.removeBottomTab(“只是一个测试”);
myJPanel=myIUserInterface.getBottomTab(“只是一个测试”);
myJScollPane=newjscrollpane();
myTable=新的JTable();
myTable.setAutoCreateRowSorter(真);
myTableContent=myFillTableData();
字符串[]表格标题={
“X1”、“X2”、“X3”、“X4”、“X5”、“X6”、“X7”、“X8”、“X9”、“X10”、“X11”、“X12”、“X13”、“X14”、“X15”
};
setModel(新的DefaultTableModel(myTableContent,TableHeader){
@凌驾
公共布尔值isCellEditable(int-rowIndex、int-columnIndex){
返回false;
}
});
MyChangeCellColor myCCC=新的MyChangeCellColor();
枚举allColumns=myTable.getColumnModel().getColumns();
while(allColumns.hasMoreElements()){
TableColumn column=allColumns.nextElement();
列。setCellRenderer(myCCC);
}
myJScollPane.setViewportView(myTable);
GroupLayout myLayout=新的GroupLayout(myJPanel);
myJPanel.setLayout(myLayout);
myLayout.setHorizontalGroup(
createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(myJScollPane,javax.swing.GroupLayout.DEFAULT\u SIZE,890,Short.MAX\u值)
);
myLayout.setVerticalGroup(
createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(myJScollPane,javax.swing.GroupLayout.DEFAULT_SIZE,672,Short.MAX_VALUE)
);
}
类MyChangeCellColor扩展JLabel实现TableCellRenderer{
@凌驾
公共组件GetTableCellRenderComponent(JTable表、对象值、布尔值、,
布尔值(焦点、整数行、整数列){
设置水平对齐(中心);
set不透明(true);
挫折地面(颜色:白色);
如果(列==0){
设置前景(颜色为黑色);
}
如果(列==1){
设置前景(颜色为黑色);
}
如果(列==2){
设置前景(颜色为黑色);
}
如果(列==3){
设置前景(颜色为黑色);
}
如果(列==4){
if(“LONG”.equals(myTable.getModel().getValueAt(第4行))){
设置前景(Color.GREEN.darker());
}
if(“SHORT”.equals(myTable.getModel().getValueAt(第4行))){
设置前景(颜色为红色);
}
}
如果(列==5){
设置前景(颜色为黑色);
}
如果(列==6){
设置前景(颜色为黑色);
}
如果(列==7){
设置前景(颜色为黑色);
}
如果(列==8){
设置前景(颜色为黑色);
}
如果(列==9){
设置前景(颜色为黑色);
}
如果(列==10){
设置前景(颜色为黑色);
}
如果(列==11){
double d=double.valueOf(myTable.getModel().getValueAt(第11行).toString());
如果(d>0){
设置前景(Color.GREEN.darker());
}
如果(d==0){
设置前景(颜色为黑色);
}
if(d<0){
设置前景(颜色为红色);
}
}
如果(列==12){
double d=double.valueOf(myTable.getModel().getValueAt(第12行).toString());
如果(d>0){
设置前景(Color.GREEN.darker());
}
如果(d==0){
设置前景(颜色为黑色);
}
if(d<0){
设置前景(颜色为红色);
}
}
如果(列==13){
设置前景(颜色为黑色);
}
如果(列==14){
设置前景(颜色为黑色);
}
setText(value.toString());
归还这个;
}
}
编辑2:如果有人需要,请粘贴以供参考!只需在TableCellRenderer类上的JTable返回的行上引用模型行(不确定是否正确解释了它,您可以看到以下更改):

类MyChangeCellColor扩展JLabel实现TableCellRenderer{ @凌驾 公共组件GetTableCellRenderComponent(JTable表、对象值、布尔值、, 布尔值(焦点、整数行、整数列){ 设置水平对齐(中心); set不透明(true); 挫折地面(颜色:白色); 如果(列==0){ 设置前景(颜色为黑色); } 如果(列==1){ 设置前景(颜色为黑色); } 如果(列==2){ 设置前景(颜色为黑色); } 如果(列==3){ 设置前景(颜色为黑色); } 如果(列==4){ if(“LONG”.equals(myTable.getModel().getValueAt(myTable.convertRowIndexToModel(行),4))){ 设置前景(Color.GREEN.darker()); } if(“SHORT”.equals(myTable.getModel().getValueAt(myTable.convertRowIndexToModel(行),4))){ 设置前景(颜色为红色); } }
private void buildTab(){
    myIUserInterface.removeBottomTab("just a test");
    myJPanel = myIUserInterface.getBottomTab("just a test");
    myJScollPane = new JScrollPane();
    myTable = new JTable();
    myTable.setAutoCreateRowSorter(true);
    myTableContent = myFillTableData();
    String[] tableHeaders = {
            "X1", "X2", "X3", "X4", "X5", "X6", "X7", "X8", "X9", "X10", "X11", "X12", "X13", "X14", "X15"
        };
    myTable.setModel(new DefaultTableModel(myTableContent, tableHeaders) {

        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return false;
        }
    });
    MyChangeCellColor myCCC = new MyChangeCellColor();
    Enumeration<TableColumn> allColumns = myTable.getColumnModel().getColumns();
    while(allColumns.hasMoreElements()){
        TableColumn column = allColumns.nextElement();
        column.setCellRenderer(myCCC);
    }
    myJScollPane.setViewportView(myTable);

    GroupLayout myLayout = new GroupLayout(myJPanel);
    myJPanel.setLayout(myLayout);
    myLayout.setHorizontalGroup(
        myLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(myJScollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 890, Short.MAX_VALUE)
    );
    myLayout.setVerticalGroup(
        myLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addComponent(myJScollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 672, Short.MAX_VALUE)
    );
}


class MyChangeCellColor extends JLabel implements TableCellRenderer {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
            boolean hasFocus, int row, int column) {
        setHorizontalAlignment(CENTER);
        setOpaque(true);
        setBackground(Color.WHITE);
        if (column == 0){
            setForeground(Color.BLACK);
        }
        if (column == 1){
            setForeground(Color.BLACK);
        }
        if (column == 2){
            setForeground(Color.BLACK);
        }
        if (column == 3){
            setForeground(Color.BLACK);
        }
        if (column == 4){
            if ("LONG".equals(myTable.getModel().getValueAt(row, 4))) {
                setForeground(Color.GREEN.darker());
            }
            if ("SHORT".equals(myTable.getModel().getValueAt(row, 4))) {
                setForeground(Color.RED);
            }
        }
        if (column == 5){
            setForeground(Color.BLACK);
        }
        if (column == 6){
            setForeground(Color.BLACK);
        }
        if (column == 7){
            setForeground(Color.BLACK);
        }
        if (column == 8){
            setForeground(Color.BLACK);
        }
        if (column == 9){
            setForeground(Color.BLACK);
        }
        if (column == 10){
            setForeground(Color.BLACK);
        }
        if (column == 11){
            double d = Double.valueOf(myTable.getModel().getValueAt(row, 11).toString());
            if (d > 0) {
                setForeground(Color.GREEN.darker());
            }
            if (d == 0) {
                setForeground(Color.BLACK);
            }
            if (d < 0) {
                setForeground(Color.RED);
            }
        }
        if (column == 12){
            double d = Double.valueOf(myTable.getModel().getValueAt(row, 12).toString());
            if (d > 0) {
                setForeground(Color.GREEN.darker());
            }
            if (d == 0) {
                setForeground(Color.BLACK);
            }
            if (d < 0) {
                setForeground(Color.RED);
            }
        }
        if (column == 13){
            setForeground(Color.BLACK);
        }
        if (column == 14){
            setForeground(Color.BLACK);
        }
        setText(value.toString());
        return this;
    }
}
class MyChangeCellColor extends JLabel implements TableCellRenderer {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
            boolean hasFocus, int row, int column) {
        setHorizontalAlignment(CENTER);
        setOpaque(true);
        setBackground(Color.WHITE);
        if (column == 0){
            setForeground(Color.BLACK);
        }
        if (column == 1){
            setForeground(Color.BLACK);
        }
        if (column == 2){
            setForeground(Color.BLACK);
        }
        if (column == 3){
            setForeground(Color.BLACK);
        }
        if (column == 4){
            if ("LONG".equals(myTable.getModel().getValueAt(myTable.convertRowIndexToModel(row), 4))) {
                setForeground(Color.GREEN.darker());
            }
            if ("SHORT".equals(myTable.getModel().getValueAt(myTable.convertRowIndexToModel(row), 4))) {
                setForeground(Color.RED);
            }
        }
        if (column == 5){
            setForeground(Color.BLACK);
        }
        if (column == 6){
            setForeground(Color.BLACK);
        }
        if (column == 7){
            setForeground(Color.BLACK);
        }
        if (column == 8){
            setForeground(Color.BLACK);
        }
        if (column == 9){
            setForeground(Color.BLACK);
        }
        if (column == 10){
            setForeground(Color.BLACK);
        }
        if (column == 11){
            double d = Double.valueOf(myTable.getModel().getValueAt(myTable.convertRowIndexToModel(row), 11).toString());
            if (d > 0) {
                setForeground(Color.GREEN.darker());
            }
            if (d == 0) {
                setForeground(Color.BLACK);
            }
            if (d < 0) {
                setForeground(Color.RED);
            }
        }
        if (column == 12){
            double d = Double.valueOf(myTable.getModel().getValueAt(myTable.convertRowIndexToModel(row), 12).toString());
            if (d > 0) {
                setForeground(Color.GREEN.darker());
            }
            if (d == 0) {
                setForeground(Color.BLACK);
            }
            if (d < 0) {
                setForeground(Color.RED);
            }
        }
        if (column == 13){
            setForeground(Color.BLACK);
        }
        if (column == 14){
            setForeground(Color.BLACK);
        }
        setText(value.toString());
        return this;
    }
}
convertRowIndexToModel(int viewRowIndex) 
convertRowIndexToView(int modelRowIndex)