【问题标题】:Two icons in a JLabel?JLabel 中有两个图标?
【发布时间】:2011-12-16 19:02:15
【问题描述】:

我在 JLabel 中有一个图标,如下所示:

是否可以在彩色图标和文本之间添加另一个图标(例如代表国家的国旗)?例如,我想在红色图标和US 之间添加一个描绘美国国旗的图标。谢谢!

【问题讨论】:

    标签: java swing jlabel


    【解决方案1】:

    试试CompoundIcon 编辑:Heisenbug 的基于布局的解决方案是 简单的答案。

    【讨论】:

    • 或将容器嵌套在布局中。或为此目的在列表中添加另一列。
    【解决方案2】:

    这很有可能,JLabel 是 Swing JComponent,您可以将任何 JComponent 添加到另一个 JComponent,对于 JLabel 也是如此

    label.setLayout(new GridLayout(0, 2, 10, 10));
    label.add(myIcon1);
    label.add(myIcon2);
    

    如果你添加 f.e. JPanel 到 JLabel 然后别忘了setOpaque(false);

    【讨论】:

      【解决方案3】:

      我最近才这样做 - 我希望能够将单行中的多个图标组合成一个图标。我这样做的方法是下降到BufferedImage 级别并将两个图像手动组合成一个图像,然后将其用作我的JLabel 图标。还有其他方法可以达到相同的效果,但我不想更改我的 UI 组件层次结构。

      我最终创建了一个组合多个图像并缓存它们的类。我是这样使用的:

      ImageIcon icon1 = ...;
      ImageIcon icon2 = ...;
      
      ImageIcon labelIcon = new CachedCompositeIcon( icon1, icon2 ).getIcon();
      jLabel.setIcon( labelIcon );
      

      来源:

      /** This is a convenience class to handle creating a single composite icon from several icons, and caching the
       *  created icons to eliminate duplicate work. This class is basically used as a key into a map, allowing us to
       *  define both a hashCode and equals in a single place.
       */
      public class CachedCompositeIcon
      {
          private static final byte ICON_PADDING = 2;
          private static final HashMap<CachedCompositeIcon, ImageIcon> CACHED_ICONS =
                  new HashMap<CachedCompositeIcon, ImageIcon>( 4 );
      
          private final ImageIcon[] m_icons;
      
          public CachedCompositeIcon(final ImageIcon... icons) {
              m_icons = icons;
          }
      
          public ImageIcon getIcon() {
              if ( !CACHED_ICONS.containsKey( this ) ) {
                  CACHED_ICONS.put( this, lcl_combineIcons() );
              }
      
              return CACHED_ICONS.get( this );
          }
      
          /** Generates an icon that is a composition of several icons by appending each icon together with some
           *  padding between them.
           *
           * @return An icon that is the concatenation of all the icons this was constructed with.
           */
          private ImageIcon lcl_combineIcons() {
              // First determine how big our composite icon will be; we need to know how wide & tall to make it.
              int totalWidth = (m_icons.length - 1) * ICON_PADDING; // Take into account the padding between icons
              int minHeight  = 0;
              for ( int i = 0; i < m_icons.length; ++i ) {
                  totalWidth += m_icons[i].getIconWidth();
                  if ( m_icons[i].getIconHeight() > minHeight ) {
                      minHeight = m_icons[i].getIconHeight();
                  }
              }
      
              // Create an image big enough and acquire the image canvas to draw on
              final BufferedImage compositeImage = new BufferedImage( totalWidth, minHeight, BufferedImage.TYPE_INT_ARGB );
              final Graphics      graphics       = compositeImage.createGraphics();
      
              // Iterate over the icons, painting each icon and adding some padding space between them
              int x = 0;
              for ( int i = 0; i < m_icons.length; ++i ) {
                  final ImageIcon icon = m_icons[ i ];
                  graphics.drawImage( icon.getImage(), x, 0, null );
                  x += icon.getIconWidth() + ICON_PADDING;
              }
      
              return new ImageIcon( compositeImage );
          }
      
          /** Generates a hash that takes into account the number of icons this composition includes and the hash &
           *  order of those icons.
           *
           * @return A hash code.
           */
          @Override
          public int hashCode() {
              int weakHash = m_icons.length;
              for ( int i = 0; i < m_icons.length; ++i ) {
                  weakHash += m_icons[i].hashCode() * (i + 1);
              }
              return weakHash;
          }
      
          /** Two instances are equal if and only if they include the same icons and they're in the same order.
           *
           * @param obj An object to check for equality with this.
           *
           * @return true if the two objects are equal, false otherwise.
           */
          @Override
          public boolean equals(final Object obj) {
              if ( !(obj instanceof CachedCompositeIcon) ) {
                  return false;
              }
      
              final CachedCompositeIcon other = (CachedCompositeIcon) obj;
              if ( m_icons.length != other.m_icons.length ) {
                  return false;
              }
      
              for ( int i = 0; i < m_icons.length; ++i ) {
                  if ( m_icons[i].hashCode() != other.m_icons[i].hashCode() ) {
                      return false;
                  }
              }
      
              return true;
          }
      }
      

      【讨论】:

        【解决方案4】:

        是的,在容器标签中使用带有 BoxLayout 的嵌套 JLabel:

        JLabel container = new JLabel();
        container.setLayout(new BoxLayout(container, BoxLayout.X_AXIS));
        JLabel icon1Label = new JLabel();
        JLabel icon2Label = new JLabel();
        icon1Label.setIcon(icon1);
        icon2Label.setIcon(icon2);
        container.add(icon1Label);
        container.add(icon2Label);
        

        【讨论】:

        • 谢谢,成功了。我还添加了container.add(Box.createRigidArea(new Dimension(5,0))) 以在两个图标之间添加一些空间。
        猜你喜欢
        • 1970-01-01
        • 2014-01-08
        • 2016-06-16
        • 2016-01-11
        • 1970-01-01
        • 2012-08-07
        • 1970-01-01
        • 2013-07-03
        • 2012-12-04
        相关资源
        最近更新 更多