我是一个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/