Question

I have a JTable showing values from a model allowing integer values 0, 1 and 2. The values are shown in a 9 by 9 grid (like a sudoku game board).

My question is: How do I hide the zero values from the GUI?

That is, in the table cells that has a model value of zero, I dont want the GUI to show any value. The model must however contain the zero value due to calculations being done.

I have tried to use a DefaultTableCellRenderer and setting the cell component to invisible by using setVisible(true) (as in this question), but I get no result.

I have managed to use a DefaultTableCellRenderer to toggle any cell's background color depending on the model state (if a cell is considered "negative"). I do want to keep the background color visible.

I am a bit new to java, so maybe this is just an update issue?

Here is my DefaultTableCellRenderer:

private static class GameTableRenderer extends DefaultTableCellRenderer
{
    private static final long serialVersionUID = 1L;

    @Override
    public Component getTableCellRendererComponent(
        JTable table, Object value, boolean isSelected,
        boolean hasFocus, int row, int column)
    {
        Component c = super.getTableCellRendererComponent(
            table, value, isSelected, hasFocus, row, column);

        GameModel model = (GameModel) table.getModel();

        if(model.isNegative(row, column))
            c.setBackground(Color.lightGray);
        else
            c.setBackground(Color.white);

        if(model.getAbsoluteValueAt(row, column) == 0)
            c.setVisible(false);
        else
            c.setVisible(true);

        return c;
    }
}

The "getAbsoluteValueAt" method returns an integer 0, 1 or 2. The change of background color works perfectly fine.

My model extends AbstractTableModel, and the JTable uses the renderer like this:

table.setDefaultRenderer(int.class, renderer);

I hope this information is enough to explain my problem and the efforts I so far have put in. Please ask for more information and I will provide it.

Thank you in advance. /Fredrik

Was it helpful?

Solution 2

Instead of making the component invisible, set its text to the empty string:

if (model.getAbsoluteValueAt(row, column) == 0) {
    ((JLabel) c).setText("");
}

OTHER TIPS

Or you can use the following:

 if(model.getAbsoluteValueAt(row, column) == 0)
        c.setForeground(c.getBackground());
    else
        c.setForeground(Color.BLACK);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top