创建透明的 JTable



我想创建一个带有自定义单元格渲染的透明 JTable。 基本上我创建了一个不透明的JPanel(红色(和一个不透明的Jscroller和JTable。因此,我希望看到的是接近红色的东西,但我看到的是白色的表格单元格。你能解释一下为什么吗?这是我的例子:

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);
    }
}
好的,

我发现问题基本上你必须在视口中将不透明设置为false:

scroll.getViewport().setOpaque(false);

我希望这可以帮助其他人...

最新更新