Я создаю программу, и я хочу иметь возможность устанавливать ее размер "на лету" (когда программа работает). Я пытаюсь сделать это, вызывая Canvas.setSize(width, height)
а затем JFrame.pack()
на JFrame
который содержит Canvas
. Проблема в том, что после вызова этих методов размер JFrame изменяется так, что видны только кнопки и кнопки закрытия и минимизации. Как изменить размер во время работы программы? Должен ли я называть что-то еще?
Заранее спасибо!
Вы не должны использовать метод setSize()
для любого компонента, добавляемого в JFrame
.
Swing использует менеджеров компоновки. Метод pack()
вызовет диспетчер компоновки, и диспетчер компоновки обычно использует предпочтительный размер компонента для определения размера/расположения компонентов.
Я предполагаю, что ваш класс Canvas
выполняет обычную роспись и, следовательно, имеет нулевой размер по умолчанию, поэтому отобразить нечего.
Решение состоит в том, чтобы переопределить метод getPreferredSize()
в вашем классе Canvas
чтобы вернуть соответствующий размер.
Кроме того, не называйте вас классом Canvas
, потому что у него есть класс AWT, поэтому он запутывается. Если вы используете класс AWT Canvas, вместо этого вы должны использовать класс JPanel
для пользовательской раскраски.
Вот 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();
}
}
Всем спасибо!
Во-первых, вы должны добавить слушателя для прослушивания событий изменения размера из 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
}
});
Display
, который расширяетCanvas
, и используюCanvas
потому что я создаю игру, поэтому мне нуженBufferStrategy
и т. Д. Кроме того, когда я создаюDisplay
(илиCanvas
), я устанавливаю его размер с помощьюdisplay.setPreferredSize(width, height)
, и я пытался сделать это во время выполнения, когда менял размер, но это не работает. Поэтому я должен переопределитьCanvas.getPreferredSize()
чтобы он возвращал размер, который я хочу дляDisplay
(Canvas
)?