Java 突出显示jtable中的单元格
我有stackoverflow的代码: 但当我用它突出显示一个单元格时,它会给出错误的动作,就像整个数据丢失一样。我不熟悉java swing。请帮助使单元格在按钮按下操作事件中突出显示。Java 突出显示jtable中的单元格,java,swing,jtable,cell,highlight,Java,Swing,Jtable,Cell,Highlight,我有stackoverflow的代码: 但当我用它突出显示一个单元格时,它会给出错误的动作,就像整个数据丢失一样。我不熟悉java swing。请帮助使单元格在按钮按下操作事件中突出显示。 更新:添加我的示例代码: package myPackage; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; import j
更新:添加我的示例代码:
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;
}
首先使用默认的表格单元格渲染器为单元格创建颜色样式
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;
}
我使用这个类来设计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;
}
首先使用默认的表格单元格渲染器为单元格创建颜色样式
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;
}
有多种方法可以实现这一点,在您非常特殊的情况下,您想要突出显示特定的行和列,您可以使用
class CellHighlighterRenderer extends DefaultTableCellRenderer {
private static final long serialVersionUID = 1L;
public CellHighlighterRenderer() {
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (row == 0 && column == 0) {
setBackground(Color.YELLOW);
setOpaque(true);
} else {
setBackground(table.getBackground());
setOpaque(isSelected);
}
return this;
}
}
现在,如果要高亮显示整行,可以替换
if (row == 0 && column == 0) {
与
渲染器更难掌握的一个概念是,需要在每次迭代时完全重置组件的状态。基本上,这意味着,不假设已为当前迭代正确设置属性,并确保未使用默认值
查看更多详细信息…有多种方法可以实现这一点,在您非常特殊的情况下,如果要突出显示特定的行和列,可以使用
class CellHighlighterRenderer extends DefaultTableCellRenderer {
private static final long serialVersionUID = 1L;
public CellHighlighterRenderer() {
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (row == 0 && column == 0) {
setBackground(Color.YELLOW);
setOpaque(true);
} else {
setBackground(table.getBackground());
setOpaque(isSelected);
}
return this;
}
}
现在,如果要高亮显示整行,可以替换
if (row == 0 && column == 0) {
与
渲染器更难掌握的一个概念是,需要在每次迭代时完全重置组件的状态。基本上,这意味着,不假设已为当前迭代正确设置属性,并确保未使用默认值
查看更多详细信息…您可以尝试不同的方法,而不是使用单元渲染器。您可以像这样手动选择JTable单元
table.setCellSelectionEnabled(true); //Enable single cell selection
table.addRowSelectionInterval(1, 1); // select rows
table.setColumnSelectionInterval(1, 1); // select columns
您可以尝试另一种方法,而不是使用单元渲染器。您可以像这样手动选择JTable单元
table.setCellSelectionEnabled(true); //Enable single cell selection
table.addRowSelectionInterval(1, 1); // select rows
table.setColumnSelectionInterval(1, 1); // select columns
您可以尝试以下方法:
首先,在表代码中:
HighlightCellRenderer renderer = new HighlightCellRenderer();
table.setDefaultRenderer(String.class, renderer);
table.setDefaultRenderer(Number.class, renderer);
table.setDefaultRenderer(Boolean.class, renderer);
table.setDefaultRenderer(Character.class, renderer);
然后:
公共类HighlightCellRenderer扩展了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 (row == table.getSelectedRow()) {
if (column == table.getSelectedColumn()) {
// special color
cell.setBackground(Color.GREEN);
} else {
// The selected row color in "com.jtattoo.plaf.aero.AeroLookAndFeel"
cell.setBackground(new Color(176, 196, 222));
}
} else {
// Other rows
cell.setBackground(Color.WHITE);
}
return cell;
}
}您可以尝试以下方法:
首先,在表代码中:
HighlightCellRenderer renderer = new HighlightCellRenderer();
table.setDefaultRenderer(String.class, renderer);
table.setDefaultRenderer(Number.class, renderer);
table.setDefaultRenderer(Boolean.class, renderer);
table.setDefaultRenderer(Character.class, renderer);
然后:
公共类HighlightCellRenderer扩展了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 (row == table.getSelectedRow()) {
if (column == table.getSelectedColumn()) {
// special color
cell.setBackground(Color.GREEN);
} else {
// The selected row color in "com.jtattoo.plaf.aero.AeroLookAndFeel"
cell.setBackground(new Color(176, 196, 222));
}
} else {
// Other rows
cell.setBackground(Color.WHITE);
}
return cell;
}
}您是在代码中执行此操作的吗?setDefaultRenderer(Object.class,新的CellHighlighterRenderer());完整的代码堆栈应该更好,尤其是与JTableyes相关的代码。我就这样通过了,引用的作品是正确的。请编辑您的问题,使其包含一个显示您是如何修改的。@垃圾神:您能用我发布的代码检查一下吗?您的代码目前的工作方式如下。按下按钮之前,选择单元格将使用默认高亮显示颜色。按下按钮后,选择一个单元格,将黄色作为突出显示颜色。这种行为到底是怎么回事?你是在你的代码中这样做的吗?setDefaultRenderer(Object.class,新的CellHighlighterRenderer());完整的代码堆栈应该更好,尤其是与JTableyes相关的代码。我就这样通过了,引用的作品是正确的。请编辑您的问题,使其包含一个显示您是如何修改的。@垃圾神:您能用我发布的代码检查一下吗?您的代码目前的工作方式如下。按下按钮之前,选择单元格将使用默认高亮显示颜色。按下按钮后,选择一个单元格,将黄色作为突出显示颜色。这种行为到底是怎么回事?谢谢@MadProgrammer。。。但我需要在按下按钮时突出显示单元格编号1。在按下按钮并选择单元格后,不会出现此情况。请您帮忙。对不起,请在设置渲染器后调用
table.repaint
。谢谢@MadProgrammer。。。但我需要在按下按钮时突出显示单元格编号1。在按下按钮并选择单元格后,不会出现此情况。请您帮忙好吗?对不起,请在设置渲染器后致电table.repaint
,非常感谢。这是一个很好的例子。当我只按“单击”按钮(而不是单击按钮并选择行)时,你能帮助我突出显示单元格吗?但是我会突出显示整个列。“column.setCellRenderer(cellRenderer);”因为column是TableColumn对象。如何让手机只通过点击高亮显示谢谢你这么多。这是一个很好的例子。当我只按“单击”按钮(而不是单击按钮并选择行)时,你能帮助我突出显示单元格吗?但是我会突出显示整个列。“column.setCellRenderer(cellRenderer);”因为column是TableColumn对象。如何让单元格仅通过单击按钮高亮显示请给出一个示例,说明如何应用此功能。请给出一个示例,说明如何应用