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

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

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

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

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

在此处输入图像描述

 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不仅填充了背景,还渲染了表格内容。

在此处输入图像描述

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

其中很多都将归结为您的实际需求