3

まだ解決策を探しています

次の問題があります。SWTを使用GCして、GraphNodesに含まれる図形をZestグラフに描画します。LinuxとMacOSに関する限り、すべてが正常に機能します。しかし、Windowsでjarを実行すると、ノードが非常に奇妙に見えます。色が正しくペイントされておらず、透明度がありません(を介して達成setAlpha()GC

これが私の問題を説明するための2つのスクリーンショットです:

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

プログラムで使用されている灰色の画像とTobiasWilligによって投稿された白い画像は大きく異なります。

グレー:

画像幅:28画像長:28
ビット深度(ビット/サンプル):1
チャネル(サンプル/ピクセル):1
ピクセル深度(ピクセル深度):1
色タイプ(フォトメトリック解釈):パレットカラー(1色、0透明)
画像フィルター:バイトあたりの単一行フィルター
インターレース:インターレースなし
圧縮スキーム:収縮方法8、32kウィンドウ
解像度:2835、2835(ピクセル/メートル)
FillOrder:msb-to-lsb
バイト順序:ネットワーク(ビッグエンディアン)
テキスト文字列の数:0 0の

白:

画像幅:28画像長:28
ビット深度(ビット/サンプル):8
チャネル(サンプル/ピクセル):3
ピクセル深度(ピクセル深度):24
色タイプ(フォトメトリック解釈):RGB
画像フィルター:バイトフィルターあたり1行
インターレース:インターレースなし
圧縮スキーム:Deflateメソッド8、32kウィンドウ
解像度:2835、2835(ピクセル/メートル)
FillOrder:msb-to-lsb
バイト順序:ネットワーク(ビッグエンディアン)
テキスト文字列の数:0 of 0

ご覧のとおりColour Type、グレー画像のは1色しか含まれていませんが、白い画像の1つは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 は、Font、Color、Image などのすべてのインスタンスで OS からのハンドルを使用しているため、特定のオブジェクトを再利用しない (または古いオブジェクトを破棄する、AWT/Swing との違い) ことで、アプリケーションに問題が発生することさえあります。そして、「ハンドル不足」に関しては、LinuxとおそらくMac OSにはそれほどひどい動作はありません...

于 2012-06-28T14:23:09.010 に答える