Java Swing дизайн - PullRequest
       10

Java Swing дизайн

2 голосов
/ 22 декабря 2009

У меня есть вопрос относительно кодирования Swing UI. Если я хочу сделать программное обеспечение с некоторыми опциями, например, на первом кадре у меня есть три кнопки (New, Option, Exit).

Теперь, если пользователь нажимает новую кнопку, я хочу изменить весь контент во фрейме на что-то другое. Я знаю, что должен использовать addActionListener для этой кнопки. Но мой вопрос, как изменить содержимое в кадре. Создание новых фреймов, а затем использование setVisible() не вариант для меня.

И использовать frame.remove() все объекты кажутся неловкими, если есть несколько вещей, которые нужно удалить. Или это правильный путь?

Ответы [ 4 ]

5 голосов
/ 22 декабря 2009

CardLayout действительно лучший выбор в этом случае; но когда этого требует случай, Компонент может быть удален из Контейнера с использованием метода remove() или removeAll(). После этого важным шагом является вызов метода [validate()] (http://java.sun.com/javase/6/docs/api/java/awt/Container.html#validate()) для повторного размещения подкомпонентов контейнера. В примере Оскара Рейеса используется Frame '[pack()] (http://java.sun.com/javase/6/docs/api/java/awt/Window.html#pack()) метод, унаследованный от Window , для достижения этого эффекта. В этом примере метод resetGame() реконструирует панель дисплея аналогичным образом.

5 голосов
/ 22 декабря 2009

Посмотрите на Макет карты . Я также, вероятно, использовал бы пункты меню вместо кнопок.

1 голос
/ 22 декабря 2009

Вы можете использовать frame.remove()

Разница в том, что вы можете удалить целую панель вместо того, чтобы удалять "несколько" вещей, и просто заменить ее новой панелью

frame.add( mainPanel );
...
// in the action listener 
frame.remove( mainPanel );
frame.add( theNewPage );

Дело в том, что вам не нужно бояться неуклюже убирать вещи из основной рамки, потому что вы должны поместить все эти вещи в одну панель, а затем просто менять панели.

UPDATE

Я создал код, необходимый для проверки того, о чем я говорю.

Вот пример работы:

альтернативный текст http://img190.imageshack.us/img190/5206/capturadepantalla200912p.png

позже

альтернативный текст http://img301.imageshack.us/img301/1368/capturadepantalla200912n.png

Вот пример работы:

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class ChangePage {
    JComponent mainPage;
    JComponent newPage;
    JFrame     frame;

    public static void main( String [] args ) {
        ChangePage changePageDemo = new ChangePage();
        changePageDemo.show();
    }
    private void show(){
        frame = new JFrame("Demo");
        frame.add( getMainPage() );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
    }
    private JComponent getMainPage() {
        if( this.mainPage != null ) {
            return this.mainPage;
        }
        this.mainPage = new JPanel(new BorderLayout());
        mainPage.add( new JLabel("Choose an option") );
        mainPage.add( new JPanel(){{
            add( new JButton("New"){{
                addActionListener( new ActionListener(){
                    public void actionPerformed( ActionEvent e ){
                        SwingUtilities.invokeLater( new Runnable(){
                            public void run(){
                                frame.remove( getMainPage() );
                                frame.add( getNewPage() );
                                //frame.setContentPane( getNewPage() );
                                frame.pack();

                            }
                        });
                    }
                });
            }});
            add( new JButton("Options"));
            add( new JButton("Exit"));
        }}, BorderLayout.SOUTH );
        return this.mainPage;

    }
    private JComponent getNewPage() {
        if( newPage != null ) {
            return newPage;
        }
        this.newPage = new JPanel();
        this.newPage.add( new JLabel("<html>This is the \"new\" page.<br> Do you like it?<br></html>"));
        this.newPage.add( new JButton("Return"){{
            addActionListener( new ActionListener(){
                public void actionPerformed( ActionEvent e ){
                    SwingUtilities.invokeLater( new Runnable(){
                        public void run(){
                            frame.remove( getNewPage() );
                            frame.add( getMainPage() );
                            //frame.setContentPane( getMainPage() );
                            frame.pack();

                        }
                    });
                }
            });
        }});
        return this.newPage;
    }

}

В качестве альтернативы вы можете использовать setContentPane :)

0 голосов
/ 29 декабря 2011

Самый простой способ - использовать Панель с вкладками .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...