java swing JTable JProgressBar margin - PullRequest
       18

java swing JTable JProgressBar margin

2 голосов
/ 29 марта 2012

У меня такой вопрос: у меня есть 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;
}

Я вызвал метод setPreferredSize в JProgressBar, но он не работает.Я также вызвал метод setIntercellSpacing в JTable, но когда JTable'row выбрал фон, который не отображается в пространстве, это не то, что я хотел.Кто-нибудь может мне помочь?

Ответы [ 2 ]

2 голосов
/ 29 марта 2012

Средство визуализации ячейки будет заполнять всю ячейку, пока вы не реализуете свой класс 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;
    }
}
1 голос
/ 29 марта 2012

Вы должны установить для Borders в CellRenderer, EmptyBorder , как это сделать

...