JButton同时展示图标(在上方)和文本(在下方),并左对齐

3
我想要一个JButton,它同时带有图标(在上面)和文本(在下面),并且对齐方式为左对齐。用户可以调整按钮的大小,但两者始终应该保持左对齐,就像这样:

enter image description here

我已经尝试过这个。
// Text alignment
comp.setHorizontalAlignment(SwingConstants.LEFT);
// text position
comp.setVerticalTextPosition(SwingConstants.BOTTOM);
//set icon alignment?!
comp.setHorizontalTextPosition(SwingConstants.CENTER);

但这是我的结果(图标始终相对于文本居中!):

enter image description here

任何想法?
1个回答

3
  • 您可以使用<html>标签以及<br>标签来将JButton的文本分成多行。
  • 另一种常见方法是通过设置LayoutManager在一个JButton上放置多个JLabel

screenshot

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;

public final class ButtonTextAlignmentTest {
  private Component makeUI() {
    Icon icon = UIManager.getIcon("FileView.directoryIcon");
    String text = "The text aligned to the left";

    String html = String.format("<html><img src='%s'/><br/>Html: %s", makeIconUrl(icon), text);
    JButton button1 = new JButton(html);

    JLabel iconLabel = new JLabel(null, icon, SwingConstants.LEADING);
    JLabel textLabel = new JLabel("Layout: " + text);
    JButton button2 = new JButton();
    button2.setLayout(new GridLayout(0, 1));
    button2.add(iconLabel);
    button2.add(textLabel);

    JPanel p = new JPanel();
    p.add(button1);
    p.add(button2);
    return p;
  }

  private static String makeIconUrl(Icon icon) { // Create a dummy URL for testing
    try {
      File file = File.createTempFile("dummy", ".png");
      file.deleteOnExit();
      BufferedImage bi = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
      Graphics2D g2 = bi.createGraphics();
      icon.paintIcon(null, g2, 0, 0);
      g2.dispose();
      ImageIO.write(bi, "png", file);
      return file.toURI().toURL().toString();
    } catch (IOException ex) {
      return "";
    }
  }

  public static void main(String[] args) {
    EventQueue.invokeLater(() -> {
      JFrame frame = new JFrame();
      frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
      frame.getContentPane().add(new ButtonTextAlignmentTest().makeUI());
      frame.setSize(320, 240);
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
    });
  }
}

非常感谢@aterai!选项2的布局正是我所需要的。我没想到解决方案会这么简单。 - user3375943

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接