【问题标题】:How to Set a smaller ImageIcon on a larger imageIcon on a JButton ? while i want the both images to be visible如何在 JButton 上的较大 imageIcon 上设置较小的 ImageIcon?虽然我希望这两个图像都可见
【发布时间】:2011-09-04 22:11:18
【问题描述】:

我想为 Tanks Game 编写代码,但在现有 ImageIcon 上设置 tank.jpg 时遇到问题,因为我希望这两个图像都可见并显示给用户,就像:

JButton block = new JButton () ;
block.setIcon(new ImageIcon("ground.png")) ;// sets the first image 
block.setIcon(new ImageIcon("tank.png")) ;// sets the second image

但是如果我这样编写代码,第二个 setIcon 将替换第一个,这是我不想要的,任何想法如何一次在 JButton 上有 2 个图标?谢谢

【问题讨论】:

    标签: java swing icons jbutton


    【解决方案1】:

    Compound Icon 为您提供更多图标绘制方式的灵活性。

    【讨论】:

      【解决方案2】:

      您需要在设置按钮图标之前组合图像。你如何做到这一点取决于你想如何组合它们。你想要一个在另一个之上,还是你想要它们并排?无论哪种方式,您都需要执行以下操作:

      BufferedImage groundImage = ImageIO.read(new File("ground.png");
      BufferedImage tankImage = ImageIO.read(new File("tank.png"));
      Graphics2 g2 = groundImage.createGraphics();
      g2.drawImage(x, y, tankImage);
      

      然后,groundImage 将从坐标 (x, y) 开始在其顶部绘制 tankImage。此时您可以将按钮图标设置为groundImage。 (警告:我刚刚在 iPad 上回答了这个问题,所以代码可能完全正确)

      【讨论】:

      • 哇,我花了很长时间才回答。霍华德的答案更好。
      【解决方案3】:

      最简单的方法是将两个图标合二为一。您可以手动执行此操作(如果您只有很少的组合)或自己编写 Icon 实现。

      你可以例如使用以下实现将两个图标并排对齐:

      import java.awt.Component;
      import java.awt.Graphics;
      
      import javax.swing.Icon;
      
      
      public class DoubleIcon implements Icon {
      
          private static final int ICONSPACING = 4;
      
          private final Icon i1;
          private final Icon i2;
      
          public DoubleIcon(Icon i1, Icon i2) {
              this.i1 = i1;
              this.i2 = i2;
          }
      
          @Override
          public void paintIcon(Component c, Graphics g, int x, int y) {
              i1.paintIcon(c, g, x, y + (getIconHeight() - i1.getIconHeight()) / 2);
              i2.paintIcon(c, g, x + ICONSPACING + i1.getIconWidth(), y + (getIconHeight() - i2.getIconHeight()) / 2);
          }
      
          @Override
          public int getIconWidth() {
              return i1.getIconWidth() + ICONSPACING + i2.getIconWidth();
          }
      
          @Override
          public int getIconHeight() {
              return Math.max(i1.getIconHeight(), i2.getIconHeight());
          }
      }
      

      【讨论】:

      • +1 实现Icon对此非常方便;这是一个相关的example
      • @trashgod 我刚刚在你写评论的那一刻添加了一个具体的例子。不过,谢谢你的链接。
      • @mre 最近提出了另一种使用AlphaComposite 的好方法,它可以很容易地与这个建议结合起来。另请参阅此 example 实用程序。
      • @Howard : ICONSPACING 在这里应该做什么?
      • @SpiXel 我刚刚在两个图标之间添加了一些间距。 ICONSPACING 正好给出了这个以像素为单位的额外空间。
      猜你喜欢
      • 2020-03-19
      • 1970-01-01
      • 2011-02-20
      • 2012-10-24
      • 2016-08-25
      • 2015-01-21
      • 2016-10-08
      • 2014-05-09
      • 2013-05-14
      相关资源
      最近更新 更多