【问题标题】:Is there a way to set a JLabel's PreferredSize to the size of its components?有没有办法将 JLabel 的 PreferredSize 设置为其组件的大小?
【发布时间】:2015-03-06 01:17:37
【问题描述】:

有什么方法可以获取 JLabel 组件的(我猜是首选的)大小,以便我可以将其调整为它们的大小?除非我设置其首选大小,否则我的 JLabel 的大小为 0,0,但将其大小设置为任意像素值似乎是错误的方法,因为使用 Swing 的全部意义(据我所知)并没有这样做.

我已经尝试过的事情:

  • 重绘()和重构()
  • 将 LayoutManager 添加到 JPanel(在本例中为 BoxLayout)

这基本上就是我正在做的:

package invisiblelabel;

import java.awt.Color;
import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.Border;

public class InvisibleLabel {

public static JFrame frame;
public static JPanel panel;
public static JLabel visible;
public static JLabel visibleText;
public static JLabel invisible;
public static JLabel text1;
public static JLabel text2;

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

public static void createGraphics(){
    frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    panel = new JPanel();

    visible = new JLabel();
    visible.setPreferredSize(new Dimension (500,500));
    Border border = BorderFactory.createLineBorder(Color.black);
    visible.setBorder(border);
    visible.setLayout(new BoxLayout(visible, BoxLayout.Y_AXIS));

    visibleText = new JLabel ("This JLabel is visible, because it is created fitting its text.");
    visible.add(visibleText);

    invisible = new JLabel();
    text1 = new JLabel("You can't read this anyways.");
    text2 = new JLabel("You can't read this either.");
    invisible.add(text1);
    invisible.add(text2);

    visible.add(invisible);

    panel.add(visible);
    frame.add(panel);

    frame.setLocationRelativeTo(null);
    frame.setSize(800,600);
    frame.setVisible(true);

    visible.repaint();
    visible.revalidate();
}

}

}

【问题讨论】:

  • for example,除此之外,您必须以编程方式从 mousemotionevent 调用 repaint()(API 中似乎缺少)
  • 这正是我寻找了至少一个小时的问题(和答案)。

标签: java swing jlabel


【解决方案1】:

我很好奇您为什么使用JLabel 作为容器,但是...

类似于覆盖JLabelgetPreferredSize 方法...

@Overrride
public Dimension getPreferredSize() {
    LayoutManager lm = getLayout();
    return lm.preferredLayoutSize(this);
}

会让你开始。这没有考虑任何边界的要求,如果这对您很重要,您还需要添加它们...

这还假设您已将布局管理器应用于JLabel

【讨论】:

  • 好像没有getLayoutManager()方法。编辑:(和忍者)是getLayout()吗?
  • 我这样做的原因是我想要一种在图像上添加几行单行文本的简单方法(作为日志),所以我有一个 JLabel 用于包含一个用于获取的图标正确的位置(EmptyBorder 也适用于 JLabels),并且在其中一个显示我的文本行的几个 JLabel。在我看来,这实际上是最直观的方式,但可能我遗漏了一些明显的东西。
  • getLayoutManager 应该是getLayout
  • 不要使用JLabel 作为背景,您可以使用this 之类的东西,这样可以将背景的要求与组件的布局分开......跨度>
  • 这实际上对我正在尝试做的事情非常有用。但是,您的解决方案似乎对我不起作用。 (假设我要去 invisible.setPreferredSize(invisible.getPreferredSize());) ,但即使那样它也不会显示。但是,我真正要问的是“是否有标准的方法”,并且您对另一个问题的回答似乎可以回答。 (基本上没有。)感谢您的帮助!
猜你喜欢
  • 2014-03-15
  • 1970-01-01
  • 2018-01-30
  • 2016-12-30
  • 2020-06-24
  • 1970-01-01
  • 1970-01-01
  • 2019-10-08
  • 1970-01-01
相关资源
最近更新 更多