java - 用Java画对角线

标签 java swing drawing line stroke

我有以下代码:

private _x,_y,_w,_h;
protected void paintComponent( Graphics g_ ) {
  g_.setStroke( new BasicStroke(2) );

  g_.drawLine(_x, _y, _x+_w, _y+_h);
  g_.drawLine(_x, _y+_h, _x+_w, _y);
}

在我的例子中,我绘制了一个正方形的对角线:_w==_h

我的问题是两条线的外观厚度不同:第一条线看起来比第二条线粗。检查此处绘制的实际像素时,渲染的差异:

Stroke 2px

我真的不在乎哪一个应该被认为是“正确的”(虽然我想了解这个结果的原因),但我希望这里有一些连贯性,两条线有相同的渲染:如何我可以这样做吗?

(当我使用 1px 笔划时,两条线之间没有区别)。

跟进 Olavi 的回答:

为笔画使用奇数个像素并不能解决问题:

Stroke 3px

启用抗锯齿会导致另一个问题:绘制十字的正方形的笔划变得模糊:

Stroke 2px + antialiasing

最佳答案

基本上你有两个选择:

  1. 使用奇数厚度
  2. 使用抗锯齿

我个人更喜欢抗锯齿,因为它很漂亮而且我喜欢漂亮的东西。但是要解释为什么笔划宽度为 2 的行为是这样的:Java 不知道是用第一种方式还是第二种方式画线(我无法真正解释为什么它会这样做,但这就是我懂了)。为了进一步阐述这个答案,尝试从另一条线开始向左或向右一个像素:这应该导致两条线具有相同的粗细。

要使用抗锯齿,请执行以下操作(未经测试的代码!)。代码取自 here :

Graphics2D graphics2D = (Graphics2D) g_;

graphics2D.setRenderingHint(
        RenderingHints.KEY_ANTIALIASING,
        RenderingHints.VALUE_ANTIALIAS_ON);

graphics2D.drawLine(_x, _y, _x+_w, _y+_h);
graphics2D.drawLine(_x, _y+_h, _x+_w, _y);

关于java - 用Java画对角线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26585763/

相关文章:

objective-c - Cocoa 绘图, "lock"鼠标在特殊事件上

c++ - 在mfc中绘制父对话框

java - JSP/JSTL - 如何循环访问列表中的列表?

Java 转换对象/字符串数组

java - 为什么我的 jar 这么大?

java - 变量在打印出来之前不会更新?

java - 在 JEditorPane 中的文本之间添加图像

java - java中从数组列表中获取对象的字段

java - 在程序启动时绘制图形; PaintComponent 从未被调用

ios - 在 uiimageview 上使用 Quartz 2D 绘图 - 线条变得模糊