Jak przekazać zmienną do metody anonimowej

0

Mam taki kod do buttona w SWT:

Shell shell = new Shell(...);
b.addSelectionListener(new SelectionAdapter() {
		public void widgetSelected(SelectionEvent e)
		{
		    System.out.println("konan");
                    //tu chciałbym wywołać shell.setText("Barbarzynca");
	             	   
		}
	});

Jak to zrobić?

1

shell musi być finalne:

final Shell shell = new Shell(...);

Albo jako pole w klasie.

1

Względnie SelectionAdapter jako prywatną klasę w klasie tzn:

class MojaKlasa{

  private class MySelectionAdapter implements SelectionAdapter{
     //... tu kod
  }

i następnie przekazać shell jako argument konstruktora.

0

działa, dzięki

0

To cały kod:

public class asd {
	
	protected  static Shell shell;
	
	class MySelectionAdapter  extends SelectionAdapter
	{
		
		
		public void widgetSelected(SelectionEvent e)
		{
		    System.out.println("konan");
		    shell.setText("barbarzynca");
		}
	
	}
	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	Display display = new Display();
	shell=new Shell(display);
	shell.setText("Hello world!");
	Point p = new Point(640,480);
	shell.setSize(p);
	shell.setLayout(null);
	
	
	Button b = new Button(shell, SWT.PUSH);
	b.setText("Zwykły przycisk");
	b.setSize(new Point(100,50));
	asd aa = new asd();
	
	b.addSelectionListener(aa.new MySelectionAdapter());
	
		
	shell.open();
	while (!shell.isDisposed()) {
	if (!display.readAndDispatch()) display.sleep();
	}
	display.dispose();
	}

}

Powiedz @iooi co tu jest źle z punktu widzenia dobrej aplikacji.

0

co jest źle? robisz podstawowy błąd projektowy! utwórz sobie więcej niż jedną instancję takiego "kodu", każdą z inną wartością shell.
nie stosuje się statycznych zmiennych jako kontenerów. zrób tak, jak napisał Koziołek, pole w klasie z wartością nadawaną poprzez parametr konstruktora.
a z punktu widzenia dobrej aplikacji to całość jest do wyrzucenia: nie ma wiele wspólnego z obiektowością, kod layoutu i kontrolera w tym samym miejscu, no i ten żałosny static, żeby obca klasa mogła się odwołać do pola obiektu-rodzica.

0

Teraz to co innego - nie dziwota, że każe ci robić static. Złe jest to, że cały kod trzymasz w mainie, kiedy powinieneś to wydzielić do osobnej niestatycznej metody nowego obiektu. W dodatku i tak tworzysz obiekt asd, żeby móc stworzyć obiekt listenera (!).

public class MojaAplikacja {
    public void run() {
        Display display = new Display();
        Shell shell = new MójShell(display);
        
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();
    }
    
    public static void main(String[] args) {
        new MojaAplikacja().run();
    }
}


public class MójShell extends Shell {
    private class MySelectionAdapter extends SelectionAdapter {
        public void widgetSelected(SelectionEvent e) {
            System.out.println("konan");
            shell.setText("barbarzynca");
        }
    }

    public MójShell(Display display) {
        super(display);
        stwórzUI();
    }

    protected void stwórzUI() {
        setText("Hello world!");
        Point p = new Point(640,480);
        setSize(p);
        setLayout(null);

        Button b = new Button(shell, SWT.PUSH);
        b.setText("Zwykły przycisk");
        b.setSize(new Point(100,50));
        b.addSelectionListener(new MySelectionAdapter());
    }
}

Zero staticów, tym samym MySelectionAdapter może być anonimowy. Kod głównie przepisany, to wciąż nie jest w żadnym wypadku w pełni poprawny kod z punktu widzenia dobrej aplikacji. Dla lepszego ogarnięcia SWT polecam zobaczyć JFace.

0
public class asd {
		
	Shell shell;
	
	public asd(Shell _shell)
	{
	   this.shell=_shell;
	}
	
	class MySelectionAdapter  extends SelectionAdapter
	{
		
		
		public void widgetSelected(SelectionEvent e)
		{
		    System.out.println("konan");
		    shell.setText("barbarzynca");
		}
	
	}
	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
    
	
		
    Display display = new Display();
	Shell shell=new Shell(display);
	shell.setText("Hello world!");
	Point p = new Point(640,480);
	shell.setSize(p);
	shell.setLayout(null);
	

	
	Button b = new Button(shell, SWT.PUSH);
	b.setText("Zwykły przycisk");
	b.setSize(new Point(100,50));
	
	asd aa = new asd(shell);
	
	b.addSelectionListener(aa.new MySelectionAdapter());
			
	shell.open();
	while (!shell.isDisposed()) {
	if (!display.readAndDispatch()) display.sleep();
	}
	display.dispose();
	}

}

Tak miało być? Sam nie wiem jak to się stało, że takie podstawy mi umknęły, to chwilowe zamroczenie, ślepy jestem :D
Dzięki

1 użytkowników online, w tym zalogowanych: 0, gości: 1