1 回答

TA貢獻1851條經驗 獲得超4個贊
您可能希望首先快速閱讀本文,以便更好地理解為什么當前的方法不起作用(按照您期望的方式)。
我要做的第一件事就是改變你的,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 開始
添加回答
舉報