java - JButton 打开新的 JFrame?

标签 java swing jframe jbutton

我一直在寻找使用按钮打开 JFrame 的多种方法。我找到的方法之一是使用方法建立 JFrame 并使用按钮调用该方法。然而,这似乎不适用于我的程序。有人可以告诉我我做错了什么吗?我是 Java 的新手,正在尝试自学,但似乎做得很糟糕。我正在尝试创建一个目录,在它的底部有一个名为“进行新购买”的按钮,它将打开一个新的 JFrame,允许某人输入他们的信息。程序中的很多代码都是不必要的,我稍后会编辑它,比如多个JPanels。我需要做的就是让新的 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
    {

最佳答案

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

  • 您创建一个名为 BillPayer 的 JFrame 变量,并将其设置为可见。它是一个空的小 JFrame,仅此而已。
  • 然后声明一个单独的 BillPayer ,并且显示它,
  • 除了在其 (???) main 方法中的代码之外,这是一个位于私有(private)内部类中的 main 方法,它(适本地)从未被调用。

建议:

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

编辑 在进一步审查您的代码时,我建议:

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

关于java - JButton 打开新的 JFrame?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21339367/

相关文章:

java - 如何从批处理文件中暂停 Java 启动屏幕?

java - 如何执行从 JFileChooser 到包含文件夹的 JList 的拖放操作

java - 为什么我的文本区域不可见?

java - 双击时,圆圈需要消失

java - Android拖放+自定义绘图

java - 每个月的平均客户支出和每个月的订购商品数量

java - 根据列值更改 JTable 行的背景颜色

java - 如何将鼠标光标放在 JFileChooser 上的 OPEN 按钮上?

java - 如何在Java中定位输入对话框?

从 Ubuntu 18.04 升级到 20.04 后,Java 应用程序使用 <1% cpu