【问题标题】:highlight the cell in jtable突出显示 jtable 中的单元格
【发布时间】:2016-12-19 08:47:04
【问题描述】:

我有这个来自 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)。

【问题讨论】:

  • 您是否在代码中执行此操作? table.setDefaultRenderer(Object.class, new CellHighlighterRenderer());您的代码的完整堆栈应该更好,尤其是与您的 JTable 相关的代码
  • 是的。我就这样通过了
  • 引用的example 工作正常。请编辑您的问题以包含一个mcve,以显示您是如何修改它的。
  • @trashgod: 请检查一下我发布的代码
  • 您的代码目前的工作方式如下。在按下按钮之前选择一个单元格使用默认的突出显示颜色。按下按钮选择一个单元格后,使用黄色作为突出显示颜色。这种行为有什么问题?

标签: java swing jtable cell highlight


【解决方案1】:

我使用这个类来设置 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;
}

【讨论】:

  • 非常感谢。那是一个很好的例子。当我按下点击按钮(而不是点击按钮并选择行)时,你能帮我突出显示单元格吗?
  • 但是我得到整列被突出显示。 " column.setCellRenderer(cellRenderer);"因为 column 是一个 TableColumn 对象。如何让单元格仅通过单击突出显示
【解决方案2】:

有多种方法可以实现这一点,在您非常特殊的情况下,您想要突出显示特定的行和列,您可以使用...

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) {

有

if (row == 0) {

渲染器更难掌握的概念之一是需要在每次迭代时完全重置组件的状态。基本上这意味着,不假设已为当前迭代正确设置属性,并确保您未使用的默认值...

查看Using Custom Renderers了解更多详情...

【讨论】:

  • 谢谢@MadProgrammer ...但我需要在按下按钮时突出显示单元格编号1。不是在按下按钮并选择单元格后。你能帮忙吗?
  • 抱歉,设置好渲染器后调用table.repaint
【解决方案3】:

你可以试试这个:

一、表中代码:

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;
}

}

【讨论】:

    【解决方案4】:

    您可以尝试不同的方法,而不是使用单元格渲染器,您可以像这样手动选择 JTable 单元格

        table.setCellSelectionEnabled(true); //Enable single cell selection
    
        table.addRowSelectionInterval(1, 1); // select rows
        table.setColumnSelectionInterval(1, 1); // select columns
    

    【讨论】:

    • 请举个例子来说明如何应用它。
    猜你喜欢
    • 2016-08-20
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    相关资源
    最近更新 更多