2

我的问题是这样的:我有一个 JTable,我将 JProgressBar 放在一个列中,但它填满了整个单元格。

我只想设置 JProgressBar 的大小,以便它显示带有单元格边框的边距。

我的 JProgressBar 代码:

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

我已经调用了 JProgressBar 的 setPreferredSize 方法,但它不起作用。我也调用了 JTable 的 setIntercellSpacing 方法,但是当 JTable'row 选择的背景不显示在空间中时,这不是我想要的。谁能帮我?

4

2 回答 2

2

单元格渲染器将填充整个单元格,直到您实现 TableUI 类。setPreferredSize() 不起作用的原因是单元格渲染器没有使用首选大小。并且首选大小不应该永远明确设置,应该覆盖 getPreferredSize() 方法。

添加边距很容易,只需将进度条放入面板,然后将边框设置为面板。如果您想在选择或取消选择时使用不同的颜色,您也需要实现它。

以下是代码。

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;
    }
}
于 2012-03-29T06:50:19.493 回答
1

你必须在 中设置BordersCellRendererEmptyBorder如何做到的

于 2012-03-29T06:49:11.510 回答