我有这段代码来自 stackoverflow how to highlight multiple cells in jtable :
private static class CellHighlighterRenderer extends JLabel implements TableCellRenderer {
public CellHighlighterRenderer() {
setOpaque(true); // Or color won't be displayed!
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
String val = (String)value;
Color c;
if (val.matches(".*MIN.*")) // Add a method to configure the regexpr
c = Color.YELLOW; // Add a method to configure color
else
c = UIManager.getColor("Table.background");
setBackground(c);
setText(val);
return this;
}
}
但是当我用它来突出显示一个单元格时,它会给出错误的操作,比如整个数据都丢失了。我是 java swing 的新手。请帮助使单元格在按钮按下操作事件中突出显示。
更新:添加我的示例代码:
package myPackage;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.table.TableCellRenderer;
public class JTableCreatingDemo {
public static void main(String args[]) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Object rowData[][] = { { "Row1-Column1"},
{ "Row2-Column1" } ,{ "Row3-Column1"},{ "Row4-Column1"},};
Object columnNames[] = { "Column One" };
final JTable table = new JTable(rowData, columnNames);
JButton button = new JButton("Highlight cell-1");
//Add action listener to button
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
table.setDefaultRenderer(Object.class, new CellHighlighterRenderer());
}
});
JPanel pnl = new JPanel();
pnl.add(button);
JScrollPane scrollPane = new JScrollPane(table);
frame.add(scrollPane, BorderLayout.CENTER);
frame.add(pnl,BorderLayout.SOUTH);
frame.setSize(300, 150);
frame.setVisible(true);
}
}
class CellHighlighterRenderer extends JLabel implements TableCellRenderer {
/**
*
*/
private static final long serialVersionUID = 1L;
public CellHighlighterRenderer() {
setOpaque(true); // Or color won't be displayed!
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
String val = (String)value;
Color c;
if (isSelected) // Add a method to configure the regexpr
c = Color.YELLOW; // Add a method to configure color
else
c = UIManager.getColor("Table.background");
setBackground(c);
setText(val);
return this;
}
}
我想要的是单击我只想突出显示单元格编号 1(Row1-Column1)的按钮。
最佳答案
我使用这个类来设置 JTables 的样式
public class CellRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object obj, boolean isSelected, boolean hasFocus, int row, int column) {
Component cell = super.getTableCellRendererComponent(table, obj, isSelected, hasFocus, row, column);
if (isSelected)
cell.setBackground(Color.YELLOW);
else if (column == 0)
cell.setBackground(new Color(0xDDDDD));
else
cell.setBackground(new Color(0xFFFFFF));
return cell;
}
创建此类的一个实例并将其应用于您需要设置样式的单元格。 您可以使用 isSelected 参数来编辑单元格高亮颜色。
编辑
感谢您更新的示例,这里是一个用于更改单元格渲染器的切换按钮的示例
首先使用默认的表格单元格渲染器为单元格创建颜色样式
public class CellHighlighterRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object obj,
boolean isSelected, boolean hasFocus, int row, int column) {
Component cell = super.getTableCellRendererComponent(table, obj, isSelected, hasFocus, row, column);
cell.setBackground(Color.YELLOW);
return cell;
}
创建 JFrame 并添加 JTable 和按钮
public class Main extends JFrame {
public Main() {
super("Table Demo");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setPreferredSize(new Dimension(300, 300));
setLocationRelativeTo(null);
setLayout(new BorderLayout());
DefaultTableModel model = new DefaultTableModel();
model.setColumnCount(5);
model.setRowCount(5);
JTable table = new JTable();
table.setModel(model);
//Get an instance of the column and the style to apply and hold a default style instance
final TableColumn column = table.getColumnModel().getColumn(1);
final CellHighlighterRenderer cellRenderer = new CellHighlighterRenderer();
final TableCellRenderer defaultRenderer = column.getCellRenderer();
//Now in your button listener you can toggle between the styles
JButton button = new JButton("Click!");
button.addActionListener(new ActionListener() {
private boolean clicked = false;
@Override
public void actionPerformed(ActionEvent e) {
if (clicked) {
column.setCellRenderer(cellRenderer);
clicked = false;
} else {
column.setCellRenderer(defaultRenderer);
clicked = true;
}
repaint(); //edit
}
});
getContentPane().add(table, BorderLayout.CENTER);
getContentPane().add(button, BorderLayout.NORTH);
pack();
setVisible(true);
}
public static void main(String[] args) {
new Main();
}
希望对你有帮助
编辑 我添加了一个重绘来清理最后一个例子。如果您只想定位特定的单元格,请更改表格单元格渲染器以仅渲染您需要的单元格,如下所示
@Override
public Component getTableCellRendererComponent(JTable table, Object obj,
boolean isSelected, boolean hasFocus, int row, int column) {
Component cell = super.getTableCellRendererComponent(table, obj, isSelected, hasFocus, row, column);
//add condition for desired cell
if (row == 1 && column == 1)
cell.setBackground(Color.YELLOW);
return cell;
}
关于java - 突出显示 jtable 中的单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25093985/