两列布局和第一列被截断
Two column layout and first column truncated
我正在尝试使用包含两个 JLabel
的 BorderLayout
创建一个 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);
我正在尝试使用包含两个 JLabel
的 BorderLayout
创建一个 JPanel
。
第一个 JLabel
应该使用所有可用的水平 space,不包括第二个 JLabel
.
目前我的结果是这样的:
我想要完成的是:
这是一个 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);