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