如果你运行下面的代码,你会发现有一个红色正方形,沿着正方形的底边和右边有一条蓝线。但是,正如您在代码中看到的那样,正在绘制的矩形的参数与正在填充的矩形相同。
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel() {
@Override
public void paintComponent(Graphics g) {
g.setColor(Color.blue);
g.drawRect(50, 50, 100, 100);
g.setColor(Color.red);
g.fillRect(50, 50, 100, 100);
}
};
panel.setPreferredSize(new Dimension(200, 200));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(panel);
frame.pack();
frame.setVisible(true);
}
有谁知道这种行为背后的原因?或者这是Java代码库中的错误吗?
似乎绘制矩形会将指定矩形的宽度和高度加1。对于一个人来说,这似乎是不直观的行为,但在我的情况下,它也会对我正在构建的gui造成一些不良影响。
使用水平/垂直线绘制多边形时也会发现此行为。有没有一种简单的方法可以在图形绘制和填充功能之间绘制一些内容?如果有任何方法可以使用相同的点完全绘制先前绘制的折线,那将是很好的。
我想到的一种方法是每当我想要填充多边形时绘制和填充,然后在我想绘制多边形时绘制。 这实际上适用于不透明多边形的情况,但在我的情况下,我有不透明和透明的多边形,所以这种方法不是一种选择。
答案 0 :(得分:1)
Graphics API中明确记录了这一点:
<强>的drawRect 强>
public void drawRect(int x, 是的, 整数宽度, int height)
绘制指定矩形的轮廓。矩形的左右边缘为x和x +宽度。顶部和底部边缘位于y和y +高度。使用图形上下文的当前颜色绘制矩形。
和
<强> fillRect 强>
public abstract void fillRect(int x, 是的, 整数宽度, int height)
填充指定的矩形。矩形的左右边缘位于x和x +宽度-1处。顶部和底部边缘位于y和y +高度-1处。生成的矩形覆盖宽度为像素宽的区域宽度和高度像素高。使用图形上下文的当前颜色填充矩形。
请注意右边和底边的计算差异。虽然这种差异已明确记录在案,但没有理由说明这种差异。
最后,请注意paintComponent()
的第一行应为super.paintComponent(g);
。这将确保超级类有机会初始化事物,包括清除您将绘制的区域。