2

My question like this: I have a JTable, I put a JProgressBar in one Column, but it fill the full cell.

I just want to set JProgressBar's size so that it shows with margin with cell border.

My JProgressBar code:

private final JProgressBar b;
public ProgressBarRender(){
    super();
    setOpaque(true);
    b = new JProgressBar();

    b.setStringPainted(true);
    b.setMinimum(0);
    b.setMaximum(100);

    b.setBorderPainted(true);
    b.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));
    //b.setPreferredSize(new Dimension(1,1));
    b.setOpaque(true);
    //TODO
    //b.setForeground(Color.magenta);
}
public Component getTableCellRendererComponent(JTable table, Object value,
        boolean isSelected, boolean hasFocus, int row, int column) {
    Integer i = (Integer) value;
    b.setValue(i);
    return b;
}

I have called JProgressBar's setPreferredSize method, but it does't work. I also called JTable's setIntercellSpacing method, but when JTable'row selected background not show in the space,it is't I wanted. Can any one help me?

mKorbel
  • 109,525
  • 20
  • 134
  • 319
chenhai
  • 35
  • 4

2 Answers2

2

The cell renderer will fill in the whole cell, until you implement your TableUI class. The reason why setPreferredSize() is not working, it is because the cell renderer not use preferered size. And preferred size should not never to explicitly set, should overwrite the getPreferredSize() method.

To add the margin is easy, just put the progress bar into the panel, then set the border to panel. And if you want to different color when selected or deselected, you need to implement it too.

Following is the code.

public static void main(String[] args)
{
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setSize(800, 600);

    JTable table = new JTable(new Object[][]{{50, 50},{50, 50}} , new Object[]{"1", "2"});
    table.setDefaultRenderer(Object.class, new ProgressBarRender());
    frame.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);

    frame.setVisible(true);
}

public static class ProgressBarRender extends DefaultTableCellRenderer
{
    private final JPanel panel;
    private final JProgressBar b;

    public ProgressBarRender()
    {
        super();
        setOpaque(true);
        b = new JProgressBar();

        b.setStringPainted(true);
        b.setMinimum(0);
        b.setMaximum(100);

        b.setBorderPainted(true);
        b.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));
        //b.setPreferredSize(new Dimension(1,1));
        b.setOpaque(true);

        panel = new JPanel(new BorderLayout());
        panel.add(b, BorderLayout.CENTER);
        panel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10));

        //TODO
        //b.setForeground(Color.magenta);
    }

    public Component getTableCellRendererComponent(JTable table, Object value,
                                                   boolean isSelected, boolean hasFocus, int row, int column)
    {
        Integer i = (Integer)value;
        b.setValue(i);
        if (isSelected)
        {
            b.setBackground(Color.BLUE);
            panel.setBackground(Color.DARK_GRAY);
        }
        else
        {
            b.setBackground(Color.GREEN);
            panel.setBackground(Color.LIGHT_GRAY);
        }
        return panel;
    }
}
chenyi1976
  • 1,104
  • 9
  • 17
1

you have to set for Borders in the CellRenderer, EmptyBorder is way how to do it

mKorbel
  • 109,525
  • 20
  • 134
  • 319