Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更改单元格颜色而不更改其他单元格中的颜色(Jtable)_Java_Swing_Colors_Jtable_Tablecellrenderer - Fatal编程技术网

Java 更改单元格颜色而不更改其他单元格中的颜色(Jtable)

Java 更改单元格颜色而不更改其他单元格中的颜色(Jtable),java,swing,colors,jtable,tablecellrenderer,Java,Swing,Colors,Jtable,Tablecellrenderer,假设我们有一个31列10行的JTable。 我想把第2列第4行的颜色改成红色。 在我这样做之后,改变另一个细胞的颜色,而不失去我以前细胞的颜色 我尝试了以下方法,但没有成功: public class CellR extends DefaultTableCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelec

假设我们有一个31列10行的JTable。 我想把第2列第4行的颜色改成红色。 在我这样做之后,改变另一个细胞的颜色,而不失去我以前细胞的颜色

我尝试了以下方法,但没有成功:

public class CellR extends DefaultTableCellRenderer {

     public Component getTableCellRendererComponent(JTable table,
            Object value, boolean isSelected, boolean hasFocus,
            int row, int column) {

        setForeground(Color.white);
        if(row == TestHotel.v.getRow()  && column == TestHotel.v.getCol()){
            // Only for specific cell
            // c.setFont(/* special font*/);
            // you may want to address isSelected here too
            setForeground(Color.BLACK);
            setBackground(Color.RED);
         } 
         return this;
}

如果我在渲染器第一次工作时调用它。。。但是,如果我想更改另一个单元格颜色,我就失去了第一个单元格颜色。

您需要在您想要的列上设置单元格渲染器

如果您希望第2行第4列的单元格颜色为红色,则应在第4列设置渲染器。甚至可以在所有列上设置渲染器


然后,您所要做的就是对行进行if检查。即如果(行==4)。但是我假设您将从TestHotel.v对象中获取值。

表格和列表中的单元格渲染器就像“戳记”一样使用一个组件用于绘制所有单元。另见。如果要保留有关“突出显示”单元格的信息,必须以某种方式存储它们

示例(根据注释进行扩展):


如果您希望单元格具有不同的颜色,可以使用将特定的
(表示单元格的行/列)映射到
颜色
对象的
映射
来替换
集合。

这几乎不足以调试您的问题。请提供一个.agree with SSCCE/MCVE,short,runnable,compileable,在局部变量中为JTable/XxxTableModel提供硬编码值,因为看起来像是
if(row==TestHotel.v.getRow()&&column==TestHotel.v.getCol()){
返回银河系中的星星数此表单中的代码可能适用于未排序或未筛选的JTables视图每次修改时都会重新绘制表格。然后需要保存所有要更改颜色的单元格。但是如果我在特定列中设置,请说数字2,第一次更改c如果下一次我想更改第2列中的11行,我将取消以前的编辑…我想..您只需要更新表updateUI(),它应该尊重对模型的任何更改。如果TestHotl.v中的值发生了更改,那么您应该看到这些更改。谢谢..这正是我想要的..:)您能给我一点关于如何使用2种颜色制作它的更多信息吗…(我是这方面的乞丐)@user3801896我根据Lyokay扩展了答案…我明白了..谢谢你的帮助:D@Marco13不同意(
JTable table,Object value,boolean isSelected,boolean hasFocus,
int row,int column)太多的工作,易于使用的prepareRenderer,通过测试注意,对JTables视图的更改应该是,必须包装到if中(table.getRowCount>0)@mKorbel不完全确定您的意思。可以重写此方法,但单元格->颜色映射必须存储在某个位置(我更喜欢使用渲染器而不是子类化JTable,但这可能是这里的一个细节…)
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;

public class CellRendererTest
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI()
    {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        String[] columnNames = {
            "First Name", "Last Name", "Sport" };
        Object[][] data = {
            {"Kathy", "Smith", "Snowboarding" },
            {"John", "Doe", "Rowing" },
            {"Sue", "Black", "Knitting"},
            {"Jane", "White", "Speed reading"},
            {"Joe", "Brown", "Pool"}
        };
        final JTable table = new JTable(data, columnNames);

        final ColoringCellRenderer cellRenderer = new ColoringCellRenderer(); 
        TableColumnModel columnModel = table.getColumnModel();
        int cc = columnModel.getColumnCount();
        for (int c=0; c<cc; c++)
        {
            TableColumn column = columnModel.getColumn(c);
            column.setCellRenderer(cellRenderer);
        }
        JScrollPane scrollPane = new JScrollPane(table);
        f.getContentPane().setLayout(new BorderLayout());
        f.getContentPane().add(scrollPane, BorderLayout.CENTER);

        JButton addRandomColorButton = new JButton("Add random color");
        addRandomColorButton.addActionListener(new ActionListener()
        {
            private Random random = new Random(0);
            @Override
            public void actionPerformed(ActionEvent e)
            {
                int rows = table.getRowCount();
                int cols = table.getColumnCount();
                int row = random.nextInt(rows);
                int col = random.nextInt(cols);
                int r = random.nextInt(255);
                int g = random.nextInt(255);
                int b = random.nextInt(255);
                cellRenderer.setCellColor(row, col, new Color(r,g,b));
                table.repaint();
            }
        });
        f.getContentPane().add(addRandomColorButton, BorderLayout.SOUTH);

        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}


class ColoringCellRenderer extends DefaultTableCellRenderer
{
    private final Map<Point, Color> cellColors = new HashMap<Point, Color>();

    void setCellColor(int r, int c, Color color)
    {
        if (color == null)
        {
            cellColors.remove(new Point(r,c));
        }
        else
        {
            cellColors.put(new Point(r,c), color);
        }
    }

    private Color getCellColor(int r, int c)
    {
        Color color = cellColors.get(new Point(r,c));
        if (color == null)
        {
            return Color.WHITE;
        }
        return color;
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
        boolean isSelected, boolean hasFocus, int row, int column)
    {
        super.getTableCellRendererComponent(
            table, value, isSelected, hasFocus, row, column);
        Color color = getCellColor(row, column);
        setBackground(color);
        return this;
    }
}
class ColoringCellRenderer extends DefaultTableCellRenderer
{
    private final Set<Point> highlightedCells = new HashSet<Point>();

    void setHighlighted(int r, int c, boolean highlighted)
    {
        if (highlighted)
        {
            highlightedCells.add(new Point(r,c));
        }
        else
        {
            highlightedCells.remove(new Point(r,c));
        }
    }

    private boolean isHighlighted(int r, int c)
    {
        return highlightedCells.contains(new Point(r,c));
    }

    public Component getTableCellRendererComponent(JTable table, Object value,
        boolean isSelected, boolean hasFocus, int row, int column)
    {

        if (isHighlighted(row,  column))
        {
            setForeground(Color.BLACK);
            setBackground(Color.RED);
        }
        else
        {
            setForeground(Color.BLACK);
            setBackground(Color.WHITE);
        }
        return this;
    }
}
ColoringCellRenderer r = new ColoringCellRenderer();
// Assign renderer to table...
...

// Later, highlight cells:
r.setHighlighted(4,2,true);
r.setHighlighted(6,1,true);
r.setHighlighted(1,5,false);
...