1

我试图通过按JButton打开一个新窗口。现在我的 Jbutton 的 actionPerformed 方法只是在按下它后关闭窗口。我希望它在旧窗口关闭时打开一个新窗口。我知道,这个问题已经被问过了,但是我尝试了很多东西,似乎没有人能完美地工作。

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

     public class secondTab extends JFrame 
        {
            static JTabbedPane Pane = new JTabbedPane();

            static JPanel Second = new JPanel();
            static JPanel second = new JPanel(); // This Panel is inside the Second Panel

            static JButton guess1 = new JButton();
            static String words[] = new String[9];

            static Random getRandomWord = new Random();

            static int   rr;
            static  JButton Labels[] = new JButton[10];

     public static void main(String args[]) 
        {
            //construct frame
            new secondTab().show();
        }

     public secondTab() 
        {
            // code to build the form
            setTitle("Shopping Cart");

            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     
            getContentPane().setLayout(new GridBagLayout());

            // position tabbed pane
            GridBagConstraints gridConstraints = new GridBagConstraints();
            gridConstraints.gridx = 1;
            gridConstraints.gridy = 1;
            Pane.setForeground(Color.YELLOW);
            Pane.setBackground(Color.MAGENTA);

            getContentPane().add(Pane, gridConstraints);
            getContentPane().setLayout(new GridBagLayout());


         //  Tabs Starts From Here

             Second.setLayout(new GridBagLayout());

             words[1] = "JAVA";
             words[2] = "FLOAT";
             words[3] = "VOID";
             words[4] = "MAIN";
             words[5] = "STATIC";
             words[6] = "FINAL";
             words[7] = "PRIVATE";
             words[8] = "CHAR";
             words[9] = "IF";


             rr = getRandomWord.nextInt(10);

             for(int i = 1; i <=words[rr].length(); i++)
                {
                    Labels[i] = new JButton();
                    gridConstraints.gridx = 0;
                    gridConstraints.gridy = 0;
                    second.add(Labels[i]);
                }  


            gridConstraints.gridx= 0;
            gridConstraints.gridx= 0;
            Second.add(second, gridConstraints);


            guess1.setText("New Word");
            gridConstraints.gridx = 0;
            gridConstraints.gridy = 2;
            Second.add(guess1, gridConstraints);

这是我的按钮的 Action Performed 方法

            // Action Performed method for the JButton guess1
            guess1.addActionListener(new ActionListener() 
                {
                    public void actionPerformed(ActionEvent e) 
                        {
                            dispose();
                        }
                });



            Pane.addTab("Game ", Second); 

            pack();
            Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
            setBounds((int) (0.5 * (screenSize.width - getWidth())), (int) (0.5 * 
                    (screenSize.height - getHeight())), getWidth(), getHeight());
        }

    }
4

6 回答 6

4

只需在 dispose() 之后添加新的面板语句。例如:添加

guess1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                dispose();
                new JFrame("New Window").show();
            }
        });

还有一点 - 您已经创建了 9 个元素的数组,并且您尝试在 10 个索引处插入会引发 ArrayIndexOutOfBound 异常。

于 2013-05-22T04:51:27.530 回答
2

您必须删除按钮和其他控件的静态关键字,然后您可以这样做

     JTabbedPane Pane = new JTabbedPane();
     JPanel Second = new JPanel();
     JPanel second = new JPanel(); // This Panel is inside the Second Panel
     JButton guess1 = new JButton();
     String words[] = new String[10];
     Random getRandomWord = new Random();
     int rr;
     JButton Labels[] = new JButton[10];

您必须创建同一类的新实例并显示它

        guess1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                dispose();
                new secondTab().show();
            }
        });
于 2013-05-22T05:14:27.903 回答
1

因此,与其关闭当前窗口并创建一个新的窗口实例,这很烦人(而且有点懒惰)。

您应该提供一种重置 UI 状态的方法。

您应该通过一些重置内部状态并更新 UI 的方法调用来执行此操作。

您可以通过删除“游戏”面板、创建它的新实例并将其添加回框架来完成相同的操作。

闪烁框架是个坏主意-恕我直言

于 2013-05-22T05:04:24.447 回答
0
Hi,

        Please try like this.. It may help..

guess1.addActionListener(new ActionListener() 
                {
                    public void actionPerformed(ActionEvent e) 
                        {
                              dispose();
                             new AnotherJFrame();
                        }
                }
---------------------------------------------

import javax.swing.JFrame;
import javax.swing.JLabel;

public class AnotherJFrame extends JFrame
{
    public AnotherJFrame()
    {
        super("Another GUI");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        add(new JLabel("Empty JFrame"));
        pack();
        setVisible(true);
    }
}
于 2013-05-22T04:56:51.217 回答
0

我看到您的问题已得到解答,因此这并不能解决您的问题。我只是想我会分享一些你可能想要修复的东西:

  1. 不要使用show()/hide(),因为它们已被弃用。[更多信息]分别
    使用setVisible(true/false)。[更多信息]

  2. 在将每个组件添加到同一个容器之前,您不必添加新的“GridBagLayout()”。即,您可以删除第二个getContentPane().setLayout(new GridBagLayout());[更多信息]

  3. 只要确保您了解 Java 中的数组索引(以及我所知道的所有编程语言 od - 这不是那么多......但仍然)是从零开始的![更多信息]

  4. 为了找到“可用”屏幕尺寸的中心Toolkit.getDefaultToolkit().getScreenSize();是不够的,因为它包括屏幕插入(例如不可见的边距、任务栏等)。您还需要使用Toolkit.getDefaultToolkit().getScreenInsets(GraphicsConfiguration);和减去屏幕宽度的左右插图以及屏幕高度的顶部和底部插图。

  5. 如果您只需要在屏幕上居中放置一个 JFrame,您可以简单地使用setLocationRelativeTo(null). [更多信息]

于 2013-05-22T05:23:08.813 回答
-1

请参阅以下链接...它可能对您有所帮助..

Java swing应用程序,单击按钮时关闭一个窗口并打开另一个窗口

于 2013-05-22T05:05:51.063 回答