我尝试在 Java 中绘制一个矩形。我设置了frame size (800,400) and resizable(false) rectangle的x = 50, y = 50 width = 700 height = 300。为什么不在中间呢?谢谢你。
问问题
1228 次
2 回答
7
没有任何其他证据,我猜你已经覆盖了paint
类似 a 的方法JFrame
并直接对其进行绘画。
问题是,框架有装饰(例如边框和标题栏),它占用了框架内的空间......
从技术上讲,这是正确的。矩形画在画框的中央,但是因为画框的装饰,看起来有点高……
相反,您应该在框架的内容区域上进行绘画。
在这里,矩形现在看起来正确居中。在我的测试中,我将第一帧(坏)设置为 800x400,我将第二帧的内容窗格的首选尺寸设置为 800x400,这使得帧尺寸实际上是 816x438,因为帧的装饰现在位于绘制区域之外。
public class CenterOfFrame {
public static void main(String[] args) {
new CenterOfFrame();
}
public CenterOfFrame() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
new BadFrame().setVisible(true);
JFrame goodFrame = new JFrame();
goodFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
goodFrame.setContentPane(new PaintablePane());
goodFrame.pack();
goodFrame.setLocationRelativeTo(null);
goodFrame.setVisible(true);
}
});
}
public class BadFrame extends JFrame {
public BadFrame() {
setSize(800, 400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
@Override
public void paint(Graphics g) {
super.paint(g);
paintTest(g, getWidth() - 1, getHeight() - 1);
}
}
public void paintTest(Graphics g, int width, int height) {
g.setColor(Color.RED);
g.drawLine(0, 0, width, height);
g.drawLine(width, 0, 0, height);
g.drawRect(50, 50, width - 100, height - 100);
}
public class PaintablePane extends JPanel {
@Override
public Dimension getPreferredSize() {
return new Dimension(800, 400);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); //To change body of generated methods, choose Tools | Templates.
paintTest(g, getWidth() - 1, getHeight() - 1);
}
}
}
这就是为什么您不应该覆盖paint
顶级容器的方法的众多原因之一;)
于 2012-12-05T23:19:41.163 回答
0
Rectangle rect = new Rectangle(50,50,700,300);
那应该可以正常工作,您是否在访问成员变量之前创建了一个新的 Rectangle 实例?
800 x 400 也是一种奇怪的分辨率,800 x 600 更标准。
于 2012-12-05T23:05:12.000 回答