Java在swingRect中摆动奇怪的额外像素

时间:2014-12-08 15:32:34

标签: java swing

我偶然发现了图形drawRect的一个奇怪问题 - 它在矩形的左下角和右下角添加了两个额外的像素。 这是VM的问题吗?或者我理解的东西是错的? 我在Windows 8.1 64bit java SE 1.8.0_25上运行它。

编辑:我已编辑代码以正确覆盖paintComponent。 另外我注意到,当窗口第一次出现时,我确实看到了附加屏幕截图中的内容(带有额外的像素),但是当我将其调整到较小的窗口并返回时(因此迫使EDT再次重新绘制整个面板) ) - 在随后的窗口调整大小中,像素消失并且不再出现 我甚至添加了fillRect来最小化工件的影响(如果有的话),但仍无济于事。

我不知道该怎么做。

编辑2: SSCCE已修改为从EDT运行 - 结果仍然相同

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class GuiTest extends JFrame
{
    public GuiTest()
    {
        super( "Test" );

        setContentPane( new MyPanel() );
        setSize( new Dimension( 200, 200 ) );
        setVisible( true );
    }

    public static void main( String[] args )
    {
        SwingUtilities.invokeLater( new Runnable()
        {
            @Override
            public void run()
            {
                new GuiTest();
            }
        } );
    }

    class MyPanel extends JPanel
    {
        @Override
        protected void paintComponent( Graphics g )
        {
            super.paintComponent( g );
            g.setColor( Color.WHITE );
            g.fillRect( 0, 0, getWidth(), getHeight() );
            g.setColor( Color.BLACK );
            g.drawRect( 10, 10, 100, 100 );
        }
    }
}

screenshot

2 个答案:

答案 0 :(得分:1)

哈!
我刚刚注意到这是一个硬件加速问题 如果我使用-Dsun.java2d.d3d=false关闭它,那么一切似乎都正常绘制 - 没有额外的像素。 我检查了我的显示适配器(NVIDIA GeForce GTX 850M)驱动程序(根据@Fast Snail建议)并且它是最新的。
这很奇怪 - 但仍然没有答案,问题的根源至少是明确的。

答案 1 :(得分:0)

我得到了我认为是一个相关的问题,但仅影响宽度,并且仅在非常浅的矩形的情况下出现,但它使宽度偏离了某些像素... Java Swing Graphics drawRect,drawRoundRect等全部从矩形的右边放下一些像素。

我尝试了@Extremely的建议进行硬件加速,但没有任何区别。

在这些drawRoundRect和fillRoundRect调用中,我将width参数增加了12(!),它可以完美运行! k!

第二个想法,我认为这是一个完全不同的问题-我将提出一个单独的问题。谢谢!