我偶然发现了图形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 );
}
}
}
答案 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!
第二个想法,我认为这是一个完全不同的问题-我将提出一个单独的问题。谢谢!