2017-05-25 2 views
0

Je voudrais créer une JTable transparente avec un rendu de cellule personnalisé. Fondamentalement, j'ai créé un JPanel opaque (couleur rouge) et un Jscroller non opaque et JTable. Donc ce que je m'attends à voir est quelque chose de proche du rouge mais à la place je vois les cellules de la table en couleur blanche. Peux-tu m'expliquer pourquoi? Ceci est mon exemple:Créer un JTable transparent

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.util.Random; 

import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableCellRenderer; 
import javax.swing.table.DefaultTableModel; 

public class Example extends JPanel { 

    private static final long serialVersionUID = 1L; 

    int boardHeight = 200; 
    int boardWidth = 1; 

    JTable table; 
    Random random = new Random(); 

    public Example() { 
     // setOpaque(true); 
     setBackground(Color.RED); 
     setLayout(new BorderLayout()); // !! 
     DefaultTableModel model = new DefaultTableModel(boardHeight, 
       boardWidth) { 
      @Override 
      public Class<?> getColumnClass(int columnIndex) { 
       return String.class; 
      } 
      @Override 
      public boolean isCellEditable(int row, int column) { 
       return false; 
      } 
     }; 
     // !! table = new JTable(this.boardHeight, this.boardWidth); 
     table = new JTable(model); 
     for (int row = 0; row < model.getRowCount(); row++) { 
      for (int col = 0; col < model.getColumnCount(); col++) { 
       String s = random.nextBoolean() ? "1" : "2"; 
       model.setValueAt(s, row, col); 
      } 
     } 
     table.setDefaultRenderer(String.class, 
       new BoardTableCellRendererExample()); 

     table.setFocusable(true); 
     table.setShowGrid(false); 
     table.setRowMargin(0); 
     table.setIntercellSpacing(new Dimension(0, 0)); 
     table.setRowSelectionAllowed(true); 
     table.setVisible(true); 
     table.getTableHeader().setUI(null); 
     JScrollPane scroll = new JScrollPane(table); 
     table.setOpaque(false); 
     scroll.setOpaque(false); 
     scroll.setBackground(new Color(0, 0, 0, 0F)); 
     table.setBackground(new Color(0, 0, 0, 0F)); 
     this.add(scroll, BorderLayout.CENTER); 

     this.setPreferredSize(new Dimension(table.getPreferredSize().width, 
       (table.getPreferredSize().height + 85))); 

    } 

    private static void createAndShowUI() { 
     JFrame frame = new JFrame("Example"); 
     frame.getContentPane().add(new Example()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
     frame.setResizable(false); 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowUI(); 
      } 
     }); 
    } 

} 

class BoardTableCellRendererExample extends DefaultTableCellRenderer { 

    private static final long serialVersionUID = 1L; 

    public Component getTableCellRendererComponent(JTable table, Object value, 
      boolean isSelected, boolean hasFocus, int row, int col) { 

     Component c = new CellComponentExample(table, value, isSelected, 
       hasFocus, row, col); 

     return c; 
    } 
} 

class CellComponentExample extends JComponent { 

    boolean isSelected; 
    boolean hasFocus; 
    int row; 
    int col; 
    public CellComponentExample() { 
     super(); 
     setOpaque(false); 
    } 

    public CellComponentExample(JTable table, Object value, boolean isSelected, 
      boolean hasFocus, int row, int col) { 
     this.isSelected = isSelected; 
     this.hasFocus = hasFocus; 
     this.row = row; 
     this.col = col; 

    } 
    private static final long serialVersionUID = 1L; 

    @Override 
    protected void paintComponent(Graphics g) { 

     g.setColor(new Color(0, 0, 0, 0F)); 

     g.fillRect(0, 0, 100, 50); 
     g.setColor(Color.BLACK); 

     g.drawRect(0, 0, 100, 50); 
    } 

} 
+0

Copie possible de [Java swing Table transparent] (https://stackoverflow.com/questions/9769909/java-swing-table-transparency) –

+0

Si Jtable est dans JScrollPane: [Comment rendre l'arrière-plan d'une JTable transparente?] (https://stackoverflow.com/q/11609900)/243373 –

Répondre

0

Ok j'ai trouvé le problème, fondamentalement, vous devez définir opaque à de faux dans le viewport:

scroll.getViewport().setOpaque(false); 

J'espère que cela pourrait aider quelqu'un d'autre ...