Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于Java重量级swing组件的绘图_Java_Swing_Drawing - Fatal编程技术网

基于Java重量级swing组件的绘图

基于Java重量级swing组件的绘图,java,swing,drawing,Java,Swing,Drawing,我正在使用一个应用程序,其中我向JFrame添加了一个重量级(画布)。画布是第三方组件,所以我需要保持它的重量。我想为用户添加在画布上绘制和绘制选择矩形的功能 我不认为我可以用玻璃窗做到这一点,因为重量级画布将显示在玻璃窗上。我曾尝试将鼠标侦听器添加到画布并直接在其图形上绘制,但这似乎会产生“闪烁”效果,因为它不是一个轻量级的双缓冲组件 有没有办法在重量级组件上实现这种平滑的绘图 这是我目前尝试的重量级组件的绘制方法,但仍然存在闪烁 @Override public void p

我正在使用一个应用程序,其中我向JFrame添加了一个重量级(画布)。画布是第三方组件,所以我需要保持它的重量。我想为用户添加在画布上绘制和绘制选择矩形的功能

我不认为我可以用玻璃窗做到这一点,因为重量级画布将显示在玻璃窗上。我曾尝试将鼠标侦听器添加到画布并直接在其图形上绘制,但这似乎会产生“闪烁”效果,因为它不是一个轻量级的双缓冲组件

有没有办法在重量级组件上实现这种平滑的绘图

这是我目前尝试的重量级组件的绘制方法,但仍然存在闪烁

    @Override
    public void paint(Graphics g)
    {
        super.paint(g);
        if (showUserSelection)
        {
            Point startDrawPoint = new Point(Math.min(startSelectPoint.x,
                    endSelectPoint.x), Math.min(startSelectPoint.y,
                    endSelectPoint.y));
            Point endDrawPoint = new Point(Math.max(startSelectPoint.x,
                    endSelectPoint.x), Math.max(startSelectPoint.y,
                    endSelectPoint.y));
            int w = endDrawPoint.x - startDrawPoint.x;
            int h = endDrawPoint.y - startDrawPoint.y;
            if (w > 0 && h > 0)
            {
                BufferedImage img = new BufferedImage(w, h,
                        BufferedImage.TYPE_INT_ARGB);
                Graphics2D imgGraphics = img.createGraphics();
                imgGraphics.fillRect(0, 0, w, h);
                g.drawImage(img, startDrawPoint.x, startDrawPoint.y, w, h,
                        null);

            }
        }
    }

我不知道“hostawt/SWT-in-Swing”组件中出现了什么,但您应该能够围绕自己构建一个工作

您是否考虑过自己实现双缓冲

您的代码已经完成了90%,只需一眼即可完成

@Override
public void paint(Graphics g)
{
    BufferedImage buffer = new BufferedImage(COMPONENT_WIDTH, COMPONENT_HEIGHT, BufferedImage.TYPE_INT_ARGB);

    Graphics bufferG = buffer.getGraphics();

    super.paint(bufferG);
    if (showUserSelection)
    {
        Point startDrawPoint = new Point(Math.min(startSelectPoint.x,
                endSelectPoint.x), Math.min(startSelectPoint.y,
                endSelectPoint.y));
        Point endDrawPoint = new Point(Math.max(startSelectPoint.x,
                endSelectPoint.x), Math.max(startSelectPoint.y,
                endSelectPoint.y));
        int w = endDrawPoint.x - startDrawPoint.x;
        int h = endDrawPoint.y - startDrawPoint.y;
        if (w > 0 && h > 0)
        {
            bufferG.fillRect(startDrawPoint.x, startDrawPoint.y, w, h);

        }
    }

    g.drawImage(buffer, 0, 0, null);
}

谢谢谢谢你的帮助。我想我只是有点走火入魔了,我想这让我离得更近了。