如何从多个GUI类集成多页Java桌面应用程序(How to Integrate Multi-pag

2019-06-26 17:59发布

我工作的一个的Java Swing桌面应用程序项目。 该应用程序有大约15 GUI页面。 我可以使用分层窗格和标签式窗格把所有的GUI组件在一个类中。 但是,类将是巨大的。 这将是想法,如果我可以将项目分成几个较小的子工程,让每一个有一个或几个GUI页面。 我可以在每个子项目单独工作,当所有的子项目完成回集成到一个应用程序。 我的问题是,如何从不同类别整合所有GUI页面这样我就可以点击按钮不同页面之间导航回力? 由于个子项目包含GUI页面,每个页面都需要有一个JFrame。 我怎样才能JFrame的1之间任意切换力的JFrame 2,使一个可见的和其他不可见? 这个问题说明了如何创建新的JFrames。 但没有说明如何使用JFrames之间来回切换。

Answer 1:

...应用程序有大约15 GUI页面。 我可以使用分层窗格和标签式窗格把所有的GUI组件在一个类中。 但是,类将是巨大的。

不必要。 该GUI可以是非常简单的,可以有一个可以让其他类来添加页面的方法,想说什么叫registerPage(...)

public void registerPage(JComponent page, String name) {
  pageHolder.add(page, name);
  nameComboModel.addElement(name);
}

然后给类的方法,使一去到下一个或前一个页面或随机的页面。 例如一类的小,因为这可以工作:

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

public class LotsOfPagesPanel extends JPanel {
   private CardLayout cardlayout = new CardLayout();
   private JPanel pageHolder = new JPanel(cardlayout);
   private DefaultComboBoxModel<String> nameComboModel = new DefaultComboBoxModel<String>();
   private JComboBox<String> nameCombo = new JComboBox<String>(nameComboModel);

   public LotsOfPagesPanel() {
      JPanel btnPanel = new JPanel(new GridLayout(1, 0, 5, 0));
      btnPanel.add(new JButton(new PrevAction(this, "Previous", KeyEvent.VK_P)));
      btnPanel.add(new JButton(new NextAction(this, "Next", KeyEvent.VK_N)));
      JPanel bottomPanel = new JPanel();
      bottomPanel.add(btnPanel);
      bottomPanel.add(nameCombo);

      nameCombo.addActionListener(new NameComboListener());
      pageHolder.setBorder(BorderFactory.createEtchedBorder());

      setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
      setLayout(new BorderLayout(5, 5));
      add(pageHolder, BorderLayout.CENTER);
      add(bottomPanel, BorderLayout.PAGE_END);
   }

   public void previousPage() {
      cardlayout.previous(pageHolder);
   }

   public void nextPage() {
      cardlayout.next(pageHolder);
   }

   public void show(String name) {
      cardlayout.show(pageHolder, name);
   }

   public void registerPage(JComponent page, String name) {
      pageHolder.add(page, name);
      nameComboModel.addElement(name);
   }

   private class NameComboListener implements ActionListener {
      @Override
      public void actionPerformed(ActionEvent e) {
         String selection = nameCombo.getSelectedItem().toString();
         show(selection);
      }
   }
}

所有这些类确实是充当你的“页面”库并具有逻辑允许通过翻页浏览或者连续或者随机,并没有多少人,但仅此而已它真正需要做的,通过限制其如此,我们限制类的大小。 如果需要其他功能,创建其他类,这些

......如我们的Action类包括PrevAction类:

import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;

public class PrevAction extends AbstractAction {
   private LotsOfPagesPanel lotsOfPages;

   public PrevAction(LotsOfPagesPanel lotsOfPages, String name, Integer keyCode) {
      super(name);
      this.lotsOfPages = lotsOfPages;
      putValue(MNEMONIC_KEY, keyCode);
   }

   @Override
   public void actionPerformed(ActionEvent e) {
      lotsOfPages.previousPage();
   }
}

和NextAction.java

import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;

public class NextAction extends AbstractAction {
   private LotsOfPagesPanel lotsOfPages;

   public NextAction(LotsOfPagesPanel lotsOfPages, String name, Integer keyCode) {
      super(name);
      this.lotsOfPages = lotsOfPages;
      putValue(MNEMONIC_KEY, keyCode);
   }

   @Override
   public void actionPerformed(ActionEvent e) {
      lotsOfPages.nextPage();
   }
}

而你也需要有过程的主要方法:

import java.awt.Color;
import java.awt.Dimension;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;

public class LotsOfPagesMain {
   private static final String[] LABELS = { "One", "Two", "Three", "Four",
         "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve",
         "Thirteen", "Fourteen", "Fifteen" };
   private static final Dimension LABEL_SIZE = new Dimension(400, 300);

   private static void createAndShowGui() {
      LotsOfPagesPanel lotsOfPages = new LotsOfPagesPanel();
      Random random = new Random();

      // I'm using JLabels as a simple substitute for your complex JPanel GUI "pages"
      for (String labelText : LABELS) {
         JLabel label = new JLabel(labelText, SwingConstants.CENTER);
         label.setPreferredSize(LABEL_SIZE);
         label.setOpaque(true);
         label.setBackground(new Color(random.nextInt(170) + 85, random
               .nextInt(170) + 85, random.nextInt(170) + 85));
         lotsOfPages.registerPage(label, labelText);
      }

      JFrame frame = new JFrame("LotsOfPages");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(lotsOfPages);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

但它不会以任何方式一个巨大的类,你就不必担心在用户翻动多个JFrames。



Answer 2:

您的集中控制器的想法是不坏的一个。

就个人而言,我的第一个想法是尝试一组这些单独的页面到域组(或组的责任)。 这给我的控制的第一级。 我决定我怎么想这些领域要由用户来使用。

一旦你的工作,你可以移动到一个新的水平,这组相互合作(如果有的话)你会如何想用户与这些互动

等等。

我同意HovercraftFullOfEels,你不希望在用户扔窗户很多,这只是他们挫败,你也不希望他们有相关的网页,其中一个上的信息是另一个有用之间轻弹。

你可能会发现,你最终两者的结合。 也就是说,您可能需要为用户提供灵活地打开帧一些网页。 这将允许他们来决定什么样的信息,他们总是需要与他们的可翻转什么样的信息通过能力。

恕我直言



Answer 3:

你有两个选择:

  1. 您可以隐藏旧的JFrame与调用setVisible(假)
  2. 你可以用处置摆脱旧JFrame的()

你可以在这些方法的一些详细信息,以及应如何在这里称为: http://docs.oracle.com/javase/6/docs/api/javax/swing/JFrame.html

希望这可以帮助!



文章来源: How to Integrate Multi-page Java Desktop Application from Multiple GUI Classes