两列布局和第一列被截断

Two column layout and first column truncated

我正在尝试使用包含两个 JLabelBorderLayout 创建一个 JPanel。 第一个 JLabel 应该使用所有可用的水平 space,不包括第二个 JLabel.

的 space

目前我的结果是这样的:

我想要完成的是:

这是一个 SSCCE:

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

public class TwoColumnsTruncate {
    public TwoColumnsTruncate() {
        JPanel panel = new JPanel(new BorderLayout());
        JLabel left = new JLabel("This is a really large label and its text should be truncated with ellipsis");
        JLabel right = new JLabel("Some short text");
        panel.add(left, BorderLayout.WEST);
        panel.add(right, BorderLayout.EAST);
        JFrame frame = new JFrame(getClass().getSimpleName());
        frame.getContentPane().add(panel);
        frame.setMinimumSize(new Dimension(400, 75));
        frame.setMaximumSize(new Dimension(400, 75));
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new TwoColumnsTruncate();
    }
}

你有什么技巧可以帮助我完成这个任务吗?

令我有些惊讶的是,我发现您可以通过将 left 标签分配给 BorderLayout.CENTER 而不是 BorderLayout.WEST 来完成此操作。我必须更多(也许更多)研究文档才能弄清楚为什么会这样。

在下面,我已经注释掉了用于添加标签的常规两行代码,而是选择使用我自己喜欢的方法来让事情看起来正确,GridBags。这是您修改后的代码,证明了我的想法。

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

public class TwoColumnsTruncate {
    public TwoColumnsTruncate() {
        JPanel panel = new JPanel(new BorderLayout());
        JLabel left = new JLabel("This is a really large label and its text should be truncated with ellipsis");
        JLabel right = new JLabel("Some short text");

        GridBagLayout layout=new GridBagLayout();
        GridBagConstraints gbc=new GridBagConstraints();

        layout.columnWidths=new int[] {198, 198};
        layout.rowHeights=new int[] {70};
        panel.setLayout(layout);

        gbc.fill=GridBagConstraints.BOTH;
        gbc.insets=new Insets(0, 0, 0, 0);

        gbc.gridx=0;
        gbc.gridy=0;
        gbc.gridwidth=1;
        gbc.gridheight=1;
        panel.add(left, gbc);

        gbc.gridx=1;
        gbc.gridy=0;
        gbc.gridwidth=1;
        gbc.gridheight=1;
        panel.add(right, gbc);

        //panel.add(left, BorderLayout.WEST);
        //panel.add(right, BorderLayout.EAST);
        JFrame frame = new JFrame(getClass().getSimpleName());
        frame.getContentPane().add(panel);
        frame.setMinimumSize(new Dimension(400, 75));
        frame.setMaximumSize(new Dimension(400, 75));
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new TwoColumnsTruncate();
    }
}

正如您在 运行 中看到的那样,它将产生所需的省略号。任何进一步的移动,都可以通过更改给定的插图和列宽来简单地实现。我建议稍微摆弄一下,因为 Swing 的变化无常以及缺乏图像安全性,像素往往会变得混乱。 我希望这能解决你的问题,祝你好运。 P.S,如果您对 GridBag 的东西有任何问题,请随时给我发消息。

    frame.getContentPane().add(panel);
    frame.setMinimumSize(new Dimension(400, 75));
    frame.setMaximumSize(new Dimension(400, 75));
    frame.setVisible(true);

应该是:

    frame.getContentPane().add(panel);
    frame.setResizable(false); // guessing you want this, based on the snippet
    frame.pack(); // Set it to the minimum size it actually NEEDS to be.
    frame.setMinimumSize(frame.getSize());
    frame.setVisible(true);