2015-05-09 143 views
-5

該程序將啓動,但隨即立即退出。另外,我不太確定是否允許將多個面板添加到擴展JFrame的類中。Swing程序啓動後立即退出

import javax.swing.*; 
import java.awt.event.*; 
import java.awt.*; 

public class TravelExpensesCaskey extends JFrame 
{ 
    private double tripDays; 
    private double airfareCost; 
    private double carRentalFees; 
    private double numMiles; 
    private double parkingFees; 
    private double taxiCharges; 
    private double registrationFees; 
    private double lodgingCost; 

    private final double FOOD_$_PER_DAY = 37.00; 
    private final double PARKING_$_PER_DAY = 10.00; 
    private final double TAXI_$_PER_DAY = 20.00; 
    private final double LODGING_$_PER_DAY = 95.00; 
    private final double $_PER_MILE = 0.27; 

    private JPanel inputPanel; 
    private JPanel messageBar; 
    private JPanel panel; 
    private JPanel calculateBar; 
    private JButton calcButton; 
    private final int WINDOW_HEIGHT = 400; 
    private final int WINDOW_WIDTH = 200; 

    private JTextField field2; 
    private JTextField field3; 
    private JTextField field4; 
    private JTextField field5; 
    private JTextField field6; 
    private JTextField field7; 
    private JTextField field8; 
    private JTextField field9; 

    private double totalExpenditures; 
    private double totalAllowance; 
    private double totalBalance; 
    private double totalStipend; 

    public TravelExpensesCaskey() 
    { 
     setTitle("Travel Expenses"); 
     setSize(WINDOW_WIDTH, WINDOW_HEIGHT); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JLabel label1 = new JLabel("Please input the following information about your trip. Enter 0 for any irrelavent values."); 
     messageBar = new JPanel(); 
     messageBar.add(label1); 
     add(messageBar); 

     inputPanel.setLayout(new GridLayout(9,2)); 
     inputPanel = buildPanel(); 
     add(inputPanel); 

     calculateBar = buildCalculateBar(); 
     add(calculateBar); 

     setVisible(true); 

     JOptionPane.showMessageDialog(null, "The total expenses incurred by the business person: " + totalExpenditures + "." + 
       "\nThe total allowance for the business person: " + totalAllowance + "." + 
       "\nThe total balance that must be paid for by the business person: " + totalBalance + "." + 
       "\nThe total stipend available to the business person: " + totalStipend + "."); 

    } 

    private JPanel buildPanel() 
    { 
     JLabel label2 = new JLabel("Number of Days: "); 
     JLabel label3 = new JLabel("Airfare Charges: :"); 
     JLabel label4 = new JLabel("Car Rental Fees: "); 
     JLabel label5 = new JLabel("Number of Miles Driven: "); 
     JLabel label6 = new JLabel("Amount of Parking Fees: "); 
     JLabel label7 = new JLabel("Amount of Taxi Charges: "); 
     JLabel label8 = new JLabel("Conference/Seminar Registration Fees: "); 
     JLabel label9 = new JLabel("Lodging Charges per Night: "); 

     JPanel panel2 = new JPanel(); 
     JPanel panel3 = new JPanel(); 
     JPanel panel4 = new JPanel(); 
     JPanel panel5 = new JPanel(); 
     JPanel panel6 = new JPanel(); 
     JPanel panel7 = new JPanel(); 
     JPanel panel8 = new JPanel(); 
     JPanel panel9 = new JPanel(); 

     panel2.add(label2); 
     panel3.add(label3); 
     panel4.add(label4); 
     panel5.add(label5); 
     panel6.add(label6); 
     panel7.add(label7); 
     panel8.add(label8); 
     panel9.add(label9); 

     JTextField field2 = new JTextField(10); 
     JTextField field3 = new JTextField(10); 
     JTextField field4 = new JTextField(10); 
     JTextField field5 = new JTextField(10); 
     JTextField field6 = new JTextField(10); 
     JTextField field7 = new JTextField(10); 
     JTextField field8 = new JTextField(10); 
     JTextField field9 = new JTextField(10); 

     panel.add(panel2); 
     panel.add(field2); 
     panel.add(panel3); 
     panel.add(field3); 
     panel.add(panel4); 
     panel.add(field4); 
     panel.add(panel5); 
     panel.add(field5);  
     panel.add(panel6); 
     panel.add(field6); 
     panel.add(panel7); 
     panel.add(field7); 
     panel.add(panel8); 
     panel.add(field8); 
     panel.add(panel9); 
     panel.add(field9); 

     return panel; 
    } 

    private JPanel buildCalculateBar() 
    { 
     JPanel panel = new JPanel(); 
     calcButton = new JButton("Calculate"); 
     calcButton.addActionListener(new ButtonListener()); 
     panel.add(calcButton); 
     return panel; 
    } 

    private class ButtonListener implements ActionListener 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
      String userText = ""; 

      userText = field2.getText(); 
      tripDays = Integer.parseInt(userText); 

      userText = field3.getText(); 
      airfareCost = Integer.parseInt(userText); 

      userText = field4.getText(); 
      carRentalFees = Integer.parseInt(userText); 

      userText = field5.getText(); 
      numMiles = Integer.parseInt(userText); 

      userText = field6.getText(); 
      parkingFees = Integer.parseInt(userText); 

      userText = field7.getText(); 
      taxiCharges = Integer.parseInt(userText); 

      userText = field8.getText(); 
      registrationFees = Integer.parseInt(userText); 

      userText = field9.getText(); 
      lodgingCost = Integer.parseInt(userText); 

      calcCharges(); 
     } 
    } 

    private void calcCharges() 
    { 
     totalExpenditures = (tripDays * lodgingCost) + parkingFees + airfareCost + carRentalFees + taxiCharges + registrationFees; 

     totalAllowance = (tripDays * FOOD_$_PER_DAY) + (tripDays + PARKING_$_PER_DAY) + (tripDays * TAXI_$_PER_DAY) 
          + (tripDays * LODGING_$_PER_DAY) + (numMiles * $_PER_MILE); 

     if ((totalExpenditures - totalAllowance) < 0) 
     { 
      totalStipend = Math.abs(totalExpenditures - totalAllowance); 
      totalBalance = 0; 
     } 
     else if ((totalExpenditures - totalAllowance) > 0) 
     { 
      totalBalance = totalExpenditures - totalAllowance; 
      totalStipend = 0; 
     }   
    } 

    public static void main(String[] args) 
    { 
     new TravelExpensesCaskey(); 
    } 
} 
+0

你在控制檯上得到任何輸出嗎? – camickr

回答

2

您的程序會丟失多個NullPointerExceptions。您將許多對象聲明爲類字段,然後從不初始化它們。您需要添加至少:

  • 在構造inputPanel = new JPanel();
  • 在buildPanel
  • panel = new JPanel();();

,並在所有你JTextFields的情況下,變:

JTextField field = new JTextField(); 

到:

field = new JTextField(); 

但也僅僅是開始,因爲你的GUI不顯示大部分組成。您需要選擇LayoutManager,並使用它。您將所有面板添加到幀的中心,並且我認爲它們重疊。因此,例如,看你JTextFieldsJLabelJButton,你可以在構造改變add(component);爲:

add(BorderLayout.NORTH, messageBar); 
    add(BorderLayout.CENTER, inputPanel); 
    add(BorderLayout.SOUTH,calculateBar); 

還補充:

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

buildPanel()方法,它會更好看。 更重要的是,您需要將JOptionPane的代碼移動到calcCharges()方法的末尾,這樣才能訪問已處理的日期,並顯示正確的輸出。在應用程序開始時,它只顯示零。

+0

非常感謝!所有建議的更改都是正確的,現在我的程序運行良好。謝謝! –

+0

嗨@HunterCaskey如果此答案已解決您的問題,請點擊該複選標記,考慮[接受它](http://meta.stackexchange.com/q/5234/179419)。這給回答者和你自己都帶來了一些聲譽。但是,現在沒有義務這樣做。 –

相關問題