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 开始
添加回答
举报