2

このような私の質問:私はJTableを持っており、JProgressBarを1つの列に配置しましたが、それはセル全体を埋めます。

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の行で選択された背景がスペースに表示されない場合は、必要ありません。誰か助けてもらえますか?

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 に答える