2

我正在使用 Swing,我正在尝试在程序中添加一些图片。

field = new JFormattedTextField(formatter);

ImageIcon icon = new ImageIcon("background.png"),
          icon1 = new ImageIcon("1.png");

JLabel background = new JLabel(icon); 
JLabel firstIcon = new JLabel(icon1);

JPanel center = new JPanel(new GridLayout(0, 1));


    public void initComponents() {
          this.getContentPane().add(center, BorderLayout.CENTER);

center.add(background);

field.setBounds(50,50);
background.add(field);
background.add(fristIcon);
}

使用此代码一切正常,但是当我尝试添加相同的图片“background.add(fristIcon);” 再次,我没有看到先添加的图像。每个新图像都在删除最后一个图标。

4

3 回答 3

2

background 是一个 JLabel,您通常不会将一个 JLabel 添加到另一个 JLabel。但是,如果您必须这样做,请务必为充当容器的 JLabel 提供一个体面的布局管理器,以便它可以以智能的方式显示添加的组件。默认情况下,JLabels 没有布局(空布局),添加的任何组件都需要指定其大小和要显示的位置。虽然你可以这样做——指定添加的所有组件的边界,但我建议你不要这样做,因为这会导致非常不灵活的 GUI,虽然它们在一个平台上看起来不错,但在大多数其他平台或屏幕上看起来很糟糕决议,并且很难更新和维护。相反,您将需要学习和学习布局管理器,然后嵌套 JPanel 或其他组件,

考虑只使用基本的 FlowLayout 来了解我的意思:

background.setLayout(new FlowLayout());

注意你

于 2014-05-17T18:20:01.077 回答
0

I want to add icon over icon.

Here is the code that is using Graphics.drawImage() to draw a image in existing Graphics of the JLabel within overridden paintComponent() method.

For more info read inline comments.

Sample code:

// back ground image
URL url1 = new URL(
        "https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcQu3FFM1kR-aeYFjJIqebgusVZNM6uG-a0F4Z_0IPopEqfSZwzBBA");
final BufferedImage bg = ImageIO.read(url1);

// foreground image
URL url2 = new URL("https://cdn1.iconfinder.com/data/icons/supermariopack/Mario.png");
final BufferedImage fg = ImageIO.read(url2);

// re size the image
final BufferedImage scaled = new BufferedImage(fg.getWidth() / 2, fg.getHeight() / 2,
        BufferedImage.TYPE_INT_RGB);
Graphics g = scaled.getGraphics();
g.drawImage(fg, 0, 0, scaled.getWidth(), scaled.getHeight(), null);
g.dispose();

// create a JLabel with back ground image
final JLabel label = new JLabel(new ImageIcon(bg)) {
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        // draw the foreground image
        g.drawImage(scaled, 50, 50, null);
    }
};

JOptionPane.showMessageDialog(null, label);

The above code is modified code of this post How to draw an image over another image?.

Screenshot:

enter image description here

于 2014-05-17T19:37:53.570 回答
-1

您不能多次添加相同的组件。

我建议你这样进行:

for(int i=0;i<N;i++){
   JLabel img=new JLabel(icon1);
   switch(i){
   case 0:
      img.setBounds(x,y,w,h);
      break;
   case 1:
      img.setBounds(x,y,w,h);
      break;
   default:
      break;
   }
   background.add();
}

N 等于您要显示的图标数

但不建议将 JLabel 作为容器。为此,我建议您使用 JPanel 作为标签的容器

于 2014-05-17T18:47:28.637 回答