1

MacでSWTを使用する。統合ツールバーを作成します。このツールバーには、スケールウィジェットとラベルウィジェットがあります。ラベルには、スケールのSelectionListenerによって更新されたスケールの現在の値が表示されます

これが実行中の簡単なテストコード(以下に含まれています)です

プログラムの起動時に、スケールウィジェットのサムは移動しません。ラベルは、値が期待どおりに正確に変化していること、スケールウィジェットがカーソルの動きを正しく追跡し、変化した値を報告していることを示しています。親指は動かない。

ユニファイドツールバーを閉じて再度開くと(右上の小さなボタンを使用)、サムが完全に機能するようになります。親指がカーソルを追跡します。

シンプルでコンパイル可能で実行可能なテストコードの複製の問題は次のとおりです。

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.*;


public class scaleTest
    {
        private static Shell shell;
        private static Display display;
        private ToolBar UnifiedToolBar;
        private Scale scale;


        private scaleTest()
            {
                UnifiedToolBar = shell.getToolBar();

            ToolItem containScale = new ToolItem( UnifiedToolBar, SWT.SEPARATOR );
            containScale.setWidth( 200 );

            scale = new Scale( UnifiedToolBar, SWT.HORIZONTAL );
            scale.setMaximum( 72 );
            scale.setSelection( 2 );
            scale.setMinimum( 6 );
            scale.setIncrement( 4 );
            scale.setPageIncrement( 4 );
            scale.setSize( 180, 24 );
            containScale.setControl( scale );


            ToolItem containLabel = new ToolItem( UnifiedToolBar, SWT.SEPARATOR );
            containLabel.setWidth( 20 );
            final Label label = new Label( UnifiedToolBar, SWT.NONE );
            label.setText( "32" );
            containLabel.setControl( label );


            scale.addSelectionListener( new SelectionAdapter()
            {
                @Override
                public void widgetSelected( SelectionEvent selectionEvent )
                    {
                        label.setText( String.valueOf( scale.getSelection() ) );

                    }
            } ); // end addSelectionListener


        } // end of constructor


    public static void main( String[] args )
        {


            display = Display.getDefault();
            shell = new Shell( display );


            shell.setText( "scaleTest App" );
            shell.setSize( 400, 200 );
            shell.setLocation( (display.getClientArea().width / 2) - 200
                                                    ,(display.getClientArea().height / 2) - 100 );
            shell.setLayout( new FormLayout() );


            scaleTest testExample = new scaleTest();

            shell.open();
            while( !shell.isDisposed() )
                {
                    if( !display.readAndDispatch() )
                        display.sleep();
                }
            display.dispose();
        }
} // end scaleTest class

シェル、ツールバー、およびスケールウィジェットで、layout()、layout(true、true)、redraw()、paint()、pack()を、妥当と思われる数の組み合わせで試しました。普通の人間はそれを不当に多くの組み合わせと見なすでしょう。

質問1:起動時に親指を正常に機能させる方法は?

それほど重要ではないフォローアップの質問:

質問2:スケールウィジェットは、pageIncrementとincrementの両方の設定を無視しているように見えます。なんで?

どんな援助でも大歓迎です。

更新:深夜に遊んでいます。Scaleウィジェットをシェルに移動します-上記のテストコードに他の変更はありません。ウィジェットは希望どおりに機能します-thumbはすぐに機能します。スケールと統合ツールバーは一目でお互いをあまり好きではないことがわかります。

4

1 に答える 1

1

質問 2 :

Listenerに を追加することで、ステップ値への「スナップ」を実現できますSWT.Selection。以下のコードでは、 のすべての倍数にスナップします5:

scale.addListener(SWT.Selection, new Listener() {
    public void handleEvent(Event event) {
        // get the current selection and "round" it to the next 5er step
        int scaleValue = scale.getSelection();
        scaleValue = (int)(Math.round(scaleValue / 5.0) * 5);

        // update the label
        label.setText("" + (scaleValue));
        label.pack();

        // update the scale selection
        scale.setSelection(scaleValue);
    }
});

質問 1 については、あまり役に立ちませんが...

于 2012-10-20T15:00:57.737 に答える