Настольное приложение - как мне динамически создавать и уничтожать формы - PullRequest
0 голосов
/ 08 октября 2010

Я создаю небольшое криптографическое приложение для настольного компьютера с использованием Java.

Я использую JFrames (импорт javax.swing.JFrame) с Oracle JDeveloper 11g под Linux.

Iхочу иметь форму / фрейм "welcome", в котором пользователи могут выбирать свой метод шифрования, а затем при выборе метода я хочу динамически создать соответствующую форму для выбранного метода шифрования, а также уничтожить / free / dispose () приветствияформа.Когда пользователь завершил свое шифрование, он должен закрыть фрейм / форму (либо щелкнув по x в правом верхнем углу - либо с помощью кнопки «Выход», либо любым другим способом), и фрейм приветствия должен динамически воссоздаться и появиться.

Я пробовал разные вещи - btnEncode_actionPerformed (ActionEvent e), затем this.dispose () - и я возился с this_windowClosed (WindowEvent e) и dispose (), но, похоже, ничего не работает.

Даже обходной путь с использованием setVisibl (true / false) был бы приемлем на этом этапе - это ломало мне голову весь день.Это очень легко сделать в Delphi!

TIA и rgs,

Пол ...

Ответы [ 2 ]

0 голосов
/ 08 октября 2010

Я собрал этот простой пример для создания и отображения панели в зависимости от выбора пользователя.

public class Window extends JFrame {

public Window() {
    this.setLayout(new BorderLayout());
    JComboBox encryptionCombobox = new JComboBox();
    encryptionCombobox.addItem("foo");
    encryptionCombobox.addItem("bar");
    //...
    encryptionCombobox.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            // find choices and the correct panel
            JPanel formPanel = new JPanel();
            formPanel.setOpaque(true);
            formPanel.setBackground(Color.RED);
            //...
            Window.this.add(formPanel, BorderLayout.CENTER);
            Window.this.validate();
            Window.this.repaint();
        }
    });
    add(encryptionCombobox, BorderLayout.NORTH);
}

public static void main(String[] args) {
    new Window().setVisible(true);
}
}

Когда я подумаю об этом, вам, вероятно, следует вместо этого использовать CardLayout, который позволяетпереключаться между разными панелями (картами).

0 голосов
/ 08 октября 2010

что-то вроде этого обычно делает свое дело: (Обратите внимание, я не проверял это)

public class WelcomeMsg extends JFrame
.
.
.
public void btnContinue_actionPerformed(ActionEvent e)
{
    this.dispose();
    SwingUtilities.invokeLater(new Runnable(){ new JFrameAppropriateWindow(args) });
}

, где btnContinue - кнопка «Продолжить» в форме приветствия, а JFrameAppresponWindow - следующий кадр, который вы хотите показатьв зависимости от выбора пользователя.Аргументы - это любые аргументы, которые вам нужно передать.

Когда вы будете готовы, вы можете просто удалить текущий кадр и перезапустить экземпляр WelcomeMsg

.
...