簡體   English   中英

如何從多個 GUI 類集成多頁 Java 桌面應用程序

[英]How to Integrate Multi-page Java Desktop Application from Multiple GUI Classes

我正在開發一個 Java Swing 桌面應用程序項目。 該應用程序有大約 15 個 GUI 頁面。 我可以使用分層窗格和選項卡式窗格將所有 GUI 組件放在一個類中。 但是那個班級會很大。 如果我可以將項目分成幾個較小的子項目,並讓每個子項目有一個或幾個 GUI 頁面,那將是一個想法。 我可以單獨處理每個子項目,並在所有子項目完成后將它們集成回一個應用程序。 我的問題是如何集成來自不同類的所有 GUI 頁面,以便我可以在單擊按鈕時在不同頁面之間來回導航? 由於子項目包含 GUI 頁面,因此每個子項目都需要有一個 JFrame。 如何在 JFrame 1 和 JFrame 2 之間切換並強制使一個可見而另一個不可見? 這個問題展示了如何創建新的 JFrame。 但是沒有顯示如何在JFrames 之間來回切換。

...該應用程序有大約15個GUI頁面。 我可以使用Layered Panes和Tabbed Panes將所有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();
         }
      });
   }
}

但它絕不會是一個龐大的類,你不必擔心在用戶處翻轉多個JFrame。

你對集中控制器的想法並不是壞事。

就個人而言,我的第一個想法是嘗試將這些單獨的頁面組成一個域組(或責任組)。 這將給我我的第一級控制。 我決定如何讓用戶使用這些域名。

一旦你有了這個工作,你可以進入下一個級別,哪些組相互協作(如果有的話)以及你希望用戶如何與這些組進行交互

等等。

我同意HovercraftFullOfEels,你不想向用戶拋出大量的窗口,這只是讓他們感到沮喪,你也不希望他們不得不在相關頁面之間輕彈,其中一個頁面上的信息對另一個頁面有用。

您可能會發現最終得到兩者的組合。 也就是說,您可能需要為用戶提供在框架中打開某些頁面的靈活性。 這將使他們能夠決定他們總是需要哪些信息以及他們可以翻閱的信息。

恕我直言

你有幾個選擇:

  1. 你可以用setVisible隱藏舊的JFrame(false)
  2. 你可以用dispose()擺脫舊的JFrame

您可以獲得有關這些方法的更多信息以及如何在此處調用它們: http//docs.oracle.com/javase/6/docs/api/javax/swing/JFrame.html

希望這可以幫助!

我使用的方法是將頁面制作為面板並使這些面板靜態並將我想要的面板添加到我的框架中並刪除前一個面板,這是我使用的功能:

public static void add(JPanel panelYouWantToAdd, JPanel prevPanelToRemove) {
        prevPanelToRemove.setVisible(false);
        panelYouWantToAdd.setVisible(true);
        appFrame.add(panelYouWantToAdd);
        appFrame.getContentPane().remove(prevPanelToRemove);
        appFrame.getContentPane().invalidate();
        appFrame.getContentPane().validate();
        
        
    }

使用此方法,您應該只發送要使用的面板和框架上已經存在的前一個面板

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM