Как получить размеры полноэкранного JPanel до его отрисовки? - PullRequest
0 голосов
/ 20 марта 2020

Я студент университета и относительно новичок в Java. У меня есть проект по созданию игры, похожей на Space Invaders, и часть описания проекта - сделать мой код максимально модульным. Я пытаюсь нарисовать объект "космический корабль" для JPanel, когда игра начинается, не зная, насколько большим будет экран. Программа будет работать в полноэкранном режиме (JFrame.setExtendedState(JFrame.MAXIMIZED_BOTH)).

Я искал несколько форумов (включая этот) по причинам, почему getHeight() и getWidth() возвращают 0 при использовании в вызове конструктора. То, что казалось общим ответом, это то, что значения высоты и ширины равны 0, пока JPanel не будет правильно инициализирован. Однако я не смог найти решение, которое соответствовало бы тому, чего я пытаюсь достичь.

Мой код, вероятно, довольно плохо структурирован, но я надеюсь, что он все еще имеет некоторый смысл.

Объект JFrame "AstronomicalAssimilators ()" требует создания объекта "Game ()", который, в свою очередь, требует создания объектов всех различных игровых элементов.

public AstronomicalAssimilators(){
        super.setTitle("AstronomicalAssimilators");     
        super.setExtendedState(JFrame.MAXIMIZED_BOTH);
        super.setUndecorated(true);
        super.setResizable(false);
        super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        super.add(new Game());     //Create "game" object (launch "AstronimcalAssimilators" level)     

        super.pack();
        super.setVisible(true);       
}

В проигрывателе класс, объект "Player" создается следующим конструктором:

public Player(JPanel panel, int x, int y, int max_X, int max_Y) {
        this.ship_x_pos = x;
        this.ship_y_pos = y;

        this.max_X = max_X;
        this.max_Y = max_Y;

        this.panel = panel;
}

Теперь мое первоначальное утверждение (в классе "Game"), вызывающее этот конструктор, было:

Player spaceship = new Player(this, getHeight()/2, getWidth()/2, getHeight(), getWidth());

Который прошел правильную панель, но передал {0, 0, 0, 0} для последних четырех аргументов утверждений.

Если я не дал достаточно объяснений, я приложу еще несколько своих код:

public class Game extends JPanel implements ActionListener, KeyListener {

    //List of objects to track each enemy:
    static List<Alien> aliens = new ArrayList<Alien>();

    //Object to track player spaceship:
    Player spaceship = new Player(this, getHeight()/2, getWidth()/2, getHeight(), getWidth());

    //Create timer for triggering game actions:
    Timer time;

    //Method for creating visual output for program:
    public Game(){
        super.setDoubleBuffered(true);
        time = new Timer(10, this);
        time.start();
        addKeyListener(this);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);
    }
}

public class Player {

    //Integers used to store the location and orientation of the player's spaceship:
    public int ship_x_pos, ship_y_pos, ship_x_vel = 0, ship_angle_deg = 0;

    // Integers for bounds of "space" in JFrame:
    int max_X, max_Y;

    // Panel variable for drawing to:
    JPanel panel;

    // Constructor for creating player spaceship object from given parameters:
    public Player(JPanel panel, int x, int y, int max_X, int max_Y) {
        this.ship_x_pos = x;
        this.ship_y_pos = y;

        this.max_X = max_X;
        this.max_Y = max_Y;

        this.panel = panel;
    }

    //Method for moving player spaceship to the right:
    public void moveRight() {
        ship_x_vel = 3;
    }

    // Method for moving player spaceship to the left:
    public void moveLeft() {
        ship_x_vel = -3;
    }

    // Method for displaying spaceship:
    public void paintComponent(Graphics g) {
        ImageIcon player_icon = new ImageIcon(this.getClass().getResource("playership.png"));     // Import image of player spaceship into program
        player_icon.paintIcon(panel, g, ship_x_pos, ship_y_pos);
    }
}

Я надеюсь, что предоставил достаточно информации. Заранее благодарю за любую помощь.

...