3

仍在寻找解决方案

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

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

Linux:

在此处输入图像描述

视窗:

在此处输入图像描述

编辑

我刚刚创建了这个工作的“迷你”示例来进行测试。如果有人有想法,为什么窗口上的矩形是黑色的,我将非常感谢您的回答。这是back.png图像:这是 <code>back.png</code>

import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.ToolbarLayout;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.zest.core.widgets.Graph;
import org.eclipse.zest.core.widgets.GraphNode;
import org.eclipse.zest.core.widgets.IContainer;

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

        Graph graph = new Graph(shell, SWT.NONE);
        graph.setSize(100, 100);

        CustomFigure fig = new CustomFigure(new Label());
        fig.setSize(-1, -1);
        CustomNode node = new CustomNode(graph, SWT.NONE, fig);
        node.setLocation(5, 5);

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

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

    /* Minimal helper class for the figure */
    static class CustomFigure extends Figure
    {
        private Image background = new Image(Display.getDefault(), "back.png");
        private GC gcBack = new GC(background);
        private Label all = new Label(background);
        private Color blau =  new Color(Display.getDefault(), 19, 59, 94);

        public CustomFigure(Label label)
        {
            ToolbarLayout layout = new ToolbarLayout();
            setLayoutManager(layout);
            setMiddle(3);
            add(all);
        }

        /* The problem has to occur somewhere here... */
        public void setMiddle(int value)
        {
            gcBack.setBackground(blau);
            gcBack.setForeground(blau);
            gcBack.setAlpha(255);

            /* color background blue and draw the nr of connections */
            gcBack.drawRoundRectangle(6, 6, 15, 15, 3, 3);
            gcBack.fillRoundRectangle(6, 6, 15, 15, 3, 3);
            gcBack.setForeground(ColorConstants.white);
            gcBack.drawText(value+"", 9, 6, true);

            gcBack.setAlpha(255);

            all.repaint();
        }
    }

    /* Minimal helper class for the node */
    static class CustomNode extends GraphNode
    {
        public CustomNode(IContainer graphModel, int style, CustomFigure figure)
        {
            super(graphModel, style, figure);
        }
        @Override
        protected IFigure createFigureForModel()
        {
            return (IFigure) this.getData();
        }
    }
}
4

4 回答 4

4

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

灰色的:

图像宽度:28 图像长度:28
位深度(位/样本):1
通道(样本/像素):1
像素深度(像素深度):1
颜色类型(光度解释):调色板颜色(1 种颜色,0 透明)
图像过滤器:单行每字节过滤器
隔行扫描:无隔行扫描
压缩方案:Deflate 方法 8,32k 窗口
分辨率:
2835、2835(每米像素)填充顺序:msb 到 lsb
字节顺序:网络(大端)
文本字符串数:0 0

白色的:

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

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

所以它肯定是导致你的问题的图像。

于 2012-10-12T10:12:47.980 回答
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 );
            }

        } );
    }

}

}

于 2012-08-10T08:59:16.017 回答
0

swt 颜色与上下文相关,您不应从 gc 中获取颜色并在另一个中使用它

于 2012-06-11T14:59:44.833 回答
0

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

于 2012-06-28T14:23:09.010 回答