Java 在JLabel中以不同方式对齐文本和图标

Java 在JLabel中以不同方式对齐文本和图标,java,swing,alignment,jlabel,imageicon,Java,Swing,Alignment,Jlabel,Imageicon,我正在尝试创建一个文本左对齐、图标右对齐的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.LE

我正在尝试创建一个文本左对齐、图标右对齐的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);
图标向右对齐,但文本也向右对齐,我希望它向左对齐

有办法吗?

请帮我干一下好吗

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();
            }
        });
    }
}

编辑


或者,您可以使用带有适当布局的
JPanel
,如图所示


不起作用。如果删除
frame.pack()
指令,只需执行
frame.setSize(500300)
,它将使标签居中,这不是我想要的do@Harlandraka我不认为他试图在中间显示框架,但看到图标和文本之间的间距。@Joey Rohan我不是说他在中间显示框架,我是说这个解决方案只是将文本和图标放在JLabel的中心,但这不是我需要的,所以这不是我问题的解决方案,而且文本和图标之间的间距也不是解决方案,因为我不知道我的文字会有多少字符contain@Harlandraka但是你总是知道最大值:xxx.xxx.xxx.xxx。你到底想要什么?可能是
Label.setIconTextGap()
帮助?@Joeyorhan使用图标文本间隙与使用空格是一样的,如果我使用i.e.
\u ip.setIconTextGap(15)
,然后一个带有文本
151.33.58.1
的标签将具有我想要的文本和图标对齐,但是如果我的文本
1.1.1.1
它将无法正确对齐。添加几个空格难道不能解决问题吗?我的意思是
jLabel.setText(“99.222.22.230(几个空格)”
否,这将是从db IPs列表中获取的,如果我选择添加一些空格,这意味着我应该知道我正在加载的每个IP,但事实上我不知道,因为它们是从db加载的,所以我不能只添加空格。我知道这是一种难看的方式,但你的IP字符串+“(空格)”将完成这项工作。必须有一种方法(不管有没有技巧)来做到这一点,空格只是我不想使用的一种变通方法,主要是因为我使用的字体不是等距的,所以如果我把一些标签放在一个JList中,每个图标都会与其他图标不对齐,这是令人惊奇的EG+1,我正要在字符串的总长度上发布一个EG,欢迎@乔伊·罗汉:例如,在自定义的
LabelUI
中,可以使用
TextLayout
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();
            }
        });
    }
}