仍在寻找解决方案
我有以下问题:我使用SWT GC
将GraphNodes中包含的数字绘制到Zest Graph。
就Linux和MacOS而言,一切正常。但是当我在Windows上运行我的jar时,节点看起来很奇怪。颜色未正确绘制且没有透明度(通过setAlpha()
的{{1}}实现。)
这是两个截图来说明我的问题:
Linux的:
视窗:
修改:
我刚刚创建了这个工作“迷你”示例来测试。如果有人有想法,为什么矩形在窗户上是黑色的,我会非常感谢答案。以下是GC
图片:
back.png
答案 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)
这绝对是你的背景图片导致问题的原因。我用以下示例运行了一些测试。我使用纯白色背景图片和背景图片。使用白色背景图像一切都很好,但如果我使用背景图像,则仅绘制黑色。它很可能是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可能在“耗尽手柄”时没有这么糟糕的行为......