0

我正在尝试使用标准的 java 实用程序将图像覆盖在背景图像之上。请看下面的图片...

我有似乎创建背景图像的代码(您能验证它是否真的有效吗?)并且我创建了用于显示图像的 JPanel 扩展(该类称为 ImagePanel)

但是,当程序启动时,JFrame 只显示第二个图像,然后随着窗口大小的调整而移动。

我希望最初打开窗口,背景图像占据整个窗口空间。然后,我希望在我指定的位置显示第二张图像。

import javax.swing.*;
import java.awt.*;

public class ImageTest {




public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.getContentPane().setLayout(null);

    JPanel backgroundPanel = new JPanel();
    ImageIcon backgroundImage = new ImageIcon("C:\\Documents and Settings\\Robert\\Desktop\\ClientServer\\Poker Table Art\\TableAndChairs.png");
    JLabel background = new JLabel(backgroundImage);
    background.setBounds(0, 0, backgroundImage.getIconWidth(), backgroundImage.getIconHeight());
    frame.getLayeredPane().add(background, new Integer(Integer.MIN_VALUE));
    backgroundPanel.setOpaque(false);
    frame.setContentPane(backgroundPanel);

    ImagePanel button = new ImagePanel("C:\\Documents and Settings\\Robert\\Desktop\\ClientServer\\Poker Table Art\\button.png");
    JPanel cardContainer = new JPanel(new FlowLayout());


    frame.getContentPane().add(cardContainer);

    cardContainer.add(button);
    cardContainer.setBounds(100, 600, 200, 200);

    frame.pack();
    frame.setVisible(true);
  }
}

替代文字 http://img189.imageshack.us/img189/9739/image1qi.jpg

替代文字 http://img186.imageshack.us/img186/1082/image2ll.jpg

4

2 回答 2

3

我希望最初打开窗口,背景图像占据整个窗口空间。

然后只需创建一个带有图标的 JLabel 并将标签用作框架的内容窗格。当您打包框架时,它将假定图像的大小。

然后,我希望在我指定的位置显示第二张图像。

对上述标签使用空布局。现在,您可以使用图标创建额外的 JLabel 并将它们添加到内容窗格并使用 setBounds 放置它们。

于 2010-03-07T03:14:15.467 回答
2

您可以将背景面板的首选大小设置为图像的大小:

backgroundPanel.setPreferredSize(new Dimension(
    backgroundImage.getIconWidth(), backgroundImage.getIconHeight()));

我会提倡遵循@camickr 的方法。之前没有自己实验过setBounds(),这里举个简单的例子看看效果:

import javax.swing.*;
import java.awt.*;

public class ImageTest {

    public static void main(String[] args) {

        JFrame frame = new JFrame();
        JLabel label = new JLabel(new ElliptIcon(380, 260, Color.red));
        label.setLayout(new GridLayout(2, 2));
        frame.setContentPane(label);

        for (int i = 0; i < 4; i++) {
            label.add(new JLabel(new ElliptIcon(100, 60, Color.blue)));
        }

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    private static class ElliptIcon implements Icon {

        private int w, h;
        private Color color;

        public ElliptIcon(int w, int h, Color color) {
            this.w = w;
            this.h = h;
            this.color = color;
        }

        @Override
        public void paintIcon(Component c, Graphics g, int x, int y) {
            g.setColor(color);
            g.fillOval(x, y, w, h);
        }

        @Override
        public int getIconWidth() { return w; }

        @Override
        public int getIconHeight() { return h; }
    }
}
于 2010-03-07T05:06:34.133 回答