JFrame не размер, я установил его - PullRequest
0 голосов
/ 22 апреля 2020

Я прочитал несколько уроков о том, как это исправить, и ни один из них не помог

Я пытаюсь сделать размер кадра 1280 на 720. Но когда я экспортирую свою игру в банку размер кадра меньше, чем должен быть, что приводит к множеству проблем. Еще одна непонятная вещь: когда я отдаю банку другим, она работает нормально, и у них нет проблем. Это очень сбивает с толку и очень раздражает.

Мой код:

package com.teto.main;
import java.awt.Canvas;
import java.awt.Cursor;
import java.awt.Dimension;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
public class FullFrame extends Canvas {
    private static final long serialVersionUID = 5486926782194361510L;
    Cursor csr = new Cursor(Cursor.CROSSHAIR_CURSOR);
    public FullFrame(int width, int height, String title, Game game) {
        JFrame frame = new JFrame(title);
        frame.setPreferredSize(new Dimension(width, height));
        frame.setMaximumSize(new Dimension(width, height));
        frame.setMinimumSize(new Dimension(width, height));
        frame.setSize(new Dimension(width, height));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        String imageName = "lgico.png";
        URL imageUrl = frame.getClass().getResource(imageName);

        if (imageUrl == null)
        {
            System.out.println("bruh");
            imageUrl = Thread.currentThread().getContextClassLoader().getResource(imageName);
        }

        ImageIcon icon = new ImageIcon( imageUrl );

        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.setIconImage(icon.getImage());
        frame.setCursor(csr);
        frame.add(game);
        game.start();
        frame.pack();
    }
}

Люди говорят, что вы должны переопределить getPreferredSize (), но я не знаю, как я это сделаю, и даже если Я пытаюсь, это ничего не делает.

Ps. Да, я знаю, что мой код грязный.

1 Ответ

0 голосов
/ 23 апреля 2020
frame.add(game);

Компоненты должны быть добавлены в рамку ДО того, как рамка станет видимой.

    frame.setPreferredSize(new Dimension(width, height));
    frame.setMaximumSize(new Dimension(width, height));
    frame.setMinimumSize(new Dimension(width, height));
    frame.setSize(new Dimension(width, height));
  1. Приведенный выше код ничего не делает. Причина, по которой он ничего не делает, заключается в том, что вы позже используете frame.pack () в коде, который будет изменять размер фрейма в соответствии с предпочтительным размером компонентов, добавляемых в фрейм. Поэтому размер фрейма будет предпочтительным размером вашего Game класса плюс дополнительное пространство для строки заголовка и границ фрейма.
  2. Вы не должны пытаться управлять размером фрейма с помощью этих методов. Вы НЕ должны указывать размер, потому что не знаете, какое будет разрешение каждого монитора, который играет в вашу игру.

Лучший способ установить размер - указать кадру заполнить экран.

Таким образом, ваш код должен быть перестроен так, чтобы он выглядел примерно так:

// load the image
ImageIcon icon = new ImageIcon( imageUrl );

JFrame frame = new JFrame(title);
frame.add(game);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setCursor(csr);
frame.setIconImage(icon.getImage());
frame.setResizable(false);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH); // this maximizes the frame
frame.setVisible(true);
game.start();
...