有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在JTable中添加背景图像

我使用了JInternalFrame,因为我添加了JTable。现在我想在JTable中显示背景图像。因此,我在JScrollPane's自定义代码中添加了以下代码

jScrollPane1 = new javax.swing.JScrollPane(ViewBalanceReportTable) {{
    setOpaque(false);
    getViewport().setOpaque(false);
}
@Override
protected void paintComponent(Graphics g) {
    final int imageWidth = image.getIconWidth();
    final int imageHeight = image.getIconHeight();
    final Dimension d = getSize();
    final int x = (d.width - imageWidth)/2;
    final int y = (d.height - imageHeight)/2;
    g.drawImage(image.getImage(), x, y, null, null);
    super.paintComponent(g);
}

}

但它仍然没有显示背景图像,有人能帮我吗


共 (1) 个答案

  1. # 1 楼答案

    基本上,您需要确保位于框架顶部的所有内容都是透明的(不透明==false)

    这个表是一个特例,它不倾向于遵守opaque设置,因为这很容易。相反,我们可以通过使用透明的颜色来欺骗它

    如果要在任何类型的框架上绘制,最好替换内容窗格。这将允许您在内容区域内进行绘制,而不是在框架边框或菜单等使用的区域内进行绘制

    enter image description here

    public class TableWithBackground {
    
        public static void main(String[] args) {
            new TableWithBackground();
        }
    
        public TableWithBackground() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
                    JDesktopPane desktopPane = new JDesktopPane();
                    BackgroundInternalFrame backgroundInternalFrame = new BackgroundInternalFrame();
                    desktopPane.add(backgroundInternalFrame);
                    try {
                        backgroundInternalFrame.setMaximum(true);
                    } catch (PropertyVetoException ex) {
                        ex.printStackTrace();
                    }
    
                    JFrame frame = new JFrame();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    frame.add(desktopPane);
                    frame.setSize(200, 200);
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class BackgroundInternalFrame extends JInternalFrame {
    
            public BackgroundInternalFrame() {
                super("Hello", true, true, true, true);
    
                setSize(100, 100);
                setLocation(10, 10);
                setVisible(true);
    
                setContentPane(new TransparentContentPane());
    
                JTable table = new JTable();
                table.setModel(new javax.swing.table.DefaultTableModel(
                        new Object[][]{
                            {null, null, null, null},
                            {null, null, null, null},
                            {null, null, null, null},
                            {null, null, null, null}
                        },
                        new String[]{
                            "Title 1", "Title 2", "Title 3", "Title 4"
                        }));
    
                JScrollPane scrollPane = new JScrollPane(table);
                setLayout(new BorderLayout());
                add(scrollPane);
    
                scrollPane.setOpaque(false);
                scrollPane.getViewport().setOpaque(false);
                table.setOpaque(false);
                table.setBackground(new Color(255, 255, 255, 0));
            }
        }
    
        public class TransparentContentPane extends JPanel {
    
            public TransparentContentPane() {
                setOpaque(false);
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                Graphics2D g2d = (Graphics2D) g.create();
                g2d.setColor(getBackground());
                g2d.fillRect(0, 0, getWidth(), getHeight());
                g2d.setColor(Color.RED);
                g2d.drawLine(0, 0, getWidth(), getHeight());
                super.paintComponent(g2d); //To change body of generated methods, choose Tools | Templates.
                g2d.dispose();
            }
        }
    }
    

    图像表

    一个“更简单”的解决方案可能是将图像直接渲染到桌子的背景上。这意味着图像将成为表格的一部分,并随之滚动

    这有点棘手,因为JTable#paintComponent不仅会填充背景,还会呈现表格内容

    enter image description here

    public class TableBackground {
    
        private BufferedImage background;
    
        public static void main(String[] args) {
            new TableBackground();
        }
    
        public TableBackground() {
            try {
                background = ImageIO.read(new File("C:/Users/swhitehead/Documents/My Dropbox/issue362.jpg"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
    
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
                    JDesktopPane desktopPane = new JDesktopPane();
                    JInternalFrame ittyFrame = new JInternalFrame("Hello", true, true, true, true);
                    ittyFrame.setSize(100, 100);
                    ittyFrame.setLocation(0, 0);
                    ittyFrame.setVisible(true);
                    desktopPane.add(ittyFrame);
                    try {
                        ittyFrame.setMaximum(true);
                    } catch (PropertyVetoException ex) {
                        ex.printStackTrace();
                    }
    
                    Object[][] data = new Object[50][4];
                    for (int row = 0; row < 50; row++) {
                        for (int col = 0; col < 4; col++) {
                            data[row][col] = col + "." + row;
                        }
                    }
    
                    JTable table = new BackgroundImageTable();
                    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                    table.setModel(new javax.swing.table.DefaultTableModel(
                                    data,
                                    new String[]{
                                        "Title 1", "Title 2", "Title 3", "Title 4"
                                    }));
    
                    table.setForeground(Color.WHITE);
                    JScrollPane scrollPane = new JScrollPane(table);
                    ittyFrame.setLayout(new BorderLayout());
                    ittyFrame.add(scrollPane);
    
                    JFrame frame = new JFrame();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    frame.add(desktopPane);
                    frame.setSize(200, 200);
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class BackgroundInternalFrame extends JInternalFrame {
    
            public BackgroundInternalFrame() {
                super("Hello", true, true, true, true);
    
                setSize(100, 100);
                setLocation(10, 10);
                setVisible(true);
    
                setContentPane(new TransparentContentPane());
    
                JTable table = new JTable();
                table.setModel(new javax.swing.table.DefaultTableModel(
                                new Object[][]{
                                    {null, null, null, null},
                                    {null, null, null, null},
                                    {null, null, null, null},
                                    {null, null, null, null}
                                },
                                new String[]{
                                    "Title 1", "Title 2", "Title 3", "Title 4"
                                }));
    
                JScrollPane scrollPane = new JScrollPane(table);
                setLayout(new BorderLayout());
                add(scrollPane);
    
                scrollPane.setOpaque(false);
                scrollPane.getViewport().setOpaque(false);
                table.setOpaque(false);
                table.setBackground(new Color(255, 255, 255, 0));
            }
        }
    }
    

    粘性视口

    另一个选项是创建自定义视口。这允许您在大量其他组件的后面呈现内容。这将与您之前遇到的问题相同。桌子及其背景必须设置为透明

    这也意味着,通过一些巧妙的工作,你要么“坚持”图像,要么“跟随”内容,这取决于你需要什么

    public class TableBackground {
    
        private BufferedImage background;
    
        public static void main(String[] args) {
            new TableBackground();
        }
    
        public TableBackground() {
            try {
                background = ImageIO.read(new File("C:/Users/swhitehead/Documents/My Dropbox/issue362.jpg"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
    
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
                    JDesktopPane desktopPane = new JDesktopPane();
                    JInternalFrame ittyFrame = new JInternalFrame("Hello", true, true, true, true);
                    ittyFrame.setSize(100, 100);
                    ittyFrame.setLocation(0, 0);
                    ittyFrame.setVisible(true);
                    desktopPane.add(ittyFrame);
                    try {
                        ittyFrame.setMaximum(true);
                    } catch (PropertyVetoException ex) {
                        ex.printStackTrace();
                    }
    
                    Object[][] data = new Object[50][4];
                    for (int row = 0; row < 50; row++) {
                        for (int col = 0; col < 4; col++) {
                            data[row][col] = col + "." + row;
                        }
                    }
    
                    JTable table = new JTable();
                    table.setForeground(Color.WHITE);
                    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                    table.setModel(new javax.swing.table.DefaultTableModel(
                                    data,
                                    new String[]{
                                        "Title 1", "Title 2", "Title 3", "Title 4"
                                    }));
    
                    JScrollPane scrollPane = new JScrollPane();
                    table.setOpaque(false);
                    table.setBackground(new Color(255, 255, 255, 0));
                    scrollPane.setViewport(new ImageViewport());
                    scrollPane.setViewportView(table);
                    ittyFrame.setLayout(new BorderLayout());
                    ittyFrame.add(scrollPane);
    
                    JFrame frame = new JFrame();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    frame.add(desktopPane);
                    frame.setSize(200, 200);
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class ImageViewport extends JViewport {
    
            public ImageViewport() {
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                if (background != null) {
                    Rectangle bounds = getViewRect();
                    int x = Math.max(0, (bounds.width - background.getWidth()) / 2);
                    int y = Math.max(0, (bounds.height - background.getHeight()) / 2);
                    g.drawImage(background, x, y, this);
                }
            }
        }
    }
    

    很多都取决于你的实际需求