【问题标题】:Align text and icon differently in JLabel在 JLabel 中以不同方式对齐文本和图标
【发布时间】:2013-03-21 19:22:42
【问题描述】:

我正在尝试创建一个文本左对齐和图标右对齐的 JLabel,我尝试了以下代码:

_ip = new JLabel(ip);
_ip.setFont(boldFont);
_ip.setBounds(5, 0, 100, 50);
_ip.setIcon(images.ipBan);
_ip.setBorder(BorderFactory.createLineBorder(Color.black, 1));
_ip.setHorizontalTextPosition(SwingConstants.LEFT);
add(_ip);

这就是我得到的:

红色的图像显示实际的图像对齐,灰色的图像显示我想要图像的位置。

如果我添加

_ip.setAlignmentX(JLabel.RIGHT_ALIGNMENT);

什么都没有发生,如果我添加

_ip.setHorizontalAlignment(JLabel.RIGHT);

图标右对齐,文本也右对齐,我希望它左对齐

有办法吗?

【问题讨论】:

  • 添加几个空格不能解决问题吗?我的意思是jLabel.setText("99.222.22.230 (FEW SPACES) ")
  • 不,这将是一个从数据库获取的 IP 列表,如果我选择添加一些空格,这意味着我应该知道我正在加载的每个 IP,但实际上我不知道从数据库加载,所以我不能只添加空格
  • 我知道这是一种丑陋的方式,但你的 ip string+ " (SPACE)" 会完成这项工作。
  • 必须有一种方法(无论是否棘手)来做到这一点,空格只是我不想使用的一种解决方法,主要是因为我使用的字体不是等宽的,所以如果我将一些标签放入 JList 中,每个图标都会与其他图标不对齐

标签: java swing alignment jlabel imageicon


【解决方案1】:

请DYM???

import java.awt.*;
import javax.swing.*;

public class CenteredJLabel {

    private JFrame frame = new JFrame("Test");
    private JPanel panel = new JPanel();
    private JLabel label = new JLabel("CenteredJLabel");
    private Icon errorIcon = UIManager.getIcon("OptionPane.errorIcon");

    public CenteredJLabel() {
        panel.setLayout(new GridBagLayout());
        panel.add(label);
        label.setHorizontalAlignment(SwingConstants.LEFT);
        label.setVerticalAlignment(SwingConstants.CENTER);
        label.setIcon(errorIcon);
        label.setIconTextGap(20);
        label.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
        panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(panel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                CenteredJLabel centeredJLabel = new CenteredJLabel();
            }
        });
    }
}

编辑

import java.awt.*;
import javax.swing.*;

public class CenteredJLabel {

    private JFrame frame = new JFrame("Test");
    private JPanel panel = new JPanel();
    private JLabel labelOne = new JLabel("CenteredJLabel");
    private JLabel labelTwo = new JLabel("1.1.1.1");
    private JLabel labelThree = new JLabel("192.168.255.255");
    private JLabel labelFour = new JLabel("192.168.255.255");
    private Icon errorIcon = UIManager.getIcon("OptionPane.errorIcon");
    private Icon infoIcon = UIManager.getIcon("OptionPane.informationIcon");
    private Icon warnIcon = UIManager.getIcon("OptionPane.warningIcon");
    private Icon questnIcon = UIManager.getIcon("OptionPane.questionIcon");
    private JPanel panelTwo = new JPanel();

    public CenteredJLabel() {
        panel.setLayout(new GridLayout(4, 0, 10, 10));

        labelOne.setHorizontalAlignment(SwingConstants.LEFT);
        labelOne.setVerticalAlignment(SwingConstants.CENTER);
        labelOne.setIcon(errorIcon);
        labelOne.setIconTextGap(20);
        labelOne.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
        panel.add(labelOne);

        labelTwo.setHorizontalAlignment(SwingConstants.LEFT);
        labelTwo.setVerticalAlignment(SwingConstants.CENTER);
        labelTwo.setIcon(infoIcon);
        labelTwo.setIconTextGap(20);
        labelTwo.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
        panel.add(labelTwo);

        labelThree.setHorizontalAlignment(SwingConstants.LEFT);
        labelThree.setVerticalAlignment(SwingConstants.CENTER);
        labelThree.setIcon(warnIcon);
        labelThree.setIconTextGap(20);
        labelThree.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
        panel.add(labelThree);

        panelTwo.setLayout(new BorderLayout());
        panelTwo.setOpaque(false);
        panelTwo.add(labelFour, BorderLayout.WEST);
        panelTwo.add(new JLabel(questnIcon), BorderLayout.EAST);
        panel.add(panelTwo);

        panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(panel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                CenteredJLabel centeredJLabel = new CenteredJLabel();
            }
        });
    }
}

【讨论】:

  • 不起作用。如果您删除frame.pack() 指令并简单地执行frame.setSize(500,300),它只会使标签居中,这不是我想要做的
  • @Harlandraka 我不认为他试图在中心显示框架,但请查看图标和文本之间的间距。
  • @joeyrohan 我不是说他在中心显示框架,我是说这个解决方案只是将文本和图标放在 JLabel 上,但这不是我需要的,所以这不是我的问题的解决方案,文本和图标之间的间距也不是解决方案,因为我不知道我的文本将包含多少个字符
  • @Harlandraka 但是你总是知道最大值:xxx.xxx.xxx.xxx 。你到底想要什么?可能是Label.setIconTextGap() 有帮助吗?
  • @joeyrohan 使用图标文本间隙与使用空格相同,如果我使用即_ip.setIconTextGap(15),则带有文本151.33.58.1 的标签将具有我想要的文本和图标对齐方式,但是如果我的文字是1.1.1.1,它将无法正确对齐。
【解决方案2】:

或者,您可以使用具有合适布局的JPanel,如here 所示。

【讨论】:

  • 那太好了 EG +1,我正要发布一个关于字符串总长度的 EG 哈哈
  • 不客气! @joeyrohan:TextLayout 可能在自定义 LabelUI 中用于 example
猜你喜欢
  • 2012-08-15
  • 1970-01-01
  • 2017-07-26
  • 2017-09-04
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
相关资源
最近更新 更多