JFrame вопросы - PullRequest
       4

JFrame вопросы

0 голосов
/ 09 апреля 2011

У меня есть несколько вопросов относительно JFrame.Вот сценарий:

Я создал несколько классов объектов в Java и хочу создать графический интерфейс для этих объектов.Итак, я создал 2 JFrames.Один JFrame манипулирует этими различными классами, а другой JFrame манипулирует первым.

Первый JFrame я назову «TypesGUI».Он манипулирует разными экземплярами животных (лев, тигр и т. Д.).Второй JFrame, я назову его AnimalGUI.

Теперь AnimalGUI - это просто JFrame, который содержит меню и текстовые области.В одном из меню есть пункт меню «Создать животное».Теперь я хочу, чтобы при нажатии «Создать животное» отображался TypesGUI, чтобы создать то, что я хочу создать.А в TypesGUI есть кнопка.Поэтому, если я должен нажать на эту кнопку после создания того, что я хочу создать, окно должно исчезнуть, а то, что я создал, должно появиться в текстовых областях AnimalGUI.Другими словами, я хочу иметь возможность получить различные характеристики созданных мною животных.

До сих пор я добавил слушателя действия в пункт меню и кнопку и использовал метод setVisible со значениями true или false длякаждый из них соответственно.Я чувствую, что использование setVisible (true или false) на самом деле не освобождает память, используемую TypesGUI.Является ли использование setVisible хорошим подходом?Кроме того, как я могу получить характеристики различных животных, созданных в TypesGUI, и показать их в AnimalGUI?Спасибо.

1 Ответ

1 голос
/ 09 апреля 2011

Во-первых, второе окно, которое позволяет пользователю выбрать тип животного, действует не как независимое окно приложения, а скорее как диалоговое окно, которое связано с главным окном и зависит от него. Например, вы бы никогда не отображали это второе окно самостоятельно, а просто отображали бы его, чтобы получить информацию, предназначенную для основного окна / класса. Таким образом, это должен быть диалоговый тип окна, либо JOptionPane, либо модальный JDialog, а не JFrame. Это имеет ряд других преимуществ, включая гарантию того, что оно остается перед z-порядком главного окна, и что оно никогда не завершит работу всего приложения, если оно будет утилизировано.

Что касается setVisible (true / false), это должно работать просто отлично.

Что касается извлечения информации о типе Animal из второго окна / диалога: если вы называете второе окно модальным JDialog или JOptionPane (который на самом деле является специализированным модальным JDialog), вы будете точно знать, когда пользователь завершил свою работу с второе окно, так как код вашего главного окна запустится сразу после того места, где вы вызвали setVisible (true) во втором окне или вызвали JOptionPane.showXXXX (). На этом этапе вы могли бы сделать так, чтобы ваше главное окно / класс запрашивало тип животного из второго окна, предоставив второму окну / классу открытый метод, скажем, getAnimalType (), который возвращает эту информацию.

Например, вот программа с двумя окнами, которая показывает JPanel, которая использует GridBagLayout и принимает два текста JTextField в JOptionPane:

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

public class TwoWindowEg {
   private static void createAndShowUI() {
      JFrame frame = new JFrame("Two Window Eg");
      frame.getContentPane().add(new MainPanel());
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}

class MainPanel extends JPanel {
   private JTextField textField = new JTextField(20);
   private DialogPanel dialogPanel = null;

   public MainPanel() {
      textField.setEditable(false);
      textField.setFocusable(false);
      textField.setBackground(Color.white);

      JButton openDialogBtn = new JButton("Open Dialog");
      openDialogBtn.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            if (dialogPanel == null) {
               dialogPanel = new DialogPanel();
            }
            int result = JOptionPane.showConfirmDialog(MainPanel.this, dialogPanel,
                     "Enter First and Last Name", JOptionPane.OK_CANCEL_OPTION,
                     JOptionPane.PLAIN_MESSAGE);
            if (result == JOptionPane.OK_OPTION) {
               String text = dialogPanel.getText();
               textField.setText(text);
            }

         }
      });

      add(textField);
      add(openDialogBtn);

      setPreferredSize(new Dimension(400, 300));
      setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15));
   }
}

class DialogPanel extends JPanel {
   private static final Insets INSETS = new Insets(0, 10, 0, 10);
   private JTextField firstNameField = new JTextField(10);
   private JTextField lastNameField = new JTextField(10);

   public DialogPanel() {
      setLayout(new GridBagLayout());
      GridBagConstraints gbc = new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0,
               GridBagConstraints.LINE_START, GridBagConstraints.BOTH, 
               INSETS, 0, 0);
      add(new JLabel("First Name"), gbc);
      gbc = new GridBagConstraints(1, 0, 1, 1, 1.0, 1.0,
               GridBagConstraints.LINE_END, GridBagConstraints.BOTH, 
               INSETS, 0, 0);
      add(new JLabel("Last Name"), gbc);
      gbc = new GridBagConstraints(0, 1, 1, 1, 1.0, 1.0,
               GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL, 
               INSETS, 0, 0);
      add(firstNameField, gbc);

      gbc = new GridBagConstraints(1, 1, 1, 1, 1.0, 1.0,
               GridBagConstraints.LINE_END, GridBagConstraints.HORIZONTAL, 
               INSETS, 0, 0);
      add(lastNameField, gbc);
   }

   public String getText() {
      return firstNameField.getText() + " " + lastNameField.getText();
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...