【问题标题】:JLabel positioning is not workingJLabel 定位不起作用
【发布时间】:2018-08-19 01:54:25
【问题描述】:

我需要将JLabel 定位在我的JFrame 中。我创建了一个标签并想设置它的位置,但setAlignmentsetBounds 都不起作用。标签一直停留在面板顶部,不会移动。

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

public class Start extends JFrame {
    //JLabel label1 = new JLabel("HELLO!");
    //JLabel label2 = new JLabel("CHOOSE LANGUAGE:");

    public Start() {
        super();
        setSize(480, 360);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(null);
        setLayout(new GridLayout(2, 1));
        //setLayout(new FlowLayout());
        JPanel panel1 = new JPanel();

        add(panel1);
        JLabel label1 = new JLabel("HELLO!");
        //label1.setBounds(20,20,100,20);
        //label1.SetAlignmentX(20);
        //label1.SetAlignmentY(20);
        panel1.add(label1);
    }

    public static void main(String[] args) {
        Start frame = new Start();
        frame.setVisible(true);
    }
}

你能帮忙吗?

【问题讨论】:

  • 请阅读minimal reproducible example 并相应地增强您的问题。 “不工作”不是一个有效的问题描述。
  • 不要使用空布局。 Swing 旨在与布局管理器一起使用。有不同的方式来影响布局。也许您可以使用 GridBagLayout。默认情况下,组件将在框架中居中。或者可能是一个 BoxLayout。 The label stays all the time at the top of the panel and it does not move.我们不知道“移动”是什么意思。如果您希望组件距离顶部 20 像素,那么您可以在标签上使用边框。如果没有适当的要求,我们无法给出具体的建议。
  • 阅读Swing Tutorial。在Using Layout ManagersHow to Use Borders 上有部分可以帮助您有效地定位组件。
  • 我将重复我之前的回答作为评论:您必须执行panel1.setLayout(null) 才能对 JLabel 的显式定位产生任何影响。是的,显式定位可能不是 Swing 通常的工作方式,但也不是禁止的。现在我将删除我的答案。
  • 以最小尺寸提供 ASCII 艺术或 GUI 的 预期 布局的简单绘图,如果可调整大小,则具有更大的宽度和高度 - 以显示额外空间应该如何被使用。

标签: java swing jlabel layout-manager


【解决方案1】:

以最小尺寸提供 ASCII 艺术或 GUI 预期布局的简单绘图,如果可调整大小,则具有更大的宽度和高度 - 以显示应如何使用额外空间。这是我能从当前描述中猜出的最好的要求。

它显示了如何在红色面板中将标签的左侧和顶部(通过使用EmptyBorder)填充 20 像素,在蓝色面板中填充 100 x 30。

阅读代码中的 cmets 以获得更多提示,并查看 Java 文档以了解所使用的任何与原始源代码不同的方法。

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

public class Start extends JFrame {

    public Start() {
        super();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new GridLayout(2, 1));

        JPanel panel1 = new JPanel(new FlowLayout(SwingConstants.LEADING));
        panel1.setBorder(new LineBorder(Color.RED, 4));
        add(panel1);
        JLabel label1 = new JLabel("HELLO!", SwingConstants.LEADING);
        //label1.setBounds(20,20,100,20);

        // to provide a 20 x 20 offset, an empty border will do nicely.
        label1.setBorder(new EmptyBorder(20, 20, 0, 0));

        // Did you actually check the Java Docs for these methods? 
        // They do not do what you seem to think they do.
        //label1.SetAlignmentX(20);
        //label1.SetAlignmentY(20);
        panel1.add(label1);

        JPanel panel2 = new JPanel(new FlowLayout(SwingConstants.LEADING));
        panel2.setBorder(new LineBorder(Color.BLUE, 4));
        add(panel2);
        JLabel label2 = new JLabel("HELLO!", SwingConstants.LEADING);
        label2.setBorder(new EmptyBorder(30, 100, 30, 100));
        panel2.add(label2);

        pack();
    }

    public static void main(String[] args) {
        Start frame = new Start();
        frame.setVisible(true);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 2011-12-31
    • 1970-01-01
    相关资源
    最近更新 更多