0

私は実際にswtベースのプログラムを作成しています。コードをクリーンアップしようとすると、問題が発生しました。「グループとボタンの宣言」を新しいクラスに入れたいのですが、そのため、shellオブジェクトを新しいクラスに送信する必要があります。どうやってやるの?shell(オブジェクトをコンストラクターに送信しても機能しません)。ここに私の問題のSSCCEがあります:

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.wb.swt.SWTResourceManager;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;

public class Class1 
{
  static Shell shell;

  protected void createContents() 
  {
    shell = new Shell();
    shell.setMinimumSize(new Point(800, 600));
     shell.setBackground(SWTResourceManager.getColor(242, 242, 242));
     shell.setSize(815, 600);
     shell.setText("Test");

     /*
     * Declaration of the groups and buttons
     */
     Group areaA = new Group(shell, SWT.NONE);
     Button btn1 = new Button(areaA, SWT.CHECK);
     Button btn2 = new Button(areaA, SWT.CHECK);
     Button btn3 = new Button(areaA, SWT.CHECK);
     Group areaB = new Group(shell, SWT.NONE);
     Spinner spin1 = new Spinner(areaB, SWT.BORDER);
     Spinner spin2 = new Spinner(areaB, SWT.BORDER);
     Spinner spin3 = new Spinner(areaB, SWT.BORDER);
     Spinner spin4 = new Spinner(areaB, SWT.BORDER);
     Button btnA = new Button(areaB, SWT.CHECK);

     /*
     * Processing of the buttons (short example)
     */
     areaA.setBounds(52, 46, 383, 210);
     btn1.setBounds(10, 10, 85, 16);
     btn1.setText("Button1");
     btn2.setBounds(10, 56, 85, 16);
     btn2.setText("Button2");
     btn3.setBounds(10, 111, 85, 16);
     btn3.setText("Button3");
     areaB.setBounds(52, 274, 383, 192);
     spin1.setBounds(193, 34, 47, 21);
     spin2.setBounds(282, 34, 47, 21);
     spin3.setBounds(193, 82, 47, 21);
     spin4.setBounds(282, 82, 47, 21);
     btnA.addSelectionListener(new SelectionAdapter() 
     {
       @Override
       public void widgetSelected(SelectionEvent arg0) 
       {

       }
     });
     btnA.setBounds(10, 34, 85, 16);
     btnA.setText("Select range a");
     Button btnB = new Button(areaB, SWT.CHECK);
     btnB.setBounds(10, 87, 85, 16);
     btnB.setText("Select range b");
   }

  public static void main(String[] args) 
  {
   /*
    * Creating and disposing of the window
    */
   Display display = Display.getDefault();
   try 
   {
    Class1 window = new Class1();
    window.createContents();
    shell.layout();
    shell.setVisible(true);
    while (!shell.isDisposed()) 
    {
      if (!display.readAndDispatch()) 
      {
        display.sleep();
      }
    }
    display.dispose();
  } 
  catch (Exception e) 
  {
   e.printStackTrace();
  }
 }
}

これを適切に作成する方法はありますか?

EDIT:最初に全体を2つの異なるクラスに入れてみてください:

package test;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.wb.swt.SWTResourceManager;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import test.Class2;

public class Class2 
{
  public Class2(Shell shell) 
  {
    /*
    * Declaration of the groups and buttons
    */
     Group areaA = new Group(shell, SWT.NONE);
     Button btn1 = new Button(areaA, SWT.CHECK);
     Button btn2 = new Button(areaA, SWT.CHECK);
     Button btn3 = new Button(areaA, SWT.CHECK);
     Group areaB = new Group(shell, SWT.NONE);
     Spinner spin1 = new Spinner(areaB, SWT.BORDER);
     Spinner spin2 = new Spinner(areaB, SWT.BORDER);
     Spinner spin3 = new Spinner(areaB, SWT.BORDER);
     Spinner spin4 = new Spinner(areaB, SWT.BORDER);
     Button btnA = new Button(areaB, SWT.CHECK);
    }
 }

次に、Class2 の呼び出しと使用 (SSCCE からの変更例) :

 protected void createContents() 
 {
  shell = new Shell();
  shell.setMinimumSize(new Point(800, 600));
  shell.setBackground(SWTResourceManager.getColor(242, 242, 242));
  shell.setSize(815, 600);
  shell.setText("Test");

  Class2 buttons = new Class2(shell);
  /*
  * Processing of the buttons (short example)
  */
  buttons.areaA.setBounds(52, 46, 383, 210);
  buttons.btn1.setBounds(10, 10, 85, 16);
  buttons.btn1.setText("Button1");
  buttons.btn2.setBounds(10, 56, 85, 16);
  buttons.btn2.setText("Button2");
  buttons.btn3.setBounds(10, 111, 85, 16);
  buttons.btn3.setText("Button3");
  buttons.areaB.setBounds(52, 274, 383, 192);
  buttons.spin1.setBounds(193, 34, 47, 21);
  buttons.spin2.setBounds(282, 34, 47, 21);
  buttons.spin3.setBounds(193, 82, 47, 21);
  buttons.spin4.setBounds(282, 82, 47, 21);
  buttons.btnA.addSelectionListener(new SelectionAdapter() 
  {
    @Override
    public void widgetSelected(SelectionEvent arg0) 
    {

     }
  });
  buttons.btnA.setBounds(10, 34, 85, 16);
  buttons.btnA.setText("Select range a");
  Button btnB = new Button(buttons.areaB, SWT.CHECK);
  btnB.setBounds(10, 87, 85, 16);
  btnB.setText("Select range b");
}

この例は機能しませ

私が考えたもう1つの解決策は、宣言部分をclass2の本体に入れることですが、Shellオブジェクトが欠落しており、コンストラクターを介さずにオブジェクトをクラスに渡す方法がわかりません。


ここで私の問題の SSCCE :「グループとボタンの宣言」を新しいクラスに入れたいのですが、そのため、shellオブジェクトを新しいクラスに送信する必要があります。どうやってやるの?shell(オブジェクトをコンストラクターに送信しても機能しません)。

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.wb.swt.SWTResourceManager;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;

public class Class1 
{
  static Shell shell;

  protected void createContents() 
  {
    shell = new Shell();
    shell.setMinimumSize(new Point(800, 600));
     shell.setBackground(SWTResourceManager.getColor(242, 242, 242));
     shell.setSize(815, 600);
     shell.setText("Test");

     /*
     * Declaration of the groups and buttons
     */
     Group areaA = new Group(shell, SWT.NONE);
     Button btn1 = new Button(areaA, SWT.CHECK);
     Button btn2 = new Button(areaA, SWT.CHECK);
     Button btn3 = new Button(areaA, SWT.CHECK);
     Group areaB = new Group(shell, SWT.NONE);
     Spinner spin1 = new Spinner(areaB, SWT.BORDER);
     Spinner spin2 = new Spinner(areaB, SWT.BORDER);
     Spinner spin3 = new Spinner(areaB, SWT.BORDER);
     Spinner spin4 = new Spinner(areaB, SWT.BORDER);
     Button btnA = new Button(areaB, SWT.CHECK);

     /*
     * Processing of the buttons (short example)
     */
     areaA.setBounds(52, 46, 383, 210);
     btn1.setBounds(10, 10, 85, 16);
     btn1.setText("Button1");
     btn2.setBounds(10, 56, 85, 16);
     btn2.setText("Button2");
     btn3.setBounds(10, 111, 85, 16);
     btn3.setText("Button3");
     areaB.setBounds(52, 274, 383, 192);
     spin1.setBounds(193, 34, 47, 21);
     spin2.setBounds(282, 34, 47, 21);
     spin3.setBounds(193, 82, 47, 21);
     spin4.setBounds(282, 82, 47, 21);
     btnA.addSelectionListener(new SelectionAdapter() 
     {
       @Override
       public void widgetSelected(SelectionEvent arg0) 
       {

       }
     });
     btnA.setBounds(10, 34, 85, 16);
     btnA.setText("Select range a");
     Button btnB = new Button(areaB, SWT.CHECK);
     btnB.setBounds(10, 87, 85, 16);
     btnB.setText("Select range b");
   }

  public static void main(String[] args) 
  {
   /*
    * Creating and disposing of the window
    */
   Display display = Display.getDefault();
   try 
   {
    Class1 window = new Class1();
    window.createContents();
    shell.layout();
    shell.setVisible(true);
    while (!shell.isDisposed()) 
    {
      if (!display.readAndDispatch()) 
      {
        display.sleep();
      }
    }
    display.dispose();
  } 
  catch (Exception e) 
  {
   e.printStackTrace();
  }
 }
}
4

1 に答える 1

0

Widget以下のコードを見て、 にs を追加するユーティリティ クラスを作成する方法を理解してCompositeください。あなたが実際に何を達成したいのかわからないので、これは単なるダミーコードであることに注意してください。

public static void main(String[] args)
{
    final Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setText("StackOverflow");
    shell.setLayout(new GridLayout(1, true));

    ButtonUtils.addThreeLabels(new Composite(shell, SWT.NONE));
    ButtonUtils.addFourButtons(new Composite(shell, SWT.NONE));

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

private static class ButtonUtils
{
    public static void addFourButtons(Composite parent)
    {
        parent.setLayout(new GridLayout(4, true));
        parent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        for(int i = 0; i < 4; i++)
        {
            Button button = new Button(parent, SWT.PUSH);
            button.setText("Button " + i);
            button.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        }
    }

    public static void addThreeLabels(Composite parent)
    {
        parent.setLayout(new GridLayout(3, true));
        parent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        for(int i = 0; i < 3; i++)
        {
            Label label = new Label(parent, SWT.PUSH);
            label.setText("Label " + i);
            label.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        }
    }
}

次のようになります。

ここに画像の説明を入力

于 2013-10-11T10:22:31.920 に答える