【问题标题】:The setLocation doesn't move Jlabel even when a layout manager is disabled即使禁用布局管理器,setLocation 也不会移动 Jlabel
【发布时间】:2016-08-02 14:38:36
【问题描述】:

我正在尝试使JLabel(点)移动位置。它不起作用,当我添加 frame.setLayout(null) 时,我只是得到一个空白的黑屏。

 JFrame  frame = new JFrame( "That snake game");
        frame.setLayout(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JLabel point = new JLabel("|eat this|");
        point.setForeground(Color.blue);

        frame.getContentPane().add(point);

        frame.getContentPane().setBackground(new Color(0,3,0));
        frame.setSize(400, 400);

        point.setLocation(340, 34);

        frame.setVisible(true);

如何让 JLabel(点)移动位置?

【问题讨论】:

  • 1) Java GUI 必须在不同的操作系统、屏幕尺寸、屏幕分辨率等上使用不同语言环境中的不同 PLAF。因此,它们不利于像素完美布局。而是使用布局管理器,或combinations of them 以及white space 的布局填充和边框。 2) 顺便说一句 - 你有问题吗?
  • 对不起,如果我不清楚。我的问题是如何让 Jlabel 移动。
  • 如果你已经阅读了这两个链接,你应该已经有了答案!
  • 确实如此。弄清楚如何去做是另一个令人头疼的问题......不过谢谢!
  • “搞清楚怎么做是另一个令人头疼的问题……” 提供 ASCII 艺术或 GUI 的 预期 布局的简单绘图最小尺寸,如果可调整大小,则具有更大的宽度和高度。

标签: java swing jlabel layout-manager null-layout-manager


【解决方案1】:

我知道你想创建一个 Snake 游戏。您使用了错误的 API。为此,您应该使用 Swing 的绘画 API。这是我创建的一个贪吃蛇游戏:Snake game tutorialJLabel 等组件用于创建典型桌面应用程序的用户界面;它们不用于创建游戏。

现在至于您的示例为什么不起作用:您还需要设置JLabel 的大小。所以如果你使用setLocation(),你应该 也可以使用setSize(),或者使用一个setBounds() 呼叫。

package com.zetcode;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

/**
 * Demonstrating setLocation method
 * @Author Jan Bodnar
 * Website zetcode.com
 */

public class SetLocationEx extends JFrame {

    public SetLocationEx() {

        initUI();
    }

    private void initUI() {

        setLayout(null);

        JLabel lbl1 = new JLabel("JLabel");
        lbl1.setBorder(BorderFactory.createEtchedBorder());
        lbl1.setSize(80, 30);
        lbl1.setLocation(50, 100);

        add(lbl1);

        setSize(350, 300);
        setTitle("SetLocation example");
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(() -> {
            SetLocationEx ex = new SetLocationEx();
            ex.setVisible(true);
        });
    }
}

截图:

【讨论】:

    【解决方案2】:

    有一个非常基本的教程here 可以给你提示。

    至少你需要

    • 将容器的布局管理器设置为 null:setLayout(null)。
    • 为每个子组件调用 Component 类的 setbounds 方法
    • 调用 Component 类重绘方法。
    • 管理鼠标事件以移动组件(更改组件边界)

    您的问题可能是您错过了重绘和 setBounds for label ?

    但是,正如 Andrew 所说,swing 很棘手,而且这个 swing 布局主题很复杂,所以这可能根本不是要走的路。

    也许您应该重新设计游戏的某些部分,以便图形部分不会过多地干扰 gui 元素 例如 - 只是一个想法 - 将所有图形交互限制在自定义绘制和完全托管的组件中? 如果这是游戏的一部分,包括移动文本的绘画 所以你不会移动 JLabel 并干扰布局部分。 (只是一个想法)

    【讨论】:

      【解决方案3】:

      使用 setBounds (int x, int y, int width, int height)。我希望这有帮助!此外,如果您不想要布局,请不要使用 setLayout 函数。 setLayout(null) 有问题

      【讨论】:

      • 请停止提供有关 Java GUI 的建议,直到您意识到这些建议会适得其反......
      • 这有什么问题?这家伙想移动他的 JLabel,setBounds 就是这样做的方法
      • "setBounds 是这样做的方法" 不,不是。 请参阅上面我所做的第一条评论(关于问题)。
      • 您可以轻松获取框架的宽度或高度,并使用这些值进行定位
      • @AndrewThompson 说得对
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-12
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      相关资源
      最近更新 更多