java - 创建一个工作 Java GUI

标签 java swing user-interface

我是一个Java新手。我正在上一门大学介绍 Java 类(class),现在我的程序都没有工作。

这一点在 GUI 创建一章。我不确定我做错了什么。我一直在不停地工作一个多星期,但没有任何进展。我在 Java 论坛、YouTube 视频、以前的 StackOverflow 问题、Oracle 演示和教程中进行了广泛的搜索;为了以防万一,我将我的 Java JDK 更新为 1.7,但没有任何效果。

首先我应该提一下,我之前遇到了一个问题,它会说“javaw.exe 遇到问题并需要关闭”,但是在更新到 1.7 后,这个问题似乎已经消失了,我没关系。我在 IDE Eclipse helios 中运行该程序。

我决定尝试将程序更改为 JApplet看看这是否有帮助,但它没有。我尝试调试,但它甚至不会让我完成调试。我究竟做错了什么?当我运行 JApplet ,我在控制台上得到输出,但 StackOverflow 不允许我发布它。

这是我的代码的副本。 javadoc s 还没有完成,对此我深表歉意。我刚刚做了很多更改,试图修复我无法跟上创建所有 javadoc 的步伐的问题。 s。我还应该警告您,我确实创建了一个输入格式验证 ( do-while try-catch ),但我在这里省略了它,因为首先我试图找出我做错了什么,然后再继续添加它。我也为代码中草率的缩进道歉。不知何故,它并没有很好地转移到 StackOverflow 网站上。

package assignment12;

/*
 * File: CalculateBill.java
 * ------------------------
 * This program calculates a table's bill at a restaurant.
 * The program uses a frame user interface with the following components: 
 * input textfields for the waiter name and table number
 * four interactive combo boxes for each category of the menu containing all the menu items
 * a listbox that keeps track of menu item that is ordered
 * buttons that allow the user to delete an item or clear all the items on the listbox
 * a textarea that displays the table and waiter name entered 
 * a label that refreshes the total, subtotal, and tax when an item is entered or deleted
 * a restaurant logo for "Charlotte's Apple tree restaurant"
 */
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/* CalculateBill.java uses these additional files:
 * images/appletree.gif
 */
/**
 * 
 * @version     1.7                                   
 * @since       2011-11-21          
 */
@SuppressWarnings("serial")
public class CalculateBill extends JPanel implements ActionListener {

    JComboBox beverageList;
    JComboBox appetizerList;
    JComboBox dessertList;
    JComboBox maincourseList;
    JLabel restaurantLogo;
    JTextField textTableNum;  //where the table number is entered
    JTextField waiterName; //where the waiter name is entered
    JTextArea textArea;//where the waiter name and table number appears at the bottem
    JLabel waiter;
    JLabel table;
    DefaultListModel model;//model 
    JList list; // list 
    static int tableNum = 0; // setting table number to an integer outside the range (1-10) keeps loop going until 
    // valid user entry in textTableNum textfield
    String tn; //string value of table number
    String wn; //string value of waiter name
    JScrollPane scrollpane;
    public double subtotal = 0.00;
    public double tax = 0.00;
    public double total = 0.00;
    JLabel totallabel;

    CalculateBill() {

        super(new BorderLayout());
        //create and set up the window.
        JFrame frame = new JFrame("Charlotte's Appletree Restaurant");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setPreferredSize(new Dimension(300, 600));


        String[] beverages = {"Beverages", "Soda", "Tea", "Coffee", "Mineral Water", "Juice", "Milk"};
        String[] appetizers = {"Appetizers", "Buffalo Wings", "Buffalo Fingers", "Potato Skins", "Nachos", "Mushroom Caps", "Shrimp Cocktail", "Chips and Salsa"};
        String[] maincourses = {"Main Courses", "Seafood Alfredo", "Chicken Alfredo", "Chicken Picatta", "Turkey Club", "Lobster Pie", "Prime Rib", "Shrimp Scampi", "Turkey Dinner", "Stuffed Chicken"};
        String[] desserts = {"Desserts", "Apple Pie", "Sundae", "Carrot Cake", "Mud Pie", "Apple Crisp"};

        /*create the combo boxes, selecting the first item at index 0.
        indices start at 0, so so 0 is the name of the combo box*/

        // beverages combobox
        beverageList = new JComboBox(beverages);
        beverageList.setEditable(false);
        beverageList.setSelectedIndex(0);
        add(new JLabel("  Beverages:"), BorderLayout.CENTER);
        add(beverageList, BorderLayout.CENTER);
        // appetizers combobox
        appetizerList = new JComboBox(appetizers);
        appetizerList.setEditable(false);
        appetizerList.setSelectedIndex(0);
        add(new JLabel("  Appetizers:"), BorderLayout.CENTER);
        add(appetizerList, BorderLayout.CENTER);

        // maincourses combobox
        maincourseList = new JComboBox(maincourses);
        maincourseList.setEditable(false);
        maincourseList.setSelectedIndex(0);
        add(new JLabel(" Main courses:"), BorderLayout.CENTER);
        add(maincourseList, BorderLayout.CENTER);

        // desserts combox
        dessertList = new JComboBox(desserts);
        dessertList.setEditable(false);
        dessertList.setSelectedIndex(0);
        add(new JLabel("  Desserts:"), BorderLayout.CENTER);
        add(dessertList, BorderLayout.CENTER);

        // listbox
        model = new DefaultListModel();
        JPanel listPanel = new JPanel();
        list = new JList(model);
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        list.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));



        // list box continued
        JScrollPane listPane = new JScrollPane();
        listPane.getViewport().add(list);
        listPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
        listPanel.add(listPane);

        // total label
        totallabel = new JLabel(setTotalLabelAmount());
        add((totallabel), BorderLayout.SOUTH);
        totallabel.setVisible(false);

        // sets up listbox buttons
        add(new JButton("Delete"), BorderLayout.SOUTH);
        add(new JButton("Clear All"), BorderLayout.SOUTH);


        // sets up restaurant logo
        restaurantLogo = new JLabel();
        restaurantLogo.setFont(restaurantLogo.getFont().deriveFont(Font.ITALIC));
        restaurantLogo.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0));
        restaurantLogo.setPreferredSize(new Dimension(123, 200 + 10));
        ImageIcon icon = createImageIcon("images/appletree.gif");
        restaurantLogo.setIcon(icon);
        restaurantLogo.setText("Charlotte's Apple Tree Restaurant");
        add((restaurantLogo), BorderLayout.NORTH);

        // sets up the label next to textfield for table number
        table = new JLabel("     Enter Table Number (1-10):");


        /**
         * @throws InputMismatchException if the textfield entry is not an integer
         *
         */
        // sets up textfield next to table lable
        table.setLabelFor(textTableNum);
        add((table), BorderLayout.NORTH);

        // sets up label for waiter name
        waiter = new JLabel("      Enter Waiter Name: ");
        // sets up textfield next to waiter lable
        waiter.setLabelFor(waiterName);
        add((waiter), BorderLayout.NORTH);


        // listens to the textfields
        textTableNum.addActionListener(this);
        waiterName.addActionListener(this);


        // sets up textarea
        textArea = new JTextArea(5, 10);
        textArea.setEditable(false);
        JScrollPane scrollPane = new JScrollPane(textArea);


        // lays out listpanel
        listPanel.setLayout(new GridBagLayout());

        GridBagConstraints c = new GridBagConstraints();

        c.gridwidth = GridBagConstraints.REMAINDER;

        c.fill = GridBagConstraints.HORIZONTAL;
        add(listPane, c);

        c.fill = GridBagConstraints.BOTH;

        c.weightx = 1.0;

        c.weighty = 1.0;

        add(scrollPane, c);

        scrollPane.setVisible(true);

    }

    private double getPrices(String item) {
        // create hashmap to store menu items with their corresponding prices

        HashMap<String, Double> hm = new HashMap<String, Double>();

        // put elements to the map
        hm.put("Soda", new Double(1.95));
        hm.put("Tea", new Double(1.50));
        hm.put("Coffee", new Double(1.25));
        hm.put("Mineral Water", new Double(2.95));
        hm.put("Juice", new Double(2.50));
        hm.put("Milk", new Double(1.50));
        hm.put("Buffalo Wings", new Double(5.95));
        hm.put("Buffalo Fingers", new Double(6.95));
        hm.put("Potato Skins", new Double(8.95));
        hm.put("Nachos", new Double(8.95));
        hm.put("Mushroom Caps", new Double(10.95));
        hm.put("Shrimp Cocktail", new Double(12.95));
        hm.put("Chips and Salsa", new Double(6.95));
        hm.put("Seafood Alfredo", new Double(15.95));
        hm.put("Chicken Alfredo", new Double(13.95));
        hm.put("Chicken Picatta", new Double(13.95));
        hm.put("Turkey Club", new Double(11.95));
        hm.put("Lobster Pie", new Double(19.95));
        hm.put("Prime Rib", new Double(20.95));
        hm.put("Shrimp Scampi", new Double(18.95));
        hm.put("Turkey Dinner", new Double(13.95));
        hm.put("Stuffed Chicken", new Double(14.95));
        hm.put("Apple Pie", new Double(5.95));
        hm.put("Sundae", new Double(3.95));
        hm.put("Carrot Cake", new Double(5.95));
        hm.put("Mud Pie", new Double(4.95));
        hm.put("Apple Crisp", new Double(5.95));

        double price = hm.get(item);
        return price;
    }

    /**
     * validates that the correct path for the image was found to prevent crash
     *
     * @param path is the icon path of the restaurant logo
     *
     * @return nothing if you can't find the image file
     *
     * @return imageIcon(imgURL) the path to image if you can find it
     */
    protected static ImageIcon createImageIcon(String path) {
        java.net.URL imgURL = CalculateBill.class.getResource(path);
        if (imgURL != null) {
            return new ImageIcon(imgURL);
        } else {
            JOptionPane.showMessageDialog(null, "Couldn't find file: "
                + path, "image path error", JOptionPane.ERROR_MESSAGE);
            return null;
        }

    }

    //Listens to the combo boxes 
    private void getSelectedMenuItem(JComboBox cb) {
        String mnItem = (String) cb.getSelectedItem();
        updateListBox(mnItem);

    }

    /**
     * updates the list box
     * 
     * @param name the element to be added to the list box
     */
    private void updateListBox(String name) {
        totallabel.setVisible(false);
        model.addElement(name);
        Addition(getPrices(name));
        totallabel.setVisible(true);
    }

    void showWaiterAndTableNum() {
        textArea.append("Table Number: " + tn + " Waiter: " + wn);
        textArea.setCaretPosition(textArea.getDocument().getLength());
    }

    /**
     * adds to the subtotal/total calculator.
     *
     * @param s The name of the menu item which will be used to access its hashmap key value. 
     *
     */
    private void Addition(double addedP) {

        subtotal = subtotal + addedP;

        tax = .0625 * subtotal;

        total = subtotal + tax;



    }

    /**
     * subtracts from to the subtotal/total calculator.
     *
     * @param subtractedp The price of the menu item which will be used to access its hashmap key value. 
     *
     */
    // sets up the 'total' label which shows subtotal, tax, total
    private void Subtraction(double subtractedp) {

        subtotal = subtotal - subtractedp;

        tax = subtotal * .0625;
        total = subtotal + tax;

    }

    private void resetCalculator() {
        subtotal = 0.00;
        tax = 0.00;
        total = 0.00;
    }

    // listens to list buttons
    @Override
    public void actionPerformed(ActionEvent e) {
        JTextField tf = (JTextField) e.getSource();
        if (tf.equals("textTableNum")) {
            tn = tf.getText();
        } else if (tf.equals("waiterName")) {
            wn = tf.getText();
        }

        String cmd = e.getActionCommand();
        if (cmd.equals("Delete")) {
            totallabel.setVisible(false);
            ListSelectionModel selmodel = list.getSelectionModel();
            int index = selmodel.getMinSelectionIndex();
            String foodName = (String) list.getSelectedValue();
            Subtraction(getPrices(foodName));
            totallabel.setVisible(true);
            //subtracts from the subtotal
            if (index >= 0) {
                model.remove(index);
            }
        } else if (cmd.equals("Clear all")) {
            model.clear();
            resetCalculator();
        }
    }

    //combobox mouse listener
    public void mouseClicked(MouseEvent e) {
        if (e.getClickCount() == 2) {
            JComboBox cb = (JComboBox) e.getSource();
            getSelectedMenuItem(cb);
        }
    }

    private String setTotalLabelAmount() {
        String totlab = "Subtotal: $ " + subtotal + " Tax: $" + tax + "\n" + "Total: $ " + total;
        return totlab;
    }
}

**my applet:**
package assignment12;

import javax.swing.JApplet;


import javax.swing.SwingUtilities;



@SuppressWarnings("serial")
public class Main extends JApplet {

    /**
     * @param args
     */
    public void init() {

        // schedule job for event-dispatching
        //while showing Aplication GUI
        try {
            SwingUtilities.invokeLater(new Runnable() {

                public void run() {
                    createAndShowGUI();
                }
            });
        } catch (Exception e) {
            System.err.println("createAndShowGUI didn't complete successfully");
        }
    }

    // create and show GuI
    private void createAndShowGUI() {

        //Create and set up the content pane.
        CalculateBill newContentPane = new CalculateBill();
        newContentPane.setOpaque(true); //content panes must be opaque
        setContentPane(newContentPane);
    }
}

最佳答案

好吧,一方面“什么是没有错的”浮现在脑海,但实际上你已经远离了。

这里有几个问题。我只对其中一些进行了抨击。

继承 JPanel 比继承 JFrame 更容易。创建一个面板,并将其添加到框架中。请参阅 Eric 关于如何构建它的答案,并查看下面的主要方法。

您缺少两个 JTextField:textTableNum 和 waiterName。我建立起来的第一件事是在这两个位置建立一个 NPE。接下来,您对 GridBag 的约束是错误的。我不是 GridBag 的人。 GridBag 给了我荨麻疹,所以我不能说这些有什么问题,所以我消除了约束并将它们替换为“null”。一旦我这样做了,我至少得到了一个框架和一个 GUI。

接下来,您所有的 BorderLayout 代码都是错误的。当您在边框布局上指定一个位置时,这正是您正在做的——指定一个位置。如果你在 BorderLayout.NORTH 中放了 3 个东西,它们都将上升到那里,并相互叠加(你只会看到其中一个)。因此,很明显,您的所有布局代码都需要大量工作。

经过一番屠杀,我们得到了这个:

package soapp;

/*
 * File: CalculateBill.java
 * ------------------------
 * This program calculates a table's bill at a restaurant.
 * The program uses a frame user interface with the following components:
 * input textfields for the waiter name and table number
 * four interactive combo boxes for each category of the menu containing all the menu items
 * a listbox that keeps track of menu item that is ordered
 * buttons that allow the user to delete an item or clear all the items on the listbox
 * a textarea that displays the table and waiter name entered
 * a label that refreshes the total, subtotal, and tax when an item is entered or deleted
 * a restaurant logo for "Charlotte's Apple tree restaurant"
 */
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


/* CalculateBill.java uses these additional files:
 * images/appletree.gif
 */
/**
 *
 * @version     1.7
 * @since       2011-11-21
 */
@SuppressWarnings("serial")
public class CalculateBill extends JPanel implements ActionListener {

    JComboBox beverageList;
    JComboBox appetizerList;
    JComboBox dessertList;
    JComboBox maincourseList;
    JLabel restaurantLogo;
    JTextField textTableNum;  //where the table number is entered
    JTextField waiterName; //where the waiter name is entered
    JTextArea textArea;//where the waiter name and table number appears at the bottem
    JLabel waiter;
    JLabel table;
    DefaultListModel model;//model
    JList list; // list
    static int tableNum = 0; // setting table number to an integer outside the range (1-10) keeps loop going until
    // valid user entry in textTableNum textfield
    String tn; //string value of table number
    String wn; //string value of waiter name
    JScrollPane scrollpane;
    public double subtotal = 0.00;
    public double tax = 0.00;
    public double total = 0.00;
    JLabel totallabel;

    public static void main(String[] args) {
        // TODO code application logic here
        JFrame frame = new JFrame("SO App");

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        CalculateBill cb = new CalculateBill();
        frame.getContentPane().add(cb);
        frame.pack();
        frame.setVisible(true);
    }

    CalculateBill() {
        super(new BorderLayout());
        JPanel panel;
        //create and set up the window.
//        JFrame frame = new JFrame("Charlotte's Appletree Restaurant");
//        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//        frame.setPreferredSize(new Dimension(300, 600));

        setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));

        String[] beverages = {"Beverages", "Soda", "Tea", "Coffee", "Mineral Water", "Juice", "Milk"};
        String[] appetizers = {"Appetizers", "Buffalo Wings", "Buffalo Fingers", "Potato Skins", "Nachos", "Mushroom Caps", "Shrimp Cocktail", "Chips and Salsa"};
        String[] maincourses = {"Main Courses", "Seafood Alfredo", "Chicken Alfredo", "Chicken Picatta", "Turkey Club", "Lobster Pie", "Prime Rib", "Shrimp Scampi", "Turkey Dinner", "Stuffed Chicken"};
        String[] desserts = {"Desserts", "Apple Pie", "Sundae", "Carrot Cake", "Mud Pie", "Apple Crisp"};

        /*create the combo boxes, selecting the first item at index 0.
        indices start at 0, so so 0 is the name of the combo box*/

        // beverages combobox
        panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS));
        beverageList = new JComboBox(beverages);
        beverageList.setEditable(false);
        beverageList.setSelectedIndex(0);
        panel.add(new JLabel("  Beverages:"), BorderLayout.CENTER);
        panel.add(beverageList, BorderLayout.CENTER);
        add(panel);
        // appetizers combobox
        panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS));
        appetizerList = new JComboBox(appetizers);
        appetizerList.setEditable(false);
        appetizerList.setSelectedIndex(0);
        panel.add(new JLabel("  Appetizers:"), BorderLayout.CENTER);
        panel.add(appetizerList, BorderLayout.CENTER);

        // maincourses combobox
        panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS));
        maincourseList = new JComboBox(maincourses);
        maincourseList.setEditable(false);
        maincourseList.setSelectedIndex(0);
        panel.add(new JLabel(" Main courses:"), BorderLayout.CENTER);
        panel.add(maincourseList, BorderLayout.CENTER);
        add(panel);
        // desserts combox
        panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS));

        dessertList = new JComboBox(desserts);
        dessertList.setEditable(false);
        dessertList.setSelectedIndex(0);
        panel.add(new JLabel("  Desserts:"), BorderLayout.CENTER);
        panel.add(dessertList, BorderLayout.CENTER);
        add(panel);
        // listbox
        model = new DefaultListModel();
        JPanel listPanel = new JPanel();
        list = new JList(model);
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        list.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));



        // list box continued
        JScrollPane listPane = new JScrollPane();
        listPane.getViewport().add(list);
        listPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
        listPanel.add(listPane);
        add(listPanel);

        // total label
        panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS));
        totallabel = new JLabel(setTotalLabelAmount());
        panel.add((totallabel), BorderLayout.SOUTH);
        totallabel.setVisible(false);
        add(panel);

        panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS));
        // sets up listbox buttons
        panel.add(new JButton("Delete"), BorderLayout.SOUTH);
        panel.add(new JButton("Clear All"), BorderLayout.SOUTH);
        add(panel);

        // sets up restaurant logo
//        restaurantLogo = new JLabel();
//        restaurantLogo.setFont(restaurantLogo.getFont().deriveFont(Font.ITALIC));
//        restaurantLogo.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0));
//       restaurantLogo.setPreferredSize(new Dimension(123, 200 + 10));
//        ImageIcon icon = createImageIcon("images/appletree.gif");
//        restaurantLogo.setIcon(icon);
//        restaurantLogo.setText("Charlotte's Apple Tree Restaurant");
//        add((restaurantLogo), BorderLayout.NORTH);

        // sets up the label next to textfield for table number

        panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS));
        table = new JLabel("     Enter Table Number (1-10):");


        /**
         * @throws InputMismatchException if the textfield entry is not an integer
         *
         */
        // sets up textfield next to table lable
        textTableNum = new JTextField();
        table.setLabelFor(textTableNum);
        panel.add((table), BorderLayout.NORTH);
        panel.add(textTableNum, BorderLayout.NORTH);
        add(panel);

        // sets up label for waiter name
        panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS));
        waiter = new JLabel("      Enter Waiter Name: ");
        waiterName = new JTextField();
        // sets up textfield next to waiter lable
        waiter.setLabelFor(waiterName);
        panel.add((waiter), BorderLayout.NORTH);
        panel.add(waiterName, BorderLayout.NORTH);
        add(panel);

        // listens to the textfields
        textTableNum.addActionListener(this);
        waiterName.addActionListener(this);


        // sets up textarea
        textArea = new JTextArea(5, 10);
        textArea.setEditable(false);
        JScrollPane scrollPane = new JScrollPane(textArea);


        // lays out listpanel
//        listPanel.setLayout(new GridBagLayout());

//        GridBagConstraints c = new GridBagConstraints();

//        c.gridwidth = GridBagConstraints.REMAINDER;

//        c.fill = GridBagConstraints.HORIZONTAL;
//        add(listPane, c);
//        add(listPane, null);

//        c.fill = GridBagConstraints.BOTH;

//        c.weightx = 1.0;

//        c.weighty = 1.0;

//        add(scrollPane, c);
        add(scrollPane, null);

        scrollPane.setVisible(true);


    }

    private double getPrices(String item) {
        // create hashmap to store menu items with their corresponding prices

        HashMap<String, Double> hm = new HashMap<String, Double>();

        // put elements to the map
        hm.put("Soda", new Double(1.95));
        hm.put("Tea", new Double(1.50));
        hm.put("Coffee", new Double(1.25));
        hm.put("Mineral Water", new Double(2.95));
        hm.put("Juice", new Double(2.50));
        hm.put("Milk", new Double(1.50));
        hm.put("Buffalo Wings", new Double(5.95));
        hm.put("Buffalo Fingers", new Double(6.95));
        hm.put("Potato Skins", new Double(8.95));
        hm.put("Nachos", new Double(8.95));
        hm.put("Mushroom Caps", new Double(10.95));
        hm.put("Shrimp Cocktail", new Double(12.95));
        hm.put("Chips and Salsa", new Double(6.95));
        hm.put("Seafood Alfredo", new Double(15.95));
        hm.put("Chicken Alfredo", new Double(13.95));
        hm.put("Chicken Picatta", new Double(13.95));
        hm.put("Turkey Club", new Double(11.95));
        hm.put("Lobster Pie", new Double(19.95));
        hm.put("Prime Rib", new Double(20.95));
        hm.put("Shrimp Scampi", new Double(18.95));
        hm.put("Turkey Dinner", new Double(13.95));
        hm.put("Stuffed Chicken", new Double(14.95));
        hm.put("Apple Pie", new Double(5.95));
        hm.put("Sundae", new Double(3.95));
        hm.put("Carrot Cake", new Double(5.95));
        hm.put("Mud Pie", new Double(4.95));
        hm.put("Apple Crisp", new Double(5.95));

        double price = hm.get(item);
        return price;
    }

    /**
     * validates that the correct path for the image was found to prevent crash
     *
     * @param path is the icon path of the restaurant logo
     *
     * @return nothing if you can't find the image file
     *
     * @return imageIcon(imgURL) the path to image if you can find it
     */
    protected static ImageIcon createImageIcon(String path) {
        java.net.URL imgURL = CalculateBill.class.getResource(path);
        if (imgURL != null) {
            return new ImageIcon(imgURL);
        } else {
            JOptionPane.showMessageDialog(null, "Couldn't find file: " + path, "image path error", JOptionPane.ERROR_MESSAGE);
            return null;
        }

    }

    //Listens to the combo boxes
    private void getSelectedMenuItem(JComboBox cb) {
        String mnItem = (String) cb.getSelectedItem();
        updateListBox(mnItem);

    }

    /**
     * updates the list box
     *
     * @param name the element to be added to the list box
     */
    private void updateListBox(String name) {
        totallabel.setVisible(false);
        model.addElement(name);
        Addition(getPrices(name));
        totallabel.setVisible(true);
    }

    void showWaiterAndTableNum() {
        textArea.append("Table Number: " + tn + " Waiter: " + wn);
        textArea.setCaretPosition(textArea.getDocument().getLength());
    }

    /**
     * adds to the subtotal/total calculator.
     *
     * @param s The name of the menu item which will be used to access its hashmap key value.
     *
     */
    private void Addition(double addedP) {

        subtotal = subtotal + addedP;

        tax = .0625 * subtotal;

        total = subtotal + tax;



    }

    /**
     * subtracts from to the subtotal/total calculator.
     *
     * @param subtractedp The price of the menu item which will be used to access its hashmap key value.
     *
     */
    // sets up the 'total' label which shows subtotal, tax, total
    private void Subtraction(double subtractedp) {

        subtotal = subtotal - subtractedp;

        tax = subtotal * .0625;
        total = subtotal + tax;



    }

    private void resetCalculator() {
        subtotal = 0.00;
        tax = 0.00;
        total = 0.00;



    }

    // listens to list buttons
    @Override
    public void actionPerformed(ActionEvent e) {
        JTextField tf = (JTextField) e.getSource();
        if (tf.equals("textTableNum")) {
            tn = tf.getText();
        } else if (tf.equals("waiterName")) {
            wn = tf.getText();
        }


        String cmd = e.getActionCommand();
        if (cmd.equals("Delete")) {
            totallabel.setVisible(false);
            ListSelectionModel selmodel = list.getSelectionModel();
            int index = selmodel.getMinSelectionIndex();
            String foodName = (String) list.getSelectedValue();
            Subtraction(getPrices(foodName));
            totallabel.setVisible(true);
            //subtracts from the subtotal
            if (index >= 0) {
                model.remove(index);
            }
        } else if (cmd.equals("Clear all")) {
            model.clear();
            resetCalculator();

        }
    }

    //combobox mouse listener
    public void mouseClicked(MouseEvent e) {
        if (e.getClickCount() == 2) {
            JComboBox cb = (JComboBox) e.getSource();
            getSelectedMenuItem(cb);
        }
    }

    private String setTotalLabelAmount() {
        String totlab = "Subtotal: $ " + subtotal + " Tax: $" + tax + "\n" + "Total: $ " + total;
        return totlab;
    }
}

这不是任何东西的代表性代码。它的唯一功能是它至少可以显示您正在寻找的东西。

另请注意,我注释掉了所有 Logo 代码,因为我没有图像文件 - 为了方便起见,我只是在该部分上加注。

它的作用是创建一个 JPanel 子类。该面板有一个垂直排列的 BoxLayout。通过将多个组件放入同一个插槽,您误解了 BorderLayout 的工作原理。例如,您将“删除”和“清除所有”JButton 都放入 BorderLayout.SOUTH。这意味着它们都占用相同的空间,最后一个在另一个之上,所以看起来只有一个组件。

BoxLayout 有一个 Flow,也就是说,当您向它们添加组件时,组件不会重叠并被添加并扩展空间。基本的 JPanels 布局是一个垂直的 BoxLayout,因此当添加组件时,它们将堆叠并出现在行中。

接下来,Swing 中的一个常见习惯用法,尤其是手工制作的 GUI,是使用 JPanel 作为容器。如果您曾经使用过绘图程序并使用 Group 功能将 4 行变成一个框,那么 Swing 和 layouts 中的 JPanel 的工作方式相同。每个 JPanel 都有自己的布局,然后一旦完成,JPanel 就被视为一个整体。

所以,这里我再次使用了 BoxLayout,只是这次使用了 LINE_AXIS 样式,它将组件首尾相连,排成一行。

您可以看到我创建了几个 JPanel,将布局设置为 BoxLayout,然后将组件添加到每个单独的 JPanel,然后将这些 JPanel 添加到主 JPanel。各个 JPanel 中的组件首尾相连,但是当它们被添加到主 JPanel 时,其 BoxLayout 将它们从上到下堆叠。

请注意,您的 BorderLayout 详细信息的残余部分仍然存在,因为我没有清理它。我会删除所有这些。

这就是我停下来的地方,因为代码编译并显示了 GUI,除了 400 行黑盒“什么都没有发生”代码之外,它至少应该为您提供一些可以使用的东西。它可能看起来不像你想象的那样,那也不是我的目标。我会使用 JPanel 和 sub-JPanel 习语以及布局管理器,直到你更接近你想要的。从 Javadoc for Swing 链接的 Java Swing 教程非常好,虽然有点分散。所以,更多的阅读是在商店里。

正如其他人所提到的,在开始类似的事情时,最好从小处开始(比如让 2 个下拉框开始工作)。然后你只需要关注几件事来让它们发挥作用,然后你就可以在此基础上构建最终项目。

我希望这对您有所帮助。

关于java - 创建一个工作 Java GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8276360/

相关文章:

java - SHA-1 key 生成 ... 访问被拒绝

java - HashMap 与 EnumMap 场景

java - 用户输入图像的 url 并将其显示在 ImageView 中

Java:透明TextArea +绘制背景

c++ - Qt 中的可伸缩图形用户界面

java - 带有对象通配符的通用数组列表

java - 平台碰撞和跳跃的奇怪行为

Java Swing - 如何更新 GUI 对象,即。来自同一包中子类的 JTextField 值

Java GUI 更好地删除或 setVisible(false)?

android - Android中带有标题的边框