SWT преначертайте обвивката

Проблемът е доста очевиден, така че искам, след като натисна бутон (или етикет в моя случай), оформлението да се промени и актуализира. Опитах няколко предложени решения, но нито едно не ми помогна. Промяната е в createLoginLayout() вътре в слушателя на следите на мишката 'login'. Знам, че кодът изглежда прекалено сложен, това е, защото използвам WindowBuilder

protected Shell mainShell;
private Text hangmanPic;
private Text clueField;
private Composite alphabetComposite;
private Display display;
private Label currGuess;
private GameManager gameManager;
private Label clueTitle;
private Text usrField;
private Label passTitle;
private Text passField;
private Label login;
private Label register;

public static void main(String[] args) {
    try {
        Main window = new Main();
        window.open();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

/**
 * Open the window.
 */
public void open() {
    display = Display.getDefault();
    createContents();
    mainShell.open();
    mainShell.layout();
    while (!mainShell.isDisposed()) {
        if (!display.readAndDispatch()) {
            display.sleep();
        }
    }
}

/**
 * Create contents of the window.
 * @wbp.parser.entryPoint
 */
protected void createContents() {

    //Init new game
    gameManager=new GameManager();

    //createGameMainLayout();
    createLoginLayout();
    //createRegisterLayout();

}

/**
 * Creates the layout of the login page
 */
private void createLoginLayout(){
    mainShell = new Shell(display,SWT.CLOSE | SWT.TITLE | SWT.MIN);
    mainShell.setSize(685, 481);
    mainShell.setText("Location Hangman");
    mainShell.setLayout(new FormLayout());
    Image image = new Image(display, System.getProperty("user.dir")+"/res/back.jpg");
    mainShell.setBackgroundImage(image);
    mainShell.setBackgroundMode(SWT.INHERIT_FORCE);

    Label gameTitle = new Label(mainShell, SWT.NONE);
    gameTitle.setFont(new Font(Display.getDefault(),"DJB CHALK IT UP", 40, SWT.NONE ));
    gameTitle.setForeground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
    gameTitle.setAlignment(SWT.CENTER);
    gameTitle.setText("Location Hangman ^");
    FormData fd_gameTitle = new FormData();
    fd_gameTitle.top = new FormAttachment(0, 94);
    fd_gameTitle.left = new FormAttachment(0, 10);
    fd_gameTitle.right = new FormAttachment(100, -10);
    fd_gameTitle.bottom = new FormAttachment(0, 163);
    gameTitle.setLayoutData(fd_gameTitle);

    Label usrTitle = new Label(mainShell, SWT.NONE);
    usrTitle.setFont(new Font(Display.getDefault(),"DJB CHALK IT UP", 20, SWT.NONE ));
    usrTitle.setForeground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
    usrTitle.setAlignment(SWT.RIGHT);
    FormData fd_usrTitle = new FormData();
    fd_usrTitle.top = new FormAttachment(gameTitle, 81);
    fd_usrTitle.left = new FormAttachment(0, 10);
    usrTitle.setLayoutData(fd_usrTitle);
    usrTitle.setText("Username:");

    usrField = new Text(mainShell, SWT.NONE);
    fd_usrTitle.right = new FormAttachment(usrField, -6);
    usrField.setFont(new Font(Display.getDefault(),"DJB CHALK IT UP", 20, SWT.NONE ));
    usrField.setForeground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
    FormData fd_usrField = new FormData();
    fd_usrField.left = new FormAttachment(0, 331);
    fd_usrField.right = new FormAttachment(100, -148);
    fd_usrField.top = new FormAttachment(gameTitle, 81);
    usrField.setLayoutData(fd_usrField);

    passTitle = new Label(mainShell, SWT.NONE);
    passTitle.setFont(new Font(Display.getDefault(),"DJB CHALK IT UP", 20, SWT.NONE ));
    passTitle.setForeground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
    passTitle.setAlignment(SWT.RIGHT);
    FormData fd_passTitle = new FormData();
    fd_passTitle.top = new FormAttachment(usrTitle, 22);
    fd_passTitle.right = new FormAttachment(usrTitle, 0, SWT.RIGHT);
    fd_passTitle.left = new FormAttachment(0, 10);
    passTitle.setLayoutData(fd_passTitle);
    passTitle.setText("Password:");

    passField = new Text(mainShell, SWT.PASSWORD | SWT.NONE);
    passField.setFont(new Font(Display.getDefault(),"DJB CHALK IT UP", 20, SWT.NONE ));
    passField.setForeground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
    FormData fd_passField = new FormData();
    fd_passField.top = new FormAttachment(passTitle, 0, SWT.TOP);
    fd_passField.left = new FormAttachment(usrField, 0, SWT.LEFT);
    fd_passField.right = new FormAttachment(100, -148);
    passField.setLayoutData(fd_passField);

    login = new Label(mainShell, SWT.NONE);
    fd_passTitle.bottom = new FormAttachment(login, -43);
    login.setAlignment(SWT.CENTER);
    login.setFont(new Font(Display.getDefault(),"DJB CHALK IT UP", 20, SWT.NONE ));
    login.setForeground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
    login.setText("Login");
    FormData fd_login = new FormData();
    fd_login.right = new FormAttachment(usrTitle, 0, SWT.RIGHT);
    fd_login.bottom = new FormAttachment(100, -27);
    fd_login.top = new FormAttachment(100, -68);
    fd_login.left = new FormAttachment(0, 202);
    login.setLayoutData(fd_login);
    login.addMouseTrackListener(new MouseTrackAdapter() {
        @Override
        public void mouseEnter(MouseEvent arg0) {
            login.setForeground(SWTResourceManager.getColor(SWT.COLOR_DARK_GRAY));
        }
        @Override
        public void mouseExit(MouseEvent arg0) {
            login.setForeground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
        }
    });


    register = new Label(mainShell, SWT.NONE);
    register.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseDown(MouseEvent arg0) {

            createRegisterLayout(); //change of layout

            mainShell.layout(true, true);
            mainShell.redraw();
            mainShell.update(); 

        }
    });
    register.setAlignment(SWT.CENTER);
    register.setFont(new Font(Display.getDefault(),"DJB CHALK IT UP", 20, SWT.NONE ));
    register.setForeground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
    register.setText("Register");
    FormData fd_register = new FormData();
    fd_register.top = new FormAttachment(login, 0, SWT.TOP);
    fd_register.left = new FormAttachment(usrField, 0, SWT.LEFT);
    fd_register.right = new FormAttachment(100, -225);
    register.setLayoutData(fd_register);
    register.addMouseTrackListener(new MouseTrackAdapter() {
        @Override
        public void mouseEnter(MouseEvent arg0) {
            register.setForeground(SWTResourceManager.getColor(SWT.COLOR_DARK_GRAY));
        }
        @Override
        public void mouseExit(MouseEvent arg0) {
            register.setForeground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
        }
    });

}

/**
 * Creates the layout of the register page
 */
private void createRegisterLayout(){
    mainShell = new Shell(display,SWT.CLOSE | SWT.TITLE | SWT.MIN);
    mainShell.setSize(685, 481);
    mainShell.setText("Location Hangman");
    mainShell.setLayout(new FormLayout());
    Image image = new Image(display, System.getProperty("user.dir")+"/res/back.jpg");
    mainShell.setBackgroundImage(image);
    mainShell.setBackgroundMode(SWT.INHERIT_FORCE);

    Label gameTitle = new Label(mainShell, SWT.NONE);
    gameTitle.setFont(new Font(Display.getDefault(),"DJB CHALK IT UP", 40, SWT.NONE ));
    gameTitle.setForeground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
    gameTitle.setAlignment(SWT.CENTER);
    gameTitle.setText("Register");
    FormData fd_gameTitle = new FormData();
    fd_gameTitle.top = new FormAttachment(0, 94);
    fd_gameTitle.left = new FormAttachment(0, 10);
    fd_gameTitle.right = new FormAttachment(100, -10);
    fd_gameTitle.bottom = new FormAttachment(0, 163);
    gameTitle.setLayoutData(fd_gameTitle);

    Label usrTitle = new Label(mainShell, SWT.NONE);
    usrTitle.setFont(new Font(Display.getDefault(),"DJB CHALK IT UP", 20, SWT.NONE ));
    usrTitle.setForeground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
    usrTitle.setAlignment(SWT.RIGHT);
    FormData fd_usrTitle = new FormData();
    fd_usrTitle.top = new FormAttachment(gameTitle, 81);
    fd_usrTitle.left = new FormAttachment(0, 10);
    usrTitle.setLayoutData(fd_usrTitle);
    usrTitle.setText("Enter Username:");

    usrField = new Text(mainShell, SWT.NONE);
    fd_usrTitle.right = new FormAttachment(usrField, -6);
    usrField.setFont(new Font(Display.getDefault(),"DJB CHALK IT UP", 20, SWT.NONE ));
    usrField.setForeground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
    FormData fd_usrField = new FormData();
    fd_usrField.left = new FormAttachment(0, 331);
    fd_usrField.right = new FormAttachment(100, -148);
    fd_usrField.top = new FormAttachment(gameTitle, 81);
    usrField.setLayoutData(fd_usrField);

    passTitle = new Label(mainShell, SWT.NONE);
    passTitle.setFont(new Font(Display.getDefault(),"DJB CHALK IT UP", 20, SWT.NONE ));
    passTitle.setForeground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
    passTitle.setAlignment(SWT.RIGHT);
    FormData fd_passTitle = new FormData();
    fd_passTitle.top = new FormAttachment(usrTitle, 22);
    fd_passTitle.right = new FormAttachment(usrTitle, 0, SWT.RIGHT);
    fd_passTitle.left = new FormAttachment(0, 10);
    passTitle.setLayoutData(fd_passTitle);
    passTitle.setText("Enter Password:");

    passField = new Text(mainShell, SWT.PASSWORD | SWT.NONE);
    passField.setFont(new Font(Display.getDefault(),"DJB CHALK IT UP", 20, SWT.NONE ));
    passField.setForeground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
    FormData fd_passField = new FormData();
    fd_passField.top = new FormAttachment(passTitle, 0, SWT.TOP);
    fd_passField.left = new FormAttachment(usrField, 0, SWT.LEFT);
    fd_passField.right = new FormAttachment(100, -148);
    passField.setLayoutData(fd_passField);


    register = new Label(mainShell, SWT.NONE);
    register.setAlignment(SWT.CENTER);
    register.setFont(new Font(Display.getDefault(),"DJB CHALK IT UP", 20, SWT.NONE ));
    register.setForeground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
    register.setText("OK");
    FormData fd_register = new FormData();
    fd_register.bottom = new FormAttachment(100, -40);
    fd_register.left = new FormAttachment(0, 276);
    fd_register.right = new FormAttachment(100, -280);
    register.setLayoutData(fd_register);
    register.addMouseTrackListener(new MouseTrackAdapter() {
        @Override
        public void mouseEnter(MouseEvent arg0) {
            register.setForeground(SWTResourceManager.getColor(SWT.COLOR_DARK_GRAY));
        }
        @Override
        public void mouseExit(MouseEvent arg0) {
            register.setForeground(SWTResourceManager.getColor(SWT.COLOR_WHITE));
        }
    });



}

person eli    schedule 29.05.2015    source източник
comment
Какво е очакваното поведение? Какво се случва вместо това? Какво сте опитвали досега?   -  person Baz    schedule 29.05.2015
comment
Можете да видите какво съм опитал досега :), опитах почти всяка комбинация от оформление/преначертаване/актуализация. Дори се опитах да ги пусна в една тема и пак не става. Интересното е, че когато използвам mainShell.open(), се отваря нова актуализирана обвивка, но искам актуализацията да се извърши в същата обвивка   -  person eli    schedule 29.05.2015
comment
Опитах няколко предложени решения, но нито едно не ми помогна Кои решения?   -  person Baz    schedule 29.05.2015
comment
Защо все пак използвате две Shells, ако искате всичко да се случи в една обвивка?   -  person Baz    schedule 29.05.2015
comment
Не използвам 2 shell, mainShell е единствената обвивка   -  person eli    schedule 29.05.2015
comment
Имате две new Shell() извиквания, което означава, че сте създали две обвивки. Присвоявате ги на една и съща променлива, но все още има две от тях (всъщност има 1 + #щраквания много)   -  person Baz    schedule 29.05.2015
comment
Всъщност направих това, защото смятах, че е удобен начин за изчистване на черупката. Когато изтрия новия Shell() в createRegisterLayout() Изглежда работи, но старите джаджи все още се виждат. Има ли начин за едноредова команда за изчистване на старите джаджи?   -  person eli    schedule 29.05.2015
comment
Значи трябва да преглеждам всички джаджи?   -  person eli    schedule 29.05.2015
comment
stackoverflow.com/ въпроси/10762415/   -  person Baz    schedule 29.05.2015


Отговори (1)


В createRegisterLayout създавате нова обвивка, но тази обвивка никога не се отваря. Тъй като полето mainShell е повторно присвоено на тази невидима обвивка, всички последващи извиквания на mainShell, като layout(), update() и т.н., нямат никакъв видим ефект.

person ralfstx    schedule 31.05.2015