SWT GC:在Windows上未正确绘制颜色

时间:2012-06-11 14:53:58

标签: java windows linux swt zest

仍在寻找解决方案

我有以下问题:我使用SWT GC将GraphNodes中包含的数字绘制到Zest Graph。 就Linux和MacOS而言,一切正常。但是当我在Windows上运行我的jar时,节点看起来很奇怪。颜色未正确绘制且没有透明度(通过setAlpha()的{​​{1}}实现。)

这是两个截图来说明我的问题:

Linux的:

enter image description here

视窗:

enter image description here

修改

我刚刚创建了这个工作“迷你”示例来测试。如果有人有想法,为什么矩形在窗户上是黑色的,我会非常感谢答案。以下是GC图片:This is the <code>back.png</code>

back.png

4 个答案:

答案 0 :(得分:4)

您的计划中使用的灰色图像和Tobias Willig发布的白色图像有很大不同:

灰色:

  

图像宽度:28图像长度:28
    Bitdepth(Bits / Sample):1
    频道(样本/像素):1
    像素深度(像素深度):1
    颜色类型(光度解释):PALETTED COLOR(1种颜色,0透明)
    图像滤波器:每字节单行滤波器
    隔行扫描:无隔行扫描
    压缩方案:确定方法8,32k窗口
    分辨率:2835,2835(每米像素)
    FillOrder:msb-to-lsb
    字节顺序:网络(Big Endian)
    文本字符串数:0 of 0

白:

  

图像宽度:28图像长度:28
    Bitdepth(Bits / Sample):8
    频道(样本/像素):3
    像素深度(像素深度):24
    颜色类型(光度解释):RGB
    图像滤波器:每字节单行滤波器
    隔行扫描:无隔行扫描
    压缩方案:确定方法8,32k窗口
    分辨率:2835,2835(每米像素)
    FillOrder:msb-to-lsb
    字节顺序:网络(Big Endian)
    文本字符串数:0 of 0

如您所见,灰色图像的Colour Type仅包含1种颜色,而白色图像的{{1}}为RGB。

所以它肯定是造成你问题的形象。

答案 1 :(得分:1)

这绝对是你的背景图片导致问题的原因。我用以下示例运行了一些测试。我使用纯白色背景图片enter image description here和背景图片enter image description here。使用白色背景图像一切都很好,但如果我使用背景图像,则仅绘制黑色。它很可能是SWT中的一个错误。

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class MiniExample {
    public static void main( String[] args ) {
        Display display = Display.getDefault();
        Shell shell = new Shell( display );

        ACanvas canvas = new ACanvas( shell, SWT.None );
        canvas.setSize( 150, 150 );

        shell.pack();
        shell.open();

        while( !shell.isDisposed() ) {
            if( !display.readAndDispatch() )
                display.sleep();
        }
    }

static class ACanvas extends Canvas {

    public ACanvas( Composite parent, int style ) {
        super( parent, style );

        this.addPaintListener( new PaintListener() {

            @Override
            public void paintControl( PaintEvent arg0 ) {
                int value = 5;
                Image background = new Image( Display.getDefault(), "back2.png" );
                GC gcBack = new GC( background );
                //Color blue = Display.getDefault().getSystemColor( SWT.COLOR_BLUE );
                Color blue = new Color( Display.getDefault(), 0, 0, 255 );

                gcBack.setBackground( blue );
                gcBack.setForeground( blue );
                gcBack.setAlpha( 255 );

                gcBack.drawRoundRectangle( 6, 6, 15, 15, 3, 3 );
                gcBack.fillRoundRectangle( 6, 6, 15, 15, 3, 3 );

                gcBack.setForeground( Display.getDefault().getSystemColor( SWT.COLOR_WHITE ) );
                gcBack.drawText( value + "", 9, 6, true );

                gcBack.setAlpha( 255 );

                arg0.gc.drawImage( background, 0, 0 );
            }

        } );
    }

}

}

答案 2 :(得分:0)

swt颜色取决于上下文,你不应该从gc中获取颜色并在另一个中使用它

答案 3 :(得分:0)

您是否检查过Windows中的句柄是否用尽? AFAIK SWT在字体,颜色,图像等的每个实例中使用操作系统的句柄,因此您甚至可以通过不重复使用某些对象(或处置旧的对象;与AWT / Swing的区别)来使您的应用程序陷入困境。 而afaik Linux和Mac OS可能在“耗尽手柄”时没有这么糟糕的行为......