Java 突出显示jtable中的单元格

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

我有stackoverflow的代码:

但当我用它突出显示一个单元格时,它会给出错误的动作,就像整个数据丢失一样。我不熟悉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;
}
首先使用默认的表格单元格渲染器为单元格创建颜色样式

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对象。如何让单元格仅通过单击按钮高亮显示请给出一个示例,说明如何应用此功能。请给出一个示例,说明如何应用