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