如何使用JLabel在一个程序中添加相同的图像?

时间:2014-05-17 18:12:23

标签: java swing layout jlabel null-layout-manager

我正在使用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);"再次,我没有看到首先添加图像。每个新图片都会删除最后一个图标。

3 个答案:

答案 0 :(得分:2)

background是JLabel,您通常不会将一个JLabel添加到另一个JLabel。但是如果你必须这样做,请确保将充当容器的JLabel作为一个体面的布局管理器,以便它能够以智能方式显示添加组件。默认情况下,JLabel没有布局(null布局),添加的任何组件都需要指定要显示的大小和位置。虽然你可以这样做 - 指定添加的所有组件的界限,我建议你不要这样做,因为这会使非常不灵活的GUI,虽然它们在一个平台上看起来很好但看起来很糟糕在大多数其他平台或屏幕分辨率上,很难更新和维护。相反,您将需要学习和学习布局管理器,然后嵌套JPanel或其他组件,每个组件都使用自己的布局管理器来创建令人满意的复杂GUI,这些GUI在所有操作系统上都很好看。

考虑使用基本的FlowLayout来查看我的意思:

background.setLayout(new FlowLayout());

请注意

答案 1 :(得分:0)

我想在图标上添加图标。

以下是使用Graphics.drawImage()在覆盖Graphics方法中的JLabel的现有paintComponent()中绘制图片的代码。

有关详细信息,请阅读内联评论。

示例代码:

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

以上代码是此帖How to draw an image over another image?的修改代码。

截图:

enter image description here

答案 2 :(得分:-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作为标签的容器