1

受講している Java クラス用の GUI 給与計算機を作成しようとしています。要件は、ユーザー入力 (JComboBox を使用するもの) を取得し、週ごとの支払いを計算し、結果を JTable に追加する必要があるというものでした。ユーザーは、他の従業員の計算を続行し、終了ボタンを持つことができる必要があります。メイン クラスで GUI を作成しましたが、2 つの ActionListeners が必要です。1 つは終了するため、もう 1 つは計算して JTable に追加するためです。

私の問題は、計算 ActionListener の作業を開始すると、メイン クラスで設定した変数が認識されないことです。メインクラス名のDOT変数名(PayrollCalc.empName)を使用してそれらを公開しようとしましたが、それらを初期化しましたが、何も機能しないようです。実際の計算が最初に完了するまで、JTable への追加を開始していないため、コードは完全ではありません。誰か提案はありますか?

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

public class PayrollCalc {

    public static void main(String[] args) {

        //Declare variables used
        String empName = null, entDept = null, calcdPay = null;
        String[] empDept = {"Marketing","IT","Accounting","Development","Payroll","Facilities"};
        String columnNames[] = {"Name","Department","Pay Check"};
        String dataValues [][] = {
                {empName,entDept,calcdPay}
        };

        double wrkHours = 0;
        double empRate = 0;
        double wklyPay = 0;

        //Create JTable and scrollPane for output
        JTable table;
        JScrollPane scrollPane;
        table = new JTable (dataValues,columnNames);
        scrollPane = new JScrollPane(table);

        //Create JFrame object with title
        JFrame frame = new JFrame("Employee Payroll Calculator");

        //Create combo box for department choices
        JComboBox combo = new JComboBox(empDept);
        JTextField nameField = new JTextField(15);
        JTextField hourField = new JTextField(10);
        JTextField rateField = new JTextField(10);

        //Create JLables for input fields
        JLabel nameLbl = new JLabel ("Name:");
        JLabel hourLbl = new JLabel ("Hours:");
        JLabel rateLbl = new JLabel ("Rate:");
        JLabel deptLbl = new JLabel ("Department:");

        //Create buttons for ActionListners
        JButton exitButton= new JButton("Exit");
        exitButton.addActionListener(new exitApp());
        exitButton.setSize(5,5);

        JButton calcButton= new JButton("Calculate");
        calcButton.addActionListener(new calcApp());
        calcButton.setSize(5,5);

        //Create panels
        Panel panel1 = new Panel();
        panel1.add(nameLbl);
        panel1.add(nameField);
        panel1.add(deptLbl);
        panel1.add(combo);
        panel1.add(hourLbl);
        panel1.add(hourField);
        panel1.add(rateLbl);
        panel1.add(rateField);
        panel1.add(rateField);

        Panel panel2 = new Panel();
        panel2.add(calcButton);

        Panel panel3 = new Panel();
        panel3.add(calcButton);
        panel3.add(exitButton);

        Panel panel4 = new Panel();
        panel4.add(scrollPane, BorderLayout.CENTER);


        //creates the frame
        frame.setSize(950,200);
        frame.add(panel1,BorderLayout.NORTH);
        frame.add(panel2);
        frame.add(panel3, BorderLayout.SOUTH);
        frame.add(panel4);
        frame.setVisible(true);



    }
    //ActionListner for Exit button
    static class exitApp implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            System.exit(0);
        }
    }
    //ActionListner for Calculate button
    static class calcApp implements ActionListener
    {
        public void actionPerformed(ActionEvent c)
        {
            empName = nameField.getText();
            entDept = combo.getName();
            wrkHours = Double.parseDouble(hourField.getText());
            empRate = Double.parseDouble(rateField.getText());
            wklyPay = wrkHours * empRate;
            calcdPay = new Double(wklyPay).toString();
        }

    }

}
4

2 に答える 2

2

アクセスしようとしている変数ActionListenerローカルであるため、静的クラスには表示main()されません。また、静的な main()内で GUI を初期化すると、以下のコメントからわかるように、あらゆる場所で静的な使用が強制されますが、これは悪い習慣です

したがって、初期化をコンストラクターに移動し、ローカル変数をインスタンスレベルのメンバー フィールドとして移動します。これに伴い、ネストされた静的クラスから、代わりに内部クラスを使用するように切り替える必要があります。

クラスのインスタンスメンバーは、内部 ActionListenerクラスで使用できるようになります。

public class PayrollCalc {

    //Declare variables used
    private String empName = null, entDept = null, calcdPay = null;

    private double wrkHours = 0;
    private double empRate = 0;
    private double wklyPay = 0;

    private JComboBox combo;
    private JTextField nameField;
    private JTextField hourField;
    private JTextField rateField;

    public static void main(String[] args) {
        new PayrollCalc();
    }

    public PayrollCalc() {
        // ...
        combo = new JComboBox(empDept);
        nameField = new JTextField(15);
        hourField = new JTextField(10);
        rateField = new JTextField(10);
        // ...
    }

    // non-static ActionListener inner classes
}
于 2013-07-05T16:14:04.023 に答える