在JTable中添加背景图像 [英] Add background image in JTable

查看:111
本文介绍了在JTable中添加背景图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am using a JInternalFrame in that i have added JTable. Now i want to show background image in JTable. so i have added following code in the JScrollPane's customize code.

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);
}

}

但仍然没有显示任何人都可以帮我这个背景图片

but still it is not showing the background image can any one help me on this

推荐答案

基本上,你需要确保一切位于框架顶部的是透明的(opaque == false)。

Basically, you need to make sure that EVERYTHING that sits on top of the frame is transparent (opaque == false).

该表是特殊情况,它不倾向于尊重 opaque 设置,因为这很容易。相反,我们也可以通过使用透明颜色来欺骗它。

The table is a special case, it doesn't tend to respect the opaque setting, because that would be easy. Instead, we can trick it by also using a transparent color.

如果你想要绘制到任何类型的框架,你更好地替换内容窗格。这将允许您在内容区域内绘制,而不是在框架的边框或菜单等区域内绘制。

You are AWLAYS better of replacing the content pane if you want to paint to any kind of frame. This will allow you to paint within the content area and not in areas used by things like the frame's border or menus.

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();
        }
    }
}



图像表



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

Image Table

Possibly a "simpler" solution would be to render the image directly onto the background the table. This means that the image becomes apart of the table and will scroll with it.

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

This is a little tricky, as JTable#paintComponent not only fills the background, but also renders the tables content.

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));
        }
    }
}



粘性视口



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

Sticky Viewport

Your other option is to create a custom viewport. This allows you to render the content behind a verity of other components. This will run into the same issue's you had before. The table and it's background must be set to transparent.

这也意味着,通过一些聪明的工作,您可以将图像粘贴或跟随内容,取决于你需要的东西。

It also means, that with some clever work, you either have the image "stick" or "follow" the content, depending on what you need.

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);
            }
        }
    }
}

A很多都会归结为你的实际需求

A lot of it will come down to your actual requirements

这篇关于在JTable中添加背景图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆