Оболочка перерисовки SWT

Проблема довольно очевидна, поэтому я хочу, чтобы после нажатия кнопки (или метки в моем случае) макет менялся и обновлялся. Я попробовал несколько предложенных решений, но ни одно из них не сработало для меня. Изменение заключается в createLoginLayout() внутри прослушивателя трека мыши «вход в систему». Я знаю, что код выглядит слишком сложным, потому что я использую 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
Почему вы все равно используете два Shell, если хотите, чтобы все происходило в одной оболочке?   -  person Baz    schedule 29.05.2015
comment
Я не использую 2 оболочки, 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