JTable中如何让一行的颜色变化

vincent343425185 2008-05-04 04:59:43
 public void chooserColor(int n) {//n为要改变颜色的行
TableColumn column = table.getColumnModel().getColumn(n);
column.setCellRenderer(new RowRenderer(n));
table.updateUI();

}

}

class RowRenderer extends DefaultTableCellRenderer {
private int r;

public RowRenderer(int r) {
this.r = r;
}

public Component getTableCellRendererComponent(JTable t, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
System.out.println("--- background color ---" + t.getBackground());
System.out.println("--- r ---" + r);
if (row == r) {
System.out.println("---- color row ---" + row);
System.out.println("---- color colunm ---" + column);
setForeground(Color.LIGHT_GRAY);
}
return super.getTableCellRendererComponent(t, value, isSelected,
hasFocus, row, column);
}
}

我这样写 就改变了列的前景色~~~ 我想改变行的~~
...全文
348 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
benzuo58 2011-03-11
  • 打赏
  • 举报
回复
sb啊你
zwgs1985 2008-05-05
  • 打赏
  • 举报
回复
import java.awt.Color;
import java.awt.Component;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;

public class TableRowColorTest {

/**
* @param args
*/
public static void main(String[] args) {
JFrame f = new JFrame();
TableModel dataModel = new AbstractTableModel() {
public int getColumnCount() {
return 10;
}

public int getRowCount() {
return 10;
}

public Object getValueAt(int row, int col) {
return new Integer(row * col);
}

public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
}
};
f.getContentPane().add(new JScrollPane(new M_Table(dataModel)));
f.pack();
f.setVisible(true);
f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);
}

}

class M_Renderer extends DefaultTableCellRenderer {
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
}
}

class M_Table extends JTable {

public M_Table(TableModel dataModel) {
super(dataModel);
}

public Color getSpecifiedRowBackgroundColor(int row) {
/**
* your logic
*/
if (row == 0) {
return Color.BLUE;
} else if (row == 1) {
return Color.RED;
} else {
return super.getBackground();
}
}

public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Object value = getValueAt(row, column);

boolean isSelected = false;
boolean hasFocus = false;

// Only indicate the selection and focused cell if not printing
if (!isPaintingForPrint()) {
isSelected = isCellSelected(row, column);

boolean rowIsLead = (selectionModel.getLeadSelectionIndex() == row);
boolean colIsLead = (columnModel.getSelectionModel().getLeadSelectionIndex() == column);

hasFocus = (rowIsLead && colIsLead) && isFocusOwner();
}
((DefaultTableCellRenderer) renderer).setBackground(this
.getSpecifiedRowBackgroundColor(row));
return renderer.getTableCellRendererComponent(
this,
value,
isSelected,
hasFocus,
row,
column);
}
}
还是贴段代码给你吧
zwgs1985 2008-05-05
  • 打赏
  • 举报
回复
如果单纯想改变行的颜色,那么改写TableCellRenderer接口的
Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int column)
方法,在里面添加代码
if(row == n)//n为要改变的行
{
setBackground(color);//color可以是特定的颜色,也可以从table中取得,如果是后者,那么要自己写个table,提供个共有方法,供renderer调用,因为getTableCellRendererComponent方法的参数中有table变量,可以调用自己写的方法。
}
不知道能不能看明白
zyf_xl 2008-05-05
  • 打赏
  • 举报
回复
Java 技术交流群!入群先看公约!

本群公约:互助、互勉、共同进步!惑则问、知则答、不知则表示关注。帮助新手、细心回答。
同意上述公约者·申请加入!
QQ群号:25922618(一群已经满)
请加备用群:17615698
vincent343425185 2008-05-05
  • 打赏
  • 举报
回复
那如何改变行呢?SWING不熟悉,搞了很长时间都没出预想的结果!
hanjs 2008-05-05
  • 打赏
  • 举报
回复
TableColumn column = table.getColumnModel().getColumn(n);
column.setCellRenderer(new RowRenderer(n));
TableColumn column = table.getColumnModel().getColumn(n);
column.setCellRenderer(new RowRenderer(n));

你这个地方就是改变了这个列的。
zwgs1985 2008-05-05
  • 打赏
  • 举报
回复
网速好慢阿,哦,那这样做应该就可以了
改写renderer里的方法
zwgs1985 2008-05-05
  • 打赏
  • 举报
回复
import java.awt.Color;
import java.awt.Component;
import java.util.HashMap;
import java.util.Map;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;

public class TableRowColorTest {

public static final Color SELECTED_COLOR = Color.BLUE;

/**
* @param args
*/
public static void main(String[] args) {
JFrame f = new JFrame();
TableModel dataModel = new AbstractTableModel() {
public int getColumnCount() {
return 10;
}

public int getRowCount() {
return 10;
}

public Object getValueAt(int row, int col) {
return new Integer(row * col);
}

public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
}
};
M_Table table = new M_Table(dataModel);
f.getContentPane().add(new JScrollPane(table));
table.setSpecifiedRowBackgroundColor(0, SELECTED_COLOR);
table.setSpecifiedRowBackgroundColor(1, Color.RED);
f.pack();
f.setVisible(true);
f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);
}

}

class M_Renderer extends DefaultTableCellRenderer {
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
Component component2 =
super
.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (table instanceof M_Table) {
M_Table t = (M_Table) table;
if (t.getSpecifiedRowBackgroundColor(row) == TableRowColorTest.SELECTED_COLOR) {
component2.setBackground(TableRowColorTest.SELECTED_COLOR);
}
}
return component2;
}
}

class M_Table extends JTable {

private Map<Integer, Color> colorMap = new HashMap<Integer, Color>();

public M_Table(TableModel dataModel) {
super(dataModel);
}

public TableCellRenderer getCellRenderer(int row, int col) {
return new M_Renderer();
}

public Color getSpecifiedRowBackgroundColor(int row) {
/**
* your logic
*/
if (colorMap.containsKey(row)) {
return colorMap.get(row);
} else {
return this.getBackground();
}
// if (row == 0) {
// return TableRowColorTest.SELECTED_COLOR;
// } else if (row == 1) {
// return Color.RED;
// } else {
// return super.getBackground();
// }
}

public void setSpecifiedRowBackgroundColor(int row, Color color) {
colorMap.put(row, color);
}

public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Object value = getValueAt(row, column);

boolean isSelected = false;
boolean hasFocus = false;

// Only indicate the selection and focused cell if not printing
if (!isPaintingForPrint()) {
isSelected = isCellSelected(row, column);

boolean rowIsLead = (selectionModel.getLeadSelectionIndex() == row);
boolean colIsLead = (columnModel.getSelectionModel().getLeadSelectionIndex() == column);

hasFocus = (rowIsLead && colIsLead) && isFocusOwner();
}
((DefaultTableCellRenderer) renderer).setBackground(this
.getSpecifiedRowBackgroundColor(row));
return renderer.getTableCellRendererComponent(
this,
value,
isSelected,
hasFocus,
row,
column);
}
}
怎么发不出去阿,这样吗?
2.鼠标选择不了。//不知道什么意思
vincent343425185 2008-05-05
  • 打赏
  • 举报
回复
鼠标选择不了?
就是当鼠标点到一条已经选择过的条目时,那一条不显示颜色。
zwgs1985 2008-05-05
  • 打赏
  • 举报
回复
import java.awt.Color;
import java.awt.Component;
import java.util.HashMap;
import java.util.Map;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;

public class TableRowColorTest {

public static final Color SELECTED_COLOR = Color.BLUE;

/**
* @param args
*/
public static void main(String[] args) {
JFrame f = new JFrame();
TableModel dataModel = new AbstractTableModel() {
public int getColumnCount() {
return 10;
}

public int getRowCount() {
return 10;
}

public Object getValueAt(int row, int col) {
return new Integer(row * col);
}

public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
}
};
M_Table table = new M_Table(dataModel);
f.getContentPane().add(new JScrollPane(table));
table.setSpecifiedRowBackgroundColor(0, SELECTED_COLOR);
table.setSpecifiedRowBackgroundColor(1, Color.RED);
f.pack();
f.setVisible(true);
f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);
}

}

class M_Renderer extends DefaultTableCellRenderer {
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
Component component2 =
super
.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (table instanceof M_Table) {
M_Table t = (M_Table) table;
if (t.getSpecifiedRowBackgroundColor(row) == TableRowColorTest.SELECTED_COLOR) {
component2.setBackground(TableRowColorTest.SELECTED_COLOR);
}
}
return component2;
}
}

class M_Table extends JTable {

private Map<Integer, Color> colorMap = new HashMap<Integer, Color>();

public M_Table(TableModel dataModel) {
super(dataModel);
}

public TableCellRenderer getCellRenderer(int row, int col) {
return new M_Renderer();
}

public Color getSpecifiedRowBackgroundColor(int row) {
/**
* your logic
*/
if (colorMap.containsKey(row)) {
return colorMap.get(row);
} else {
return this.getBackground();
}
// if (row == 0) {
// return TableRowColorTest.SELECTED_COLOR;
// } else if (row == 1) {
// return Color.RED;
// } else {
// return super.getBackground();
// }
}

public void setSpecifiedRowBackgroundColor(int row, Color color) {
colorMap.put(row, color);
}

public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Object value = getValueAt(row, column);

boolean isSelected = false;
boolean hasFocus = false;

// Only indicate the selection and focused cell if not printing
if (!isPaintingForPrint()) {
isSelected = isCellSelected(row, column);

boolean rowIsLead = (selectionModel.getLeadSelectionIndex() == row);
boolean colIsLead = (columnModel.getSelectionModel().getLeadSelectionIndex() == column);

hasFocus = (rowIsLead && colIsLead) && isFocusOwner();
}
((DefaultTableCellRenderer) renderer).setBackground(this
.getSpecifiedRowBackgroundColor(row));
return renderer.getTableCellRendererComponent(
this,
value,
isSelected,
hasFocus,
row,
column);
}
}
这样?
什么叫鼠标选择不了?
不懂
vincent343425185 2008-05-05
  • 打赏
  • 举报
回复
恩解决了!可以让选择过的条目,颜色置灰。唯一的缺陷就是再一次点上去的时候还是会变色。。。
最好的结果是选择过的,就不让选了。
不让选择的组成条件:
1.颜色灰了。
2.鼠标选择不了。
tpz_stamp 2008-05-05
  • 打赏
  • 举报
回复
自己实现cell renderer
vincent343425185 2008-05-05
  • 打赏
  • 举报
回复
按照你贴的代码是可以的。但是由于,前面种种原因想用第一种方法。。。
可惜还是不行。
我的意图是当用户选择过某条以后,那条就变灰。

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧