【问题标题】:Setting multiple icons on JButton在 JButton 上设置多个图标
【发布时间】:2013-04-24 08:25:45
【问题描述】:

我有一个JButton,我在上面设置了一个自定义图标。现在我希望它在我将鼠标光标拖到它上面时已经显示的图标上显示另一个图标,但我不知道该怎么做,因为如果我使用button.setIcon(icon);,它将替换已经是的图标显示。我将如何以尽可能简单的方式做到这一点?

【问题讨论】:

    标签: java swing button icons jbutton


    【解决方案1】:

    如果您的图标已经是透明的,您可以轻松实现自己的 Icon 以将两者结合起来 -

    public class CombineIcon implements Icon {
        private Icon top;
        private Icon bottom;
    
        public CombineIcon(Icon top, Icon bottom) {
            this.top = top;
            this.bottom = bottom;
        }
    
        public int getIconHeight() {
            return Math.max(top.getIconHeight(), bottom.getIconHeight());
        }
    
        public int getIconWidth() {
            return Math.max(top.getIconWidth(), bottom.getIconWidth());
        }
    
        public void paintIcon(Component c, Graphics g, int x, int y) {
            bottom.paintIcon(c, g, x, y);
            top.paintIcon(c, g, x, y);
        }
    }
    

    您使用setRolloverIcon(icon) 指定当鼠标悬停在按钮上时要显示的图标。

    【讨论】:

      【解决方案2】:

      一种方法是:

      创建一个图标,当指针通过某些图像编辑工具悬停在按钮顶部时,您想看到该图标。并在 mousehover 事件发生时设置该图像。

      附言使用任何图片编辑工具,您都可以轻松创建叠加图像。

      我现在还看到 AbsractButton 类中有一个翻转图标的概念。你也可以使用它。

      【讨论】:

      • “一旦 mousehover 事件发生就设置该图像。” 绝对不是的方法。
      • 我现在意识到了不同的方法。 :P 但我不知道为什么不能这样做。不是最好的方法,而是其中一种方法..
      • 你可以通过反复用头撞墙来推倒一堵墙。这是可能的,但我不推荐它。
      • 好兄弟。 :P 明白了。我来自 Javascript 背景,所以我建议这样做。
      【解决方案3】:

      我觉得这很容易。

      import java.awt.*;
      import java.awt.image.BufferedImage;
      import java.net.URL;
      import javax.imageio.ImageIO;
      import javax.swing.*;
      
      class CombinedIconButton {
      
          public static BufferedImage getCombinedImage(BufferedImage i1, BufferedImage i2) {
              if (i1.getHeight() != i2.getHeight()
                      || i1.getWidth() != i2.getWidth()) {
                  throw new IllegalArgumentException("Images are not the same size!");
              }
              BufferedImage bi = new BufferedImage(
                      i1.getHeight(), 
                      i1.getWidth(), 
                      BufferedImage.TYPE_INT_ARGB);
              Graphics g = bi.getGraphics();
              g.drawImage(i1,0,0,null);
              g.drawImage(i2,0,0,null);
              g.dispose();
      
              return bi;
          }
      
          public static void main(String[] args) throws Exception {
              URL url1 = new URL("http://i.stack.imgur.com/gJmeJ.png"); // blue circle
              URL url2 = new URL("http://i.stack.imgur.com/5v2TX.png"); // red triangle
              final BufferedImage bi1 = ImageIO.read(url1);
              final BufferedImage bi2 = ImageIO.read(url2);
              final BufferedImage biC = getCombinedImage(bi1,bi2);
              Runnable r = new Runnable() {
      
                  @Override
                  public void run() {
                      JPanel gui = new JPanel(new BorderLayout());
      
                      JToggleButton b = new JToggleButton();
                      b.setIcon(new ImageIcon(bi1));
                      b.setRolloverIcon(new ImageIcon(biC));
                      b.setSelectedIcon(new ImageIcon(bi2));
      
                      gui.add(b);
      
                      JOptionPane.showMessageDialog(null, gui);
                  }
              };
              // Swing GUIs should be created and updated on the EDT
              // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
              SwingUtilities.invokeLater(r);
          }
      }
      

      图片借自this answer

      【讨论】:

        【解决方案4】:

        创建包含叠加层的该按钮图标的第二个版本。在鼠标悬停时切换到带有叠加层的图像。

        另一种方法是将图标与其叠加层组合成内存中的新图标,并将其作为图标放在按钮上。如果您的图标经常更改,这可能是一个好方法。如果不是这样,我肯定会使用第一种方法。

        【讨论】:

        • 但是我必须有比必要更多的图像
        • 不,你不会。在这里你只需要两张图片。一个带有叠加层,另一个是您想要以其他方式显示的普通图像。这就是我在下面的回答中所说的。
        • @LPD 是的,因为我有两个具有不同背景的JButton,我希望第二个图标在我将鼠标悬停在它们上时出现,因此我必须有 4 个图像3
        【解决方案5】:

        我有一个 JButton,我在上面设置了一个自定义图标。现在我想要它 在我已经显示的图标之上显示另一个图标 将鼠标光标拖到它上面,但我不知道该怎么做 因为如果我使用 button.setIcon(icon);它将替换那个图标 已经显示。我将如何以简单的方式做到这一点 可能

        • 我想这就是JButton.setRolloverIcon(myIcon);

        JButton 已经在 API 中实现了这些方法

        JButton.setIcon(myIcon);
        JButton.setRolloverIcon(myIcon);
        JButton.setPressedIcon(myIcon);
        JButton.setDisabledIcon(myIcon);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-01-21
          • 2013-02-02
          • 1970-01-01
          • 1970-01-01
          • 2013-03-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多