Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从多个GUI类集成多页Java桌面应用程序_Java_Swing_User Interface_Layout Manager_Cardlayout - Fatal编程技术网

如何从多个GUI类集成多页Java桌面应用程序

如何从多个GUI类集成多页Java桌面应用程序,java,swing,user-interface,layout-manager,cardlayout,Java,Swing,User Interface,Layout Manager,Cardlayout,我正在从事一个JavaSwing桌面应用程序项目。该应用程序大约有15个GUI页面。我可以使用分层窗格和选项卡窗格将所有GUI组件放在一个类中。但这一类将是巨大的。如果我可以将项目分成几个较小的子项目,并让每个子项目都有一个或几个GUI页面,这将是一个好主意。我可以单独处理每个子项目,并在所有子项目完成后将它们重新集成到一个应用程序中。 我的问题是,如何集成来自不同类的所有GUI页面,以便在单击按钮时返回并强制在不同页面之间切换?由于子项目包含GUI页面,因此每个项目都需要一个JFrame。如何

我正在从事一个JavaSwing桌面应用程序项目。该应用程序大约有15个GUI页面。我可以使用分层窗格和选项卡窗格将所有GUI组件放在一个类中。但这一类将是巨大的。如果我可以将项目分成几个较小的子项目,并让每个子项目都有一个或几个GUI页面,这将是一个好主意。我可以单独处理每个子项目,并在所有子项目完成后将它们重新集成到一个应用程序中。 我的问题是,如何集成来自不同类的所有GUI页面,以便在单击按钮时返回并强制在不同页面之间切换?由于子项目包含GUI页面,因此每个项目都需要一个JFrame。如何在JFrame 1和JFrame 2之间切换并强制,使一个可见,另一个不可见?
演示如何创建新的JFrames。但是没有显示如何在JFrames之间来回切换。

您有两个选项:

  • 可以使用setVisible(false)隐藏旧JFrame
  • 您可以使用dispose()摆脱旧的JFrame
  • 您可以在此处获得有关这些方法以及如何调用它们的更多信息:


    希望这有帮助

    您的集中式控制器想法不错

    就我个人而言,我的第一个想法是尝试将这些单独的页面分组为域组(或责任组)。这将给我第一级的控制。我将决定用户如何使用这些域

    一旦你完成了这项工作,你就可以进入下一个层次,即哪些组彼此工作(如果有的话)&你希望用户如何与这些组交互

    等等

    我同意HovercraftFullOfEels,你不想向用户扔很多窗口,这只会让他们感到沮丧,你也不想让他们在相关页面之间切换,其中一个页面上的信息对另一个页面有用

    你可能会发现你最终将两者结合起来。也就是说,您可能需要为用户提供在框架中打开某些页面的灵活性。这将使他们能够决定他们总是需要什么信息&他们可以翻阅什么信息

    伊姆霍

    。。。该应用程序大约有15个GUI页面。我可以使用分层窗格和选项卡窗格将所有GUI组件放在一个类中。但这一类将是巨大的

    不一定。GUI可以非常简单,并且可以有一个允许其他类添加页面的方法,比如称为
    registerPage(…)

    然后给出类方法,允许一个人转到下一个或上一个页面或随机页面。例如,像这样小的类可以工作:

    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);
          }
       }
    }
    
    和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。

    您真的不应该向可怜的用户扔一堆JFrames。为什么不简单地使用CardLayout交换视图?@Hovercraft为什么多个JFrames GUI不好?它对程序有什么负面影响?当用户在单个JFrame上交换视图要好得多时,为什么让他翻转JFrame?CardLayout是解决这个问题的方法。有时,最好的答案不是解决原始海报的要求,而是为他们的程序行为提供更好的解决方案。
    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();
             }
          });
       }
    }