JFrame становится маленьким после вызова Canvas.setSize () и JFrame.pack () после запуска программы

1

Я создаю программу, и я хочу иметь возможность устанавливать ее размер "на лету" (когда программа работает). Я пытаюсь сделать это, вызывая Canvas.setSize(width, height) а затем JFrame.pack() на JFrame который содержит Canvas. Проблема в том, что после вызова этих методов размер JFrame изменяется так, что видны только кнопки и кнопки закрытия и минимизации. Как изменить размер во время работы программы? Должен ли я называть что-то еще?

Заранее спасибо!

Теги:
canvas
resize
swing
jframe

3 ответа

3
Лучший ответ

Вы не должны использовать метод setSize() для любого компонента, добавляемого в JFrame.

Swing использует менеджеров компоновки. Метод pack() вызовет диспетчер компоновки, и диспетчер компоновки обычно использует предпочтительный размер компонента для определения размера/расположения компонентов.

Я предполагаю, что ваш класс Canvas выполняет обычную роспись и, следовательно, имеет нулевой размер по умолчанию, поэтому отобразить нечего.

Решение состоит в том, чтобы переопределить метод getPreferredSize() в вашем классе Canvas чтобы вернуть соответствующий размер.

Кроме того, не называйте вас классом Canvas, потому что у него есть класс AWT, поэтому он запутывается. Если вы используете класс AWT Canvas, вместо этого вы должны использовать класс JPanel для пользовательской раскраски.

  • 0
    Я использую пользовательский класс Display , который расширяет Canvas , и использую Canvas потому что я создаю игру, поэтому мне нужен BufferStrategy и т. Д. Кроме того, когда я создаю Display (или Canvas ), я устанавливаю его размер с помощью display.setPreferredSize(width, height) , и я пытался сделать это во время выполнения, когда менял размер, но это не работает. Поэтому я должен переопределить Canvas.getPreferredSize() чтобы он возвращал размер, который я хочу для Display ( Canvas )?
  • 0
    @ TheDDestroyer12, вы должны переопределить класс Display, поскольку это класс, который содержит пользовательский код и, следовательно, знает, какой должен быть правильный размер компонента.
Показать ещё 6 комментариев
0

Вот SSCCE (Short, Self Contained, Correct, Compatible, Example):

import java.awt.Dimension;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;

public class Game extends JFrame implements Runnable {
    private static final long serialVersionUID = 1L;

    // The thread
    private Thread thread;

    // The Canvas
    private Display display;

    // Start the game and it thread
    public synchronized void start() {
        // Create the thread
        thread = new Thread(this, "Game");
        // Start the thread
        thread.start();
    }

    // The run method
    public void run() {
        // SETUP THE JFRAME

        // Create the Display
        display = new Display(700, 500);
        // Set the title of the JFrame
        setTitle("Game");
        // Set the JFrame to not be resizable
        setResizable(false);
        // Add the Display to the frame
        add(display);
        // Pack the JFrame
        pack();
        // Set the location
        setLocationRelativeTo(null);
        // Add a window listener
        addWindowListener(new WindowAdapter() {
            // When the window is being closed
            public void windowClosing(WindowEvent e) {
                // Stop the game
                stop();
            }
        });
        // Show the JFrame
        setVisible(true);

        try {
            // Make the thread wait for two seconds, so that the change is visible
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            // Print the error message
            e.printStackTrace();
        }

        // CHANGE THE SIZE OF THE JFRAME
        // Pretend that this is used for changing the size of the game window
        // by the user, later in the game. I'm just testing it now, when I don't
        // have extremely much code

        // Change the size of the Display
        display.setPreferredSize(new Dimension(800, 600));
        // Pack the JFrame
        pack();
    }

    // Stop the game and it thread
    public synchronized void stop() {
        try {
            // Join the thread
            thread.join();
        } catch (InterruptedException e) {
            // Print the error message
            e.printStackTrace();
        }
        // Exit the program
        System.exit(0);
    }

    // The main method
    public static void main(String[] args) {
        // Create and start a new Game
        new Game().start();
    }
}

Всем спасибо!

  • 0
    Близко, но не совсем SSCCE. У нас нет доступа к вашему классу Display, поэтому мы не можем выполнить ваш код. Для правильного SSCCE вы бы просто использовали базовый JPanel. Во-первых, с JPanel SSCCE меньше, потому что вам не нужно размещать код. Во-вторых, вы сначала хотите убедиться, что проблема НЕ в вашем пользовательском коде. Так что, если он работает с JPanel, но не с вашим пользовательским классом Display, то вы знаете, что проблема в классе Display. Еще один ключ к решению проблемы.
  • 0
    Ой, прости, забыл этот класс. Я добавлю это позже
Показать ещё 1 комментарий
0

Во-первых, вы должны добавить слушателя для прослушивания событий изменения размера из JFrame. Когда размер JFrame будет изменен, будет вызван метод componentResized. Затем вы можете получить текущий размер JFrame и установить размер Canvas.

JFrame component = new JFrame("My Frame");

component.addComponentListener(new ComponentAdapter() 
{  
    public void componentResized(ComponentEvent evt) {
        Component c = evt.getComponent();
        Dimension dim = c.getSize();

        // process the Dimension and set your Canvas size
    }
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню