两列布局和第一列截断

时间:2015-03-18 20:25:01

标签: java swing border-layout

我正在尝试使用包含两个JPanel的{​​{1}}来创建BorderLayout。 第一个JLabel应使用除第二个JLabel的空格之外的所有可用水平空间。

目前我的结果如下:

enter image description here

我想要完成的是:

enter image description here

这是一个SSCCE:

JLabel

你有什么提示要我完成这个吗?

3 个答案:

答案 0 :(得分:1)

令我惊讶的是,我发现您可以通过将left标签分配给BorderLayout.CENTER而非BorderLayout.WEST来完成此操作。我必须更多地研究这些文档(可能还有更多),以找出原因。

答案 1 :(得分:1)

下面,我已经注释了你的常规两行来添加标签,而是选择使用我自己喜欢的方法让事情看起来正确,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有任何问题,请随时给我发消息。

答案 2 :(得分:1)

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