【问题标题】:Custom JComponent not showing up on JLayeredPane自定义 JComponent 未显示在 JLayeredPane 上
【发布时间】:2025-12-10 04:25:01
【问题描述】:

我正在尝试用 Java 创建一个国际象棋界面,我正在使用 JLayeredPane 将棋子放在我的棋盘图像之上。问题是这些片段没有添加到分层窗格中。

这是我的DragImage 类的代码(每个部分都将是此类的一个实例,您可以将其拖放到棋盘上)。

class DragImage extends JComponent implements MouseMotionListener {
        private static final long serialVersionUID = 1L;
        int imageWidth = 52, imageHeight = 52;
        int imageX, imageY;
        Image img;

        public DragImage(Image i) {
            img = i;
            repaint();
            addMouseMotionListener(this);
        }

        public void mouseDragged(MouseEvent e) {
            imageX = e.getX();
            imageY = e.getY();
            repaint();
        }

        public void mouseMoved(MouseEvent e) {
        }

        public void paint(Graphics g) {
            Graphics2D g2 = (Graphics2D) g;

            g2.drawImage(img, imageX, imageY, this);
        }

    }

这是JPanel的代码。

图片地址正确,但面板上没有显示。

class MyPanel extends JPanel {
        private JLayeredPane layeredPane;
        private JLabel imageContainer = new JLabel();
        private ImageIcon img;

        MyPanel() {
            super();
            img = new ImageIcon("chessboard.png");
            this.imageContainer.setIcon(img);
            this.layeredPane = new JLayeredPane();
            layeredPane.setPreferredSize(new Dimension(416, 416));
            layeredPane.add(imageContainer, 50);
            imageContainer.setBounds(0, 0, img.getIconWidth(),
                    img.getIconHeight());
            int pozx = 52, pozy = 52;
            for (int i = 0; i < 8; i++) {
                for (int j = 0; j < 8; j++) {
                    if(tabla[i][j]!="--"){
                    DragImage img = new DragImage(Toolkit.getDefaultToolkit().getImage("pieces\\" + tabla[i][j] + ".png"));
                    //System.out.println("pieces\\" + tabla[i][j] + ".png");
                    img.setBounds(pozx,pozy,img.imageWidth,img.imageHeight);
                    layeredPane.add(img,100);   //this doesn't work
                    }
                    pozx+=52;
                }
                pozy+=52;
                pozx=52;
            }

            this.add(layeredPane);
        }
}

...

frame = new JFrame();
frame.setVisible(true);
frame.setSize(800, 600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel = new MyPanel();
frame.add(panel);
frame.pack();

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE
  • 创建框架、设置大小、添加面板、打包、设置可见。
  • “图片地址正确,但面板上没有显示。” 真的吗?试试这个实验。 String path = "pieces\\" + tabla[i][j] + ".png"; File f = new File(path); System.out.println("File exists: " + file.exists());。我会打赌打印出File exists: false(在你修正任何小错别字之后。这可能会阻止它编译)..
  • 另请参阅examplevariation
  • @AndrewThompson 这对所有文件都是正确的,所以这不是问题......

标签: java swing jcomponent jlayeredpane


【解决方案1】:

首先使用分层窗格,然后附加两个面板,一个用于图像,另一个面板用于组件,第二个面板必须是调色板层,然后组件才会出现..

【讨论】: