即使禁用布局管理器,setLocation也不会移动Jlabel

时间:2016-08-02 14:38:36

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

我想让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(点)移动位置?

3 个答案:

答案 0 :(得分:0)

我看到你想创建一个Snake游戏。您使用的是错误的API。为此,您应该使用Swing的绘画API。这是我创建的Snake游戏: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);
        });
    }
}

截图:

Screenshot of the example

答案 1 :(得分:-1)

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

至少你需要

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

你的问题可能是你错过了重绘,而setBounds是标签吗?

然而,正如安德鲁所说,摆动是棘手的,这个摆动布局主题很复杂,所以这可能不是最好的方法。

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

答案 2 :(得分:-2)

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