有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在使用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) 个答案

  1. # 1 楼答案

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

    只考虑使用基本的流布局来理解我的意思:

    background.setLayout(new FlowLayout());
    

    注意你

  2. # 2 楼答案

    我想在图标上添加图标

    下面是使用Graphics.drawImage()在重写的paintComponent()方法中JLabel的现有Graphics中绘制图像的代码

    有关更多信息,请阅读内联评论

    示例代码:

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

  3. # 3 楼答案

    不能多次添加同一组件

    我建议你这样做:

    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 equals the number of icon you want to display

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