2012-03-29 102 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; 
} 

我所說的JProgressBar的了setPreferredSize方法,但它簡化版,工作。 我也叫JTable的setIntercellSpacing方法,但是當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; 
    } 
}