Java 从一个GUI窗口跳到另一个GUI窗口

Java 从一个GUI窗口跳到另一个GUI窗口,java,swing,user-interface,awt,Java,Swing,User Interface,Awt,我正在开发一个java应用程序,它有5个gui窗口,其中一个是问候语或主窗口,我已经完成了所有逻辑部分的工作,完成了99.99%,剩下的唯一一件事是,当我点击一个按钮时,比如说主窗口上的一个按钮,我怎么能这样编码,它将引导我进入第二个窗口,主窗口将自动关闭,我如何才能做到这一点 任何帮助都将不胜感激 编辑 这是密码,先生 import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.*;

我正在开发一个java应用程序,它有5个gui窗口,其中一个是问候语或主窗口,我已经完成了所有逻辑部分的工作,完成了99.99%,剩下的唯一一件事是,当我点击一个按钮时,比如说主窗口上的一个按钮,我怎么能这样编码,它将引导我进入第二个窗口,主窗口将自动关闭,我如何才能做到这一点

任何帮助都将不胜感激


编辑

这是密码,先生

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

class Nc extends JFrame
{
private JLabel label;
private JLabel label1;
private JLabel label2;
private JLabel label3;
private JLabel label4;
private JButton b;
private JButton o;
private JButton h;
private JButton d;

private Bn ob;
private Hd oh;
private Oc oo;
private Dc od;

public Nc()
{
    setTitle("Number Converter");
    setSize(200 , 300);
    setResizable(false);
    setLocation(500 , 200);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(new FlowLayout(FlowLayout.CENTER, 25, 10));

    label = new JLabel("Number Converter");
    label1 = new JLabel("Java Application");
    label2 = new JLabel("Programmed by: Hassan Zia");
    label3 = new JLabel("Copyright 2014");
    label4 = new JLabel("Click a button");

    b = new JButton("Binary");
    o = new JButton("Octal");
    h = new JButton("Hexa Decimal");
    d = new JButton("Decimal");

    add(label);
    add(label1);
    add(label2);
    add(label3);
    add(label4);

    add(b); // Binary Button
    add(o); // Octal Button
    add(h); // Hexa Decimal Button
    add(d); // Decimal Button

    b.addActionListener(new action());
    o.addActionListener(new action());
    h.addActionListener(new action());
    d.addActionListener(new action());

    setVisible(true);
}

void bnc()
{
    ob = new Bn();
}

void hdc()
{
    oh = new Hd();
}

void occ()
{
    oo = new Oc();
}

void dcc()
{
    od = new Dc();
}

private class action implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        if (e.getSource() == b)
        {
            bnc();
        }
        if (e.getSource() == h)
        {
            hdc();
        }
        if (e.getSource() == o)
        {
            occ();
        }
        if (e.getSource() == d)
        {
            dcc();
        }
    }
}

public static void main (String args[])
{
    Nc obj = new Nc();
}

如果这是一个Swing应用程序(您还没有告诉我们),那么您可以通过在当前窗口中放置一个JButton的ActionListener代码来解决您的直接问题,该代码调用
setVisible(false)
,如果您将再次使用它,或者如果您不再使用它,则调用
setVisible(true)
在您希望显示的下一个窗口对象上。这可以简单到:

myButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
       ThisGuiClass.this.setVisible(false);
       newGUI.setVisible(true);
    }
});
但是,仍然存在着未回答的问题

  • 同样,这是一个Swing GUI吗?具体的解决方案取决于您使用的GUI库
  • 代码解决方案的细节也完全取决于您使用的特定代码和程序结构,这是您没有向我们展示的。如果您想要更好的答案,请向我们显示代码
  • 再一次,我坚持我的建议,尽量减少向用户抛出的窗口,如果可能的话,支持使用say CardLayout在单个窗口上交换视图,并将第二个窗口的使用限制为模态JDialogs(尽可能多)。这方面的一个重要参考仍然是链接

编辑
好的,我已经看到你添加了Swing和AWT标签,谢谢,但我仍然认为我的答案还很不完整,因为这个问题仍然不完整


编辑2

基于您的代码,我将坚持我最初的建议,并使用CardLayout交换JPanel的“视图”。例如,运行以下命令:

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.*;

@SuppressWarnings("serial")
public class NumberConverterWithCardLayout extends JPanel {
   private CardLayout cardlayout = new CardLayout();
   private JPanel cardPanel = new JPanel(cardlayout);
   private BinaryPanel binaryPanel = new BinaryPanel();
   private OctalPanel octalPanel = new OctalPanel();
   private HexadecimalPanel hexadecimalPanel = new HexadecimalPanel();
   private DecimalPanel decimalPanel = new DecimalPanel();
   private JPanel[] allPanels = { binaryPanel, octalPanel, hexadecimalPanel,
         decimalPanel };

   public NumberConverterWithCardLayout() {
      JPanel buttonPanel = new JPanel(new GridLayout(1, 0, 5, 0));

      setLayout(new BorderLayout());
      add(cardPanel, BorderLayout.CENTER);
      add(buttonPanel, BorderLayout.PAGE_END);

      cardPanel.add(createIntroPanel(), "intro");

      for (final JPanel jPanel : allPanels) {
         cardPanel.add(jPanel, jPanel.getName());
         buttonPanel.add(new JButton(new AbstractAction(jPanel.getName()) {

            @Override
            public void actionPerformed(ActionEvent evt) {
               cardlayout.show(cardPanel, jPanel.getName());
            }
         }));
      }
   }

   private JPanel createIntroPanel() {
      JPanel introPanel = new JPanel(new GridBagLayout());
      introPanel.add(new JLabel("Introductory panel which introduces me and the program"));
      return introPanel;
   }

   private static void createAndShowGui() {
      NumberConverterWithCardLayout mainPanel = new NumberConverterWithCardLayout();

      JFrame frame = new JFrame("Number Converter Application");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

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

class BinaryPanel extends JPanel {
   public static final String NAME = "Binary";
   private static final int PREF_W = 500;
   private static final int PREF_H = 400;

   public BinaryPanel() {
      setName(NAME);
      add(new JLabel("A complex GUI that does binary calculations will go here"));
   }

   @Override
   // just to give it some size
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }
}

class OctalPanel extends JPanel {
   public static final String NAME = "Octal";

   public OctalPanel() {
      setName(NAME);
      add(new JLabel("A GUI that does octal calculations will go here"));
   }

}

class HexadecimalPanel extends JPanel {
   public static final String NAME = "Hexadecimal";

   public HexadecimalPanel() {
      setName(NAME);
      add(new JLabel("A GUI that does hexadecimal calculations will go here"));
   }
}

class DecimalPanel extends JPanel {
   public static final String NAME = "Decimal";

   public DecimalPanel() {
      setName(NAME);
      add(new JLabel("A GUI that does decimal calculations will go here"));
   }

}
当然,JPanel的计算将更加复杂,每个嵌套的JPanel都有自己的布局管理器、JTextFields、JButton,以及实现其功能所需的任何其他内容


编辑3

事实上,仔细想想,即使这样也太过分了。您最好使用一个带有两个文本字段的JPanel,一个用于数字输入,一个用于结果显示,在底部有一系列按钮。然后,显示器将根据按下的按钮(转换类型)而变化。接吻原则

如果这是一个Swing应用程序(您还没有告诉我们),那么您可以通过在JButton的ActionListener代码中放置一个来解决您的直接问题,如果您将再次使用它,则在当前窗口中调用
setVisible(false)
,如果您不再使用它,则在其上调用
setVisible(true)
在您希望显示的下一个窗口对象上。这可以简单到:

myButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
       ThisGuiClass.this.setVisible(false);
       newGUI.setVisible(true);
    }
});
但是,仍然存在着未回答的问题

  • 同样,这是一个Swing GUI吗?具体的解决方案取决于您使用的GUI库
  • 代码解决方案的细节也完全取决于您使用的特定代码和程序结构,这是您没有向我们展示的。如果您想要更好的答案,请向我们显示代码
  • 再一次,我坚持我的建议,尽量减少向用户抛出的窗口,如果可能的话,支持使用say CardLayout在单个窗口上交换视图,并将第二个窗口的使用限制为模态JDialogs(尽可能多)。这方面的一个重要参考仍然是链接

编辑
好的,我已经看到你添加了Swing和AWT标签,谢谢,但我仍然认为我的答案还很不完整,因为这个问题仍然不完整


编辑2

基于您的代码,我将坚持我最初的建议,并使用CardLayout交换JPanel的“视图”。例如,运行以下命令:

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.*;

@SuppressWarnings("serial")
public class NumberConverterWithCardLayout extends JPanel {
   private CardLayout cardlayout = new CardLayout();
   private JPanel cardPanel = new JPanel(cardlayout);
   private BinaryPanel binaryPanel = new BinaryPanel();
   private OctalPanel octalPanel = new OctalPanel();
   private HexadecimalPanel hexadecimalPanel = new HexadecimalPanel();
   private DecimalPanel decimalPanel = new DecimalPanel();
   private JPanel[] allPanels = { binaryPanel, octalPanel, hexadecimalPanel,
         decimalPanel };

   public NumberConverterWithCardLayout() {
      JPanel buttonPanel = new JPanel(new GridLayout(1, 0, 5, 0));

      setLayout(new BorderLayout());
      add(cardPanel, BorderLayout.CENTER);
      add(buttonPanel, BorderLayout.PAGE_END);

      cardPanel.add(createIntroPanel(), "intro");

      for (final JPanel jPanel : allPanels) {
         cardPanel.add(jPanel, jPanel.getName());
         buttonPanel.add(new JButton(new AbstractAction(jPanel.getName()) {

            @Override
            public void actionPerformed(ActionEvent evt) {
               cardlayout.show(cardPanel, jPanel.getName());
            }
         }));
      }
   }

   private JPanel createIntroPanel() {
      JPanel introPanel = new JPanel(new GridBagLayout());
      introPanel.add(new JLabel("Introductory panel which introduces me and the program"));
      return introPanel;
   }

   private static void createAndShowGui() {
      NumberConverterWithCardLayout mainPanel = new NumberConverterWithCardLayout();

      JFrame frame = new JFrame("Number Converter Application");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

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

class BinaryPanel extends JPanel {
   public static final String NAME = "Binary";
   private static final int PREF_W = 500;
   private static final int PREF_H = 400;

   public BinaryPanel() {
      setName(NAME);
      add(new JLabel("A complex GUI that does binary calculations will go here"));
   }

   @Override
   // just to give it some size
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }
}

class OctalPanel extends JPanel {
   public static final String NAME = "Octal";

   public OctalPanel() {
      setName(NAME);
      add(new JLabel("A GUI that does octal calculations will go here"));
   }

}

class HexadecimalPanel extends JPanel {
   public static final String NAME = "Hexadecimal";

   public HexadecimalPanel() {
      setName(NAME);
      add(new JLabel("A GUI that does hexadecimal calculations will go here"));
   }
}

class DecimalPanel extends JPanel {
   public static final String NAME = "Decimal";

   public DecimalPanel() {
      setName(NAME);
      add(new JLabel("A GUI that does decimal calculations will go here"));
   }

}
当然,JPanel的计算将更加复杂,每个嵌套的JPanel都有自己的布局管理器、JTextFields、JButton,以及实现其功能所需的任何其他内容


编辑3

事实上,仔细想想,即使这样也太过分了。您最好使用一个带有两个文本字段的JPanel,一个用于数字输入,一个用于结果显示,在底部有一系列按钮。然后,显示器将根据按下的按钮(转换类型)而变化。接吻原则

我猜这是一个Swing应用程序?您永远不会说,而且所使用的GUI库非常重要,因为更改它将彻底改变答案。请提供您的问题的更多详细信息,显示相关代码,并在您的问题中添加适当的标记,以帮助我们更好地理解您的问题,并吸引合适的专家来回答此问题。同时,请自问,您使用了多少专业应用程序来实现从一个窗口跳到另一个窗口?不多,因为这对用户来说是一种非常分散注意力且通常不愉快的体验。大多数应用程序使用一个主应用程序窗口,在该窗口内交换gui视图,并在需要信息时以模式方式偶尔弹出一个对话框窗口。您可能需要考虑仿真这个设计。先生,请看一看,实际上我正在开发一个数字转换器应用程序,它将数字从二进制转换为(OCT,DC,HD),类似地从其他格式转换为其他格式(希望你明白我的意思),我有一个主窗口,它有4个按钮(二进制转换,八进制转换,e.tc),当我点击一个按钮,比如说二进制转换,它将打开一个名为二进制转换的新窗口,但主窗口仍然在那里,我希望在单击按钮时关闭它。就这些,你还没有