2012-03-29 2 views
2

Мой вопрос: У меня есть JTable, я помещаю JProgressBar в один столбец, но он заполняет полную ячейку.java swing JTable JProgressBar margin

Я просто хочу установить размер 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, но это does't работу. Я также назвал метод setIntercellSpacing JTable, но когда выбранный фон JTable'row не отображается в пространстве, это не так. Может ли кто-нибудь мне помочь?

ответ

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

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

Смежные вопросы