Возможно, вы захотите начать с быстрого прочтения этого , чтобы лучше понять, почему ваш текущий подход не будет работать (так, как вы ожидаете).
Первое, что я хотел бы сделать, это изменить свой GraphPanel
, чтобы он определял его preferredSize
, независимо от окна. Таким образом, вместо этого вы управляете системой управления макетом.
Далее, я бы использовал фактический физический размер компонента, чтобы основывать ваши расчеты на
int width = (int) (getWidth() * 0.8);
int height = (int) (getHeight() * 0.8);
Я бы также рекомендовал переместитьsetBackground
и setBackground
из paint
метода. Это вызовет новый цикл боли и создаст беспорядок.
public class GraphPanel extends Canvas {
private static final int PREF_WIDTH = 1100;
private static final int PREF_HEIGHT = 600;
public GraphPanel() {
setBackground(Color.WHITE);
setBackground(Color.DARK_GRAY);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(PREF_WIDTH, PREF_HEIGHT);
}
@Override
public void paint(Graphics g) {
super.paint(g);
int width = (int) (getWidth() * 0.8);
int height = (int) (getHeight() * 0.8);
int x = (getWidth() - width) / 2;
int y = (getHeight() - height) / 2;
//Not working as intented
g.drawRect(x, y, width, height);
}
}
Затем я обновил бы ваш класс Window
, чтобы он использовал pack
вместо setSize
. Это «упаковывает» окно вокруг контента, принимая во внимание декорации фрейма.
public class Window extends JFrame {
public void settings() {
pack();
setLocationRelativeTo(null);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
Хотя я бы поставил под сомнение вопрос о расширении с JFrame
, но я получаю тему.
Кстати, если вы не собираетесь использовать высокопроизводительную графику, требующую полного контроля над подсистемой рисования, я бы порекомендовал начать с компонентов на основе Swing или даже с JavaFX