2012-03-29 5 views
2

Ma question comme ceci: J'ai une JTable, je mets un JProgressBar dans une colonne, mais il remplit la cellule complète.java swing JTable JProgressBar marge

Je veux juste définir la taille de JProgressBar afin qu'il montre avec marge avec la bordure de la cellule.

Code Mon 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; 
} 

J'ai appelé la méthode setPreferredSize de JProgressBar, mais il does't travail. J'ai également appelé la méthode setIntercellSpacing de JTable, mais lorsque l'arrière-plan sélectionné par JTable'row n'apparaît pas dans l'espace, ce n'est pas ce que je voulais. Quelqu'un peut-il m'aider?

Répondre

2

Le CellRenderer remplira la cellule entière, jusqu'à ce que vous mettre en œuvre votre classe TableUI. La raison pour laquelle setPreferredSize() ne fonctionne pas, c'est parce que le rendu de cellule n'utilise pas la taille préférée. Et la taille préférée ne devrait jamais définir explicitement, devrait remplacer la méthode getPreferredSize().

Pour ajouter la marge est facile, il suffit de mettre la barre de progression dans le panneau, puis réglez la bordure au panneau. Et si vous voulez une couleur différente lorsque vous sélectionnez ou désélectionnez, vous devez également l'implémenter.

Voici le code.

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

vous devez définir pour Borders dans le CellRenderer, EmptyBorder est ainsi comment le faire

Questions connexes