JButton开启新的JFrame?

时间:2014-01-24 18:02:29

标签: java swing jframe jbutton

我一直在寻找多种方法来使用按钮打开JFrame。我找到的方法之一是使用方法建立JFrame并使用按钮调用该方法。然而,这似乎与我的计划无关。有人可以告诉我我做错了什么吗?我是Java的新手,我正在努力学习,并且似乎做得非常糟糕。我正在尝试创建一个目录,并在其底部有一个名为“新建购买”的按钮,该按钮将打开一个允许某人输入其信息的新JFrame。程序中的大部分代码都是不必要的,我稍后会编辑它,例如多个JPanel。我需要做的就是让新的JFrame来点击按钮。 showNewFrame()方法就是我试图通过按下按钮激活的方法。

public class Catalog extends JFrame
{
//Construct a panel for each row

    JPanel firstRow = new JPanel();


    JPanel secondRow = new JPanel();
    JPanel thirdRow = new JPanel();
    JPanel fourthRow = new JPanel();
    JPanel fifthRow = new JPanel();
    JPanel sixthRow = new JPanel();
    JPanel seventhRow = new JPanel();
    JPanel eighthRow = new JPanel();
    JPanel ninthRow = new JPanel();
    JPanel tenthRow = new JPanel();
    JPanel eleventhRow = new JPanel();
    JPanel twelvethRow = new JPanel();
    JPanel thirteenthRow = new JPanel();
    JPanel fourteenthRow = new JPanel();
    JPanel fifteenthRow = new JPanel();
    JPanel sixteenthRow = new JPanel();
    JPanel seventeenthRow = new JPanel();
    JPanel eighteenthRow = new JPanel();
    JPanel nineteenthRow = new JPanel();
    JPanel twentiethRow = new JPanel();
    JPanel twentyfirstRow = new JPanel();
    JPanel twentysecondRow = new JPanel();
    JPanel twentythirdRow = new JPanel();
    JPanel twentyfourthRow = new JPanel();

    //Construct a panel for the fields and buttons
    JPanel fieldPanel = new JPanel();
    JPanel buttonPanel = new JPanel();

    //Construct labels and text boxes
    JLabel coatOneLabel = new JLabel("Coat One");
    ImageIcon pictureOne = new ImageIcon("C:\\Users\\p6\\Desktop\\prodImage.jpeg");
    JLabel picLabelOne = new JLabel(pictureOne);
    JLabel priceOneLabel = new JLabel("Price:");
    JLabel coatTwoLabel = new JLabel("Coat Two");
    ImageIcon pictureTwo = new ImageIcon("snow.png");
    JLabel picLabelTwo = new JLabel(pictureTwo);
    JLabel priceTwoLabel = new JLabel("Price:");
    JLabel coatThreeLabel = new JLabel("Coat Three");
    ImageIcon pictureThree = new ImageIcon("snow.png");
    JLabel picLabelThree = new JLabel(pictureThree);
    JLabel priceThreeLabel = new JLabel("Price:");
    JLabel coatFourLabel = new JLabel("Coat Four");
    ImageIcon pictureFour = new ImageIcon("snow.png");
    JLabel picLabelFour = new JLabel(pictureFour);
    JLabel priceFourLabel = new JLabel("Price:");
    JLabel coatFiveLabel = new JLabel("Coat Five");
    ImageIcon pictureFive = new ImageIcon("snow.png");
    JLabel picLabelFive = new JLabel(pictureFive);
    JLabel priceFiveLabel = new JLabel("Price:");
    JLabel coatSixLabel = new JLabel("Coat Six");
    ImageIcon pictureSix = new ImageIcon("snow.png");
    JLabel picLabelSix = new JLabel(pictureSix);
    JLabel priceSixLabel = new JLabel("Price:");
    JLabel coatSevenLabel = new JLabel("Coat Seven");
    ImageIcon pictureSeven = new ImageIcon("snow.png");
    JLabel picLabelSeven = new JLabel(pictureSeven);
    JLabel priceSevenLabel = new JLabel("Price:");
    JLabel coatEightLabel = new JLabel("Coat Eight");
    ImageIcon pictureEight = new ImageIcon("snow.png");
    JLabel picLabelEight = new JLabel(pictureEight);
    JLabel priceEightLabel = new JLabel("Price:");

    //Construct buttons
    JButton submitButton = new JButton("Make A Purchase");
    JButton exitButton = new JButton("Not Right Now");

    public static void main(String[] args)
    {
        //set the look and feel of the interface
        try
        {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");

        }
        catch(Exception e)
        {
            JOptionPane.showMessageDialog(null,"The UIManager could not set the Look and Feel for this application.","Error",JOptionPane.INFORMATION_MESSAGE);
        }

        Catalog f = new Catalog();
        f.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        f.setSize(800,600);
        f.setTitle("Coat Catalog");
        f.setResizable(false);
        f.setLocation(200,200);
        f.setVisible(true);
    }

    public Catalog()
    {
        Container c = getContentPane();
        c.setLayout((new BorderLayout()));
        fieldPanel.setLayout(new GridLayout(20,10));
        FlowLayout rowSetup = new FlowLayout(FlowLayout.LEFT,5,3);
            firstRow.setLayout(rowSetup);
            secondRow.setLayout(rowSetup);
            thirdRow.setLayout(rowSetup);
            fourthRow.setLayout(rowSetup);
            fifthRow.setLayout(rowSetup);
            sixthRow.setLayout(rowSetup);
            seventhRow.setLayout(rowSetup);
            eighthRow.setLayout(rowSetup);
            ninthRow.setLayout(rowSetup);
            tenthRow.setLayout(rowSetup);
            eleventhRow.setLayout(rowSetup);
            twelvethRow.setLayout(rowSetup);
            thirteenthRow.setLayout(rowSetup);
            fourteenthRow.setLayout(rowSetup);
            fifteenthRow.setLayout(rowSetup);
            sixteenthRow.setLayout(rowSetup);
            seventeenthRow.setLayout(rowSetup);
            eighteenthRow.setLayout(rowSetup);
            nineteenthRow.setLayout(rowSetup);
            twentiethRow.setLayout(rowSetup);
            twentyfirstRow.setLayout(rowSetup);
            twentysecondRow.setLayout(rowSetup);
            twentythirdRow.setLayout(rowSetup);
            twentyfourthRow.setLayout(rowSetup);
        buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER));

        //Add fields to rows
        firstRow.add(coatOneLabel);
        firstRow.add(coatTwoLabel);

        secondRow.add(picLabelOne);
        secondRow.add(picLabelTwo);

        thirdRow.add(priceOneLabel);
        thirdRow.add(priceTwoLabel);

        fourthRow.add(coatThreeLabel);
        fourthRow.add(coatFourLabel);

        fifthRow.add(picLabelThree);
        fifthRow.add(picLabelFour);

        sixthRow.add(priceThreeLabel);
        sixthRow.add(priceFourLabel);

        seventhRow.add(coatFiveLabel);
        seventhRow.add(coatSixLabel);

        eighthRow.add(picLabelFive);
        eighthRow.add(picLabelSix);

        ninthRow.add(priceFiveLabel);
        ninthRow.add(priceSixLabel);

        tenthRow.add(coatSevenLabel);
        tenthRow.add(coatEightLabel);

        eleventhRow.add(picLabelSeven);
        eleventhRow.add(picLabelEight);

        twelvethRow.add(priceSevenLabel);
        twelvethRow.add(priceEightLabel);

        //Add rows to panel
        fieldPanel.add(firstRow);
        fieldPanel.add(secondRow);
        fieldPanel.add(thirdRow);
        fieldPanel.add(fourthRow);
        fieldPanel.add(fifthRow);
        fieldPanel.add(sixthRow);
        fieldPanel.add(seventhRow);
        fieldPanel.add(eighthRow);
        fieldPanel.add(ninthRow);
        fieldPanel.add(tenthRow);
        fieldPanel.add(eleventhRow);
        fieldPanel.add(twelvethRow);
        fieldPanel.add(thirteenthRow);
        fieldPanel.add(fourteenthRow);
        fieldPanel.add(fifteenthRow);
        fieldPanel.add(sixteenthRow);
        fieldPanel.add(seventeenthRow);
        fieldPanel.add(eighteenthRow);
        fieldPanel.add(nineteenthRow);
        fieldPanel.add(twentiethRow);
        fieldPanel.add(twentyfirstRow);
        fieldPanel.add(twentysecondRow);
        fieldPanel.add(twentythirdRow);
        fieldPanel.add(twentyfourthRow);


        //Add button to panel
        buttonPanel.add(submitButton);
        buttonPanel.add(exitButton);

        //Add panels to frame
        c.add(fieldPanel, BorderLayout.CENTER);
        c.add(buttonPanel, BorderLayout.SOUTH);

        exitButton.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent h)
            {
                if (h.getSource() == exitButton)
                {
                        System.exit(0);
                }
            }
        });

        //Add functionality to buttons
        submitButton.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent d)
            {
                if (d.getSource() == submitButton)
                {
                    showNewFrame();
                }
            }
        });
    }

    private void showNewFrame()
    {
        JFrame BillPayer = new JFrame("BillPayer");
        BillPayer.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        BillPayer.pack();
        BillPayer.setVisible(true);

        class BillPayer extends JFrame implements ActionListener
        {
            //Declare output stream
            DataOutputStream output;

            //Construct a panel for each row
            JPanel firstRow = new JPanel();
            JPanel secondRow = new JPanel();
            JPanel thirdRow = new JPanel();
            JPanel fourthRow = new JPanel();
            JPanel fifthRow = new JPanel();
            JPanel sixthRow = new JPanel();
            JPanel seventhRow = new JPanel();
            JPanel eighthRow = new JPanel();

            //Construct a panel for the fields and buttons
            JPanel fieldPanel = new JPanel();
            JPanel buttonPanel = new JPanel();

            //Construct labels and text boxes
            JLabel acctNumLabel = new JLabel("Account Number:                            ");
                JTextField acctNum = new JTextField(15);
            JLabel pmtLabel = new JLabel("Payment Amount:");
                JTextField pmt = new JTextField(10);
            JLabel firstNameLabel = new JLabel("First Name:         ");
                JTextField firstName = new JTextField(10);
            JLabel lastNameLabel = new JLabel("Last Name:");
                JTextField lastName = new JTextField(20);
            JLabel addressLabel = new JLabel("Address:");
                JTextField address = new JTextField(35);
            JLabel cityLabel = new JLabel("City:                   ");
                JTextField city = new JTextField(10);
            JLabel stateLabel = new JLabel("State:");
                JTextField state = new JTextField(2);
            JLabel zipLabel = new JLabel("Zip:");
                JTextField zip = new JTextField(9);

            //Construct button
            JButton submitButton = new JButton("Submit");

            public void main(String[] args)
            {
                //set the look and feel of the interface
                try
                {
                    UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");

                }
                catch(Exception e)
                {
                    JOptionPane.showMessageDialog(null,"The UIManager could not set the Look and Feel for this application.","Error",JOptionPane.INFORMATION_MESSAGE);
                }

                BillPayer f = new BillPayer();
                f.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
                f.setSize(450,300);
                f.setTitle("Crandall Power and Light Customer Payments");
                f.setResizable(false);
                f.setLocation(200,200);
                f.setVisible(true);
            }

            public BillPayer()
            {
                Container c = getContentPane();
                c.setLayout((new BorderLayout()));
                fieldPanel.setLayout(new GridLayout(8,1));
                FlowLayout rowSetup = new FlowLayout(FlowLayout.LEFT,5,3);
                    firstRow.setLayout(rowSetup);
                    secondRow.setLayout(rowSetup);
                    thirdRow.setLayout(rowSetup);
                    fourthRow.setLayout(rowSetup);
                    fifthRow.setLayout(rowSetup);
                    sixthRow.setLayout(rowSetup);
                    seventhRow.setLayout(rowSetup);
                    eighthRow.setLayout(rowSetup);
                buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER));

                //Add fields to rows
                firstRow.add(acctNumLabel);
                firstRow.add(pmtLabel);

                secondRow.add(acctNum);
                secondRow.add(pmt);

                thirdRow.add(firstNameLabel);
                thirdRow.add(lastNameLabel);


                fourthRow.add(firstName);
                fourthRow.add(lastName);

                fifthRow.add(addressLabel);

                sixthRow.add(address);

                seventhRow.add(cityLabel);
                seventhRow.add(stateLabel);
                seventhRow.add(zipLabel);

                eighthRow.add(city);
                eighthRow.add(state);
                eighthRow.add(zip);

                //Add rows to panel
                fieldPanel.add(firstRow);
                fieldPanel.add(secondRow);
                fieldPanel.add(thirdRow);
                fieldPanel.add(fourthRow);
                fieldPanel.add(fifthRow);
                fieldPanel.add(sixthRow);
                fieldPanel.add(seventhRow);
                fieldPanel.add(eighthRow);

                //Add button to panel
                buttonPanel.add(submitButton);

                //Add panels to frame
                c.add(fieldPanel, BorderLayout.CENTER);
                c.add(buttonPanel, BorderLayout.SOUTH);

                //Add functionality to buttons
                submitButton.addActionListener(this);

                //Get the current date and open the file
                Date today = new Date();
                SimpleDateFormat myFormat = new SimpleDateFormat("MMddyyyy");
                String filename = "payments" + myFormat.format(today);

                try
                {
                    output = new DataOutputStream(new FileOutputStream(filename));
                }
                catch(IOException io)
                {
                    JOptionPane.showMessageDialog(null,"The program could not create a storage location. Please check the disk drive and then run the program again.","Error",JOptionPane.INFORMATION_MESSAGE);

                    System.exit(1);
                }

                addWindowListener(
                    new WindowAdapter()
                    {
                        public void windowClosing(WindowEvent f)
                        {
                            int answer = JOptionPane.showConfirmDialog(null,"Are you sure you want to exit and submit the file?", "File Submission",JOptionPane.YES_NO_OPTION);
                            if (answer == JOptionPane.YES_OPTION)
                            System.exit(0);
                        }
                    }
                );
            }

            public void actionPerformed(ActionEvent f)
            {
                String arg = f.getActionCommand();

                if(checkFields())
                {
                    try
                    {
                        output.writeUTF(acctNum.getText());
                        output.writeUTF(pmt.getText());
                        output.writeUTF(firstName.getText());
                        output.writeUTF(lastName.getText());
                        output.writeUTF(address.getText());
                        output.writeUTF(city.getText());
                        output.writeUTF(state.getText());
                        output.writeUTF(zip.getText());

                        JOptionPane.showMessageDialog(null,"The payment information has been saved.","Submission successful",JOptionPane.INFORMATION_MESSAGE);
                    }
                    catch(IOException c)
                    {
                        System.exit(1);
                    }
                    clearFields();
                }
            }

            public boolean checkFields()
            {
                if ((acctNum.getText().compareTo("")<1)    ||
                    (pmt.getText().compareTo("")<1)        ||
                    (firstName.getText().compareTo("")<1)  ||
                    (lastName.getText().compareTo("")<1)   ||
                    (address.getText().compareTo("")<1)    ||
                    (city.getText().compareTo("")<1)       ||
                    (state.getText().compareTo("")<1)      ||
                    (zip.getText().compareTo("")<1))
                {
                    JOptionPane.showMessageDialog(null,"You must complete all fields.","Data Entry Error",JOptionPane.WARNING_MESSAGE);
                    return false;
                }
                else
                {
                    return true;
                }
            }

            public void clearFields()
            {
                //Clear fields and reset the focus
                acctNum.setText("");
                pmt.setText("");
                firstName.setText("");
                lastName.setText("");
                address.setText("");
                city.setText("");
                state.setText("");
                zip.setText("");
                acctNum.requestFocus();
            }
        }
    }
}

我试图对程序进行一些修改。问题是,现在按钮确实显示了一个新窗口,但窗口不包含我需要它的数据。它的标题是“Coat Payment”,所以我相信除了我在BillPayer方法中的内部类(内部类是PaymentScreen)之外,它已经到了所有东西。再一次,我相信我的无知使我误入歧途。

    //Add functionality to buttons
    submitButton.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent d)
        {
            if (d.getSource() == submitButton)
            {
                BillPayer();
            }
        }
    });
}

private void BillPayer()
{
    JDialog PaymentScreen = new JDialog();
    PaymentScreen.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
    PaymentScreen.setSize(900,600);
    PaymentScreen.setTitle("Coat Payment");
    PaymentScreen.setResizable(false);
    PaymentScreen.setLocation(200,200);
    PaymentScreen.setVisible(true);

    class PaymentScreen extends JDialog implements ActionListener
    {

2 个答案:

答案 0 :(得分:3)

抱歉,这是一些精神分裂症代码。也许我读错了,但我明白了:

  • 您创建一个名为BillPayer的JFrame变量,并将其设置为可见。它是一个小的空JFrame,没有别的。
  • 然后宣布单独的BillPayer ,而显示它,
  • 除了在其(???)main方法中的代码之外,在私有内部类中的一个main方法,(从适当的位置)永远不会被调用。

建议:

  • 首先,您可能真的不想显示另一个JFrame。大多数应用程序应该只有一个主窗口,一个JFrame。
  • 如果您需要从主窗口显示另一个窗口,请使用对话框,例如JDialog。这很容易做到,就像JFrame涉及创建一个填充了GUI的JPanel,然后将该JPanel放入JDialog并将其设置为可见。
  • 如果你使用JDialog,你可以选择它是否是模态的,它是否会在显示时冻结底层调用窗口。
  • 要按下按钮显示另一个窗口,无论是JFrame还是JDialog,您都可以在按钮的ActionListener actionPerformed方法中调用窗口上的setVisible(true)。看起来你正在这样做。有什么表现吗?您是否调试过代码以查看是否未调用您认为正在访问的代码?
  • 或者,如果要在主窗口内显示另一个视图,请使用CardLayout。
  • 不要为变量提供与您的类完全相同的名称,拼写和大小写。
  • 学习并遵循Java命名约定:类名以大写字母开头,变量和方法名称以小写字母开头。
  • 不要通过在主内部类中嵌入main方法来混淆代码。这没什么意义。
  • 研究使用ArrayLists等数组和集合,它们可以帮助您创建更紧凑,更易读,更易于调试和扩展的程序。这样做可以减少很多代码的冗余。
  • 如果您有另一个与主视图不同的GUI视图的代码,那么此代码可能位于其自己的顶级类中,而不是内部类。

修改 在更多地审核您的代码时,我建议:

  • 是的,使用JDialog作为数据输入窗口。
  • 数据可能最好显示在主GUI中JScrollPane中保存的JTable中。这将取代当前代码使用的JPanel行。

答案 1 :(得分:0)

这听起来很粗糙,但效率更高。

选择项目&gt;点击删除

下载Netbeans或Eclipse(或两者)并在这些程序中编程。它们将有助于过滤掉您所犯的错误并提供布局帮助,使其看起来更易于理解。

完成后,请按照以下教程进行操作:

http://docs.oracle.com/javase/tutorial/uiswing/start/index.html

上面的答案已经提供了许多有价值的提示,但问题是你根本不知道如何正确构建程序。

我的提示:自己决定做什么真棒。你认为对自己或他人有用的东西,然后通过教程并尝试构建它。这迫使你不仅要实现你学到的东西,还要用任何编程语言来解决真正的问题:学习如何解决问题。