Java 为什么JTable在单击时会改变颜色?
我有一个简单的JTable,它显示数据和不同的背景颜色。显示数据和为行着色对于DefaultTableModel非常有用。但如果我在单击行时向行中添加鼠标侦听器以加载某些内容,则背景色将消失。如果我标记几行也一样。我根本不需要标记行,我只需要颜色和MouseEvent来工作。以下是相关代码:Java 为什么JTable在单击时会改变颜色?,java,swing,jtable,Java,Swing,Jtable,我有一个简单的JTable,它显示数据和不同的背景颜色。显示数据和为行着色对于DefaultTableModel非常有用。但如果我在单击行时向行中添加鼠标侦听器以加载某些内容,则背景色将消失。如果我标记几行也一样。我根本不需要标记行,我只需要颜色和MouseEvent来工作。以下是相关代码: testcase_table = new JTable() { public Component prepareRenderer(TableCellRenderer rendere
testcase_table = new JTable() {
public Component prepareRenderer(TableCellRenderer renderer,
int row, int column) {
List<Element> cases = element.getChildren();
int passed = 0;
Component c = super.prepareRenderer(renderer, row, column);
if (!isRowSelected(row)) {
c.setBackground(getBackground());
passed = 0;
if (row <= running_testcase) {
List<Element> teststeps = cases.get(row).getChildren();
for (Element teststep : teststeps) {
if (teststep.getAttribute("status") != null
&& teststep.getAttributeValue("status")
.equals("failed")) {
passed++;
}
}
if (passed > 0) {
c.setBackground(Color.RED);
}
if (passed == 0) {
c.setBackground(Color.GREEN);
}
}
}
return c;
}
};
testcase_table.setFocusable(false);
testcase_table.setRowSelectionAllowed(false);
testcase_table.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 1) {
JTable target = (JTable)e.getSource();
int row = target.getSelectedRow();
//set_values(doc,25);
set_teststeps(doc, row);
}
}
});
private void DisplayData(List<String> Testcases) {
aModel = new DefaultTableModel() {
// setting the jtable read only
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
// setting the column name
Object[] tableColumnNames = new Object[1];
tableColumnNames[0] = "TestCases";
aModel.setColumnIdentifiers(tableColumnNames);
if (Testcases == null) {
testcase_table.setModel(aModel);
return;
}
Object[] objects = new Object[1];
ListIterator<String> lstrg = Testcases.listIterator();
// populating the tablemodel
while (lstrg.hasNext()) {
String newcus = lstrg.next();
objects[0] = newcus;
aModel.addRow(objects);
}
// binding the jtable to the model
testcase_table.setModel(aModel);
}
testcase\u table=newjtable(){
公共组件预处理程序(TableCellRenderer,
整数行,整数列){
List cases=element.getChildren();
int=0;
组件c=super.prepareRenderer(呈现器、行、列);
如果(!isRowSelected(世界其他地区)){
c、 挫折背景(getBackground());
通过=0;
如果(第0行){
c、 挫折地面(颜色:红色);
}
如果(通过==0){
c、 挫折背景(颜色:绿色);
}
}
}
返回c;
}
};
testcase_table.setFocusable(false);
testcase_table.setRowSelectionAllowed(false);
testcase_table.addMouseListener(新的MouseAdapter(){
公共无效mouseClicked(MouseEvent e){
如果(如getClickCount()==1){
JTable target=(JTable)e.getSource();
int row=target.getSelectedRow();
//设置_值(文件,25);
设置测试步骤(文档、行);
}
}
});
私有void DisplayData(列出测试用例){
aModel=新的DefaultTableModel(){
//将jtable设置为只读
@凌驾
公共布尔值可编辑(int行,int列){
返回false;
}
};
//设置列名
Object[]tableColumnNames=新对象[1];
tableColumnNames[0]=“TestCases”;
aModel.setColumnIdentifiers(tableColumnNames);
if(Testcases==null){
testcase_table.setModel(aModel);
返回;
}
Object[]objects=新对象[1];
ListIterator lstrg=Testcases.ListIterator();
//填充表格模型
while(lstrg.hasNext()){
字符串newcus=lstrg.next();
对象[0]=newcus;
aModel.addRow(对象);
}
//将jtable绑定到模型
testcase_table.setModel(aModel);
}
有什么想法吗?谢谢。为了更快地获得更好的帮助,请发布一篇。
有什么想法吗?
是的,这正是XxxRenderer的工作,更多内容请参见Oracle教程,然后从逻辑上讲,如果(行JTable中的选定行更改背景色,以向用户提供所选行的视觉指示。当用户选择多行时,这一点更为重要。您可以创建TableCellRenderer来覆盖此行为。