我有此代码从如何突出显示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; } }
但是,当我用它突出显示一个单元格时,它会执行错误的操作,就像丢失整个数据一样。Iam是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; }