SetLocation не перемещает Jlabel, даже когда менеджер макета отключен

Я пытаюсь сделать 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 ответа

Я вижу, что вы хотите создать игру Snake. Вы используете неправильный API. Для этого вам следует использовать API рисования Swing. Вот игра Snake, которую я создал: учебник по игре Snake. JLabel и другие компоненты используются для создания пользовательского интерфейса типичного настольного приложения; они не используются для создания игр.

Теперь о том, почему ваш пример не сработал: вам также нужно установить размер 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);
        });
    }
}

Скриншот:

Скриншот примера

Здесь есть очень простое руководство, которое может дать вам подсказки.

По крайней мере, вам нужно

  • Установите для диспетчера макета контейнера значение null: setLayout(null).
  • Вызовите метод setbounds класса Component для каждого дочернего компонента
  • Вызовите метод перерисовки класса Component.
  • Управление событиями мыши для перемещения компонентов (изменение границ компонентов)

Ваши проблемы могут быть в том, что вы пропустили перерисовку и setBounds для метки?

Однако, как сказал Эндрю, свинг - это сложная задача, и этот предмет свинг-макета сложен, так что это может быть совсем не так.

Может быть, вам следует переделать некоторые части вашей игры так, чтобы графическая часть не слишком сильно мешала элементам графического интерфейса. Например, просто идея, ограничивающая все ваши графические взаимодействия в пользовательском нарисованном и полностью управляемом компоненте? включая рисование движущегося текста, если это часть игры, так что вы не будете перемещать JLabel и мешать части макета. (просто идея)

Используйте setBounds (int x, int y, int width, int height). Надеюсь, это поможет! Кроме того, если вам не нужен макет, просто не используйте функцию setLayout. setLayout(null) проблематичен

Другие вопросы по тегам