Java 从一个GUI窗口跳到另一个GUI窗口
我正在开发一个java应用程序,它有5个gui窗口,其中一个是问候语或主窗口,我已经完成了所有逻辑部分的工作,完成了99.99%,剩下的唯一一件事是,当我点击一个按钮时,比如说主窗口上的一个按钮,我怎么能这样编码,它将引导我进入第二个窗口,主窗口将自动关闭,我如何才能做到这一点 任何帮助都将不胜感激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.*;
编辑 这是密码,先生
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),当我点击一个按钮,比如说二进制转换,它将打开一个名为二进制转换的新窗口,但主窗口仍然在那里,我希望在单击按钮时关闭它。就这些,你还没有