【问题标题】:BorderLayout reserving space for smaller JLabelBorderLayout 为较小的 JLabel 保留空间
【发布时间】:2019-04-07 05:37:35
【问题描述】:

我准备了 2 个 JUnit 风格的测试用例(对不起,我不知道如何断言 UI 的那种奇怪的测试) 对于第二个示例,我有选择地剪切字符串,但我希望能够粘贴长字符串并让 UI 正确剪切它

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.WindowEvent;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import org.junit.jupiter.api.Test;

public class testing {

    @Test
    public void howItsSupposedToLook() {
        JFrame frame = new JFrame();
        frame.setLayout(new BorderLayout());

        frame.setVisible(true);
        frame.setSize(1000, 900);

        JPanel leftPanel = new JPanel();
        leftPanel.setBackground(Color.GREEN);
        leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.PAGE_AXIS));

// this is how it should look
        JLabel fileLabel3 = new JLabel(
                "<html><div style=\"padding-left:1px;padding-top:10px\"><div style=\"border:1px;font-size: 10px;line-height: 11px; height:23px;overflow:hidden;width:"
                        + (100) + "px;white-space:nowrap;\">" + "fsdfesfevvveeeg" + "</div></div></html>");
        leftPanel.add(fileLabel3);
//no more differences between the two from here
        frame.add(leftPanel, BorderLayout.LINE_START);

        JPanel centerPAnel = new JPanel();
        centerPAnel.setBackground(Color.RED);

        frame.add(centerPAnel, BorderLayout.CENTER);
        frame.validate();
        frame.repaint();

        boolean open = true;
        frame.addWindowListener(new java.awt.event.WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent winEvt) {

                System.exit(0);
            }
        });
        while (open) {
        }

    }

    @Test
    public void failedTest() {

        JFrame frame = new JFrame();
        frame.setLayout(new BorderLayout());

        frame.setVisible(true);
        frame.setSize(1000, 900);

        JPanel leftPanel = new JPanel();
        leftPanel.setBackground(Color.GREEN);
        leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.PAGE_AXIS));

 // this is how it actually looks

        JLabel fileLabel = new JLabel(
                "<html><div style=\"padding-left:1px;padding-top:10px\"><div style=\"border:1px;font-size: 10px;line-height: 11px; height:23px;overflow:hidden;width:"
                        + (100) + "px;white-space:nowrap;\">"
                        + "fsdfesfevvveeegggggggggggggggggggggggevevsdffffffffffffffffffffffffffffffffffffffffffffffffffffffffh"
                        + "</div></div></html>");
        fileLabel.setMaximumSize(new Dimension(100, 40));
//no more differences between the two from here
        leftPanel.add(fileLabel);

        frame.add(leftPanel, BorderLayout.LINE_START);

        JPanel centerPAnel = new JPanel();
        centerPAnel.setBackground(Color.RED);

        frame.add(centerPAnel, BorderLayout.CENTER);
        frame.validate();
        frame.repaint();

        boolean open = true;
        frame.addWindowListener(new java.awt.event.WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent winEvt) {

                System.exit(0);
            }
        });
        while (open) {
        }

    }

}

它的外观(第一个(制造)示例):

它的实际外观:

对我来说,感觉布局没有正确识别 JPanel 的长度,有人知道该怎么做吗?

【问题讨论】:

  • 让我们从 Swing 的 HTML/CSS 支持有限且不支持当前标准的事实开始(我认为 HTML 是 3ish,不记得它的 CSS 支持)
  • 是的,我注意到了(我在开始时尝试了溢出隐藏和省略号模式,但我不得不放弃)
  • 您的问题是级联问题之一。在BorderLayout 中使用BoxLayout 以及许多CSS 可能被忽略的事实。你也会遇到问题,因为文本不会换行,因为它想在单词边界上换行,而不是字符边界
  • 建议 - 改用不可编辑的 JTextArea,设置为自动换行,如第二个 example here 所示
  • 那么不要使用BorderLayout,它会提供与组件的preferredSize 请求一样多的空间。玩setPreferredSize 也是一个坏主意,因为有很多因素会影响这个结果。一个“不同”的想法可能是使用JList 并定义一个匹配字符长度限制的prototype 单元格值,但这会受到字体设置的影响(所以当字体大小改变时,宽度会改变)

标签: java swing jlabel border-layout boxlayout


【解决方案1】:

简单地使用

fileLabel.setPreferredSize(new Dimension(100, 40));

代替

fileLabel.setMaximumSize(new Dimension(100, 40));

这个setter告诉当这个组件放置在带有布局管理器的容器中时,必须使用什么尺寸作为“首选”

PS:对不起我的英语

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2023-03-16
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 2013-08-08
相关资源
最近更新 更多