0

JButtonがループ内にあり、反復ごとに変化するGUIプログラムを作成しようとしています。これを達成するのに問題があり、理由がわかりません。問題はないようですが、何を試しても、「q」変数は決して増加しません...

場合によっては、すべてのエラーを取り除くことができましたが、do-whileループが実行されません。以下の例では、次のエラーが発生します:「別のメソッドで定義された内部クラス内の非最終変数qを参照できません」。

私はかなり前からこれを理解しようとしてきました、そして私はどんなアドバイスにも感謝します。

前もって感謝します。

これが私のコードです(私のq変数に注意してください):

public class MyClass extends JFrame{
        private JTextField item1;
        private JTextField item2;
        private JTextField item3;
        private JTextField item4;
        private JTextField item5;
        private JButton button1 = new JButton("Process Item #1");
        private JButton button2 = new JButton("Confirm Item #1");
        private JButton button3 = new JButton("View Order");
        private JButton button4 = new JButton("Finish Order");
        private JButton button5 = new JButton("New Order");
        private JButton button6 = new JButton("Exit");
        private Scanner x;
        private int exitFlag = 0;
        public String[] idArray = new String[10];
        public String[] recordArray = new String[10];
        public String[] priceArray = new String[10];

        public void openFile(){
            try{
                x = new Scanner(new File("inventory.txt"));
                x.useDelimiter(",|" + System.getProperty("line.separator")); 
            }
            catch(Exception e){
                System.out.println("Could not find file");
            }
        }
        public void readFile(){
            int i=0;
            while(x.hasNext()){
                idArray[i] = x.next();
                recordArray[i] = x.next();
                priceArray[i] = x.next();
                i++;
            }
        }
        public MyClass(){
            super("Matt's World of Music");
            setLayout(new FlowLayout());
            Box itemBox = Box.createVerticalBox();
            Box itemBox2 = Box.createHorizontalBox(); 

            JLabel label1 = new JLabel("Enter number of items in this order:");
            JLabel label2 = new JLabel("Enter CD ID for Item #1:");
            JLabel label3 = new JLabel("Enter quantity for Item #1:");
            JLabel label4 = new JLabel("Item #1 info:");
            JLabel label5 = new JLabel("Order subtotal for 0 item(s):");

            item1 = new JTextField(10);
            item2 = new JTextField(10);
            item3 = new JTextField(10);
            item4 = new JTextField(10);
            item5 = new JTextField(10);

            itemBox.add(label1);
            itemBox.add(item1);
            itemBox.add(label2);
            itemBox.add(item2);
            itemBox.add(label3);
            itemBox.add(item3);
            itemBox.add(label4);
            itemBox.add(item4);
            itemBox.add(label5);
            itemBox.add(item5);
            itemBox2.add(button1);
            itemBox2.add(button2);
            itemBox2.add(button3);
            itemBox2.add(button4);
            itemBox2.add(button5);
            itemBox2.add(button6);
            itemBox.add(itemBox2);
            add(itemBox);
            button2.setEnabled(false);
            button3.setEnabled(false);
            button4.setEnabled(false);
            item4.setEditable(false);
            item5.setEditable(false);

            //*** NOTE Q VARIABLE ****//
            int q=0;


            do{
                //Process Item

                button1.addActionListener(new ActionListener(){
                   public void actionPerformed(ActionEvent e){
                      String y = item1.getText();
                      MyClass obj = new MyClass();
                      button1.setEnabled(false);
                      button2.setEnabled(true);

                      obj.openFile();
                      obj.readFile();


                      //start loop
                      for(int i=0; i < obj.idArray.length; i++){
                          if(item2.getText().equals(obj.idArray[i])==true){
                              //set item4 text field to price id and other details
                              item4.setText(obj.idArray[i] + " " + obj.recordArray[i] + " $" + obj.priceArray[i].replaceAll("\\s",""));

                              //add to cart

                          }
                       }
                      //*** NOTE Q VARIABLE ****//
                      q++;

                    }
                });
                //Confirm Item
                button2.addActionListener(new ActionListener(){
                    public void actionPerformed(ActionEvent e){
                        //Execute when button is pressed
                        JOptionPane.showMessageDialog(null, "Item #1 Accepted");
                    }
                });
                //View Order
                button3.addActionListener(new ActionListener(){
                    public void actionPerformed(ActionEvent e){
                        //Execute when button is pressed
                        System.out.println("View Order");
                    }
                });
                //Finish Order
                button4.addActionListener(new ActionListener(){
                    public void actionPerformed(ActionEvent e){
                        //Execute when button is pressed
                        System.out.println("Finish Order");
                    }
                });
                //New Order
                button5.addActionListener(new ActionListener(){
                   public void actionPerformed(ActionEvent e){
                       //Execute when button is pressed
                       System.out.println("New Order");
                   }
                });
                //Quit
                button6.addActionListener(new ActionListener(){
                   public void actionPerformed(ActionEvent e){

                       //exit program

                   }
                });
            }while(q < Integer.parseInt(item1.getText()));
        }      
}
4

2 に答える 2

1

以下のコードは、ボタン押下イベントを処理する方法です。

button1.addActionListener(new ActionListener(){
  public void actionPerformed(ActionEvent e){
    ...
  }
});

ただし、これはクラスコンストラクター内にある内部クラスです。このような場合、内部クラスでコンストラクターまたは内部メソッド内で初期化されたローカル変数を使用するときは、変数をfinalとして宣言する必要があります。ただし、インクリメントしたいので、finalと宣言することはできません。

とにかく、actionPerformedメソッド内でそれをインクリメントするのは間違っています。前に言ったように、そのコードはボタンが押されたときに実行されます。

于 2012-08-30T16:31:35.690 に答える
1

ボタンに反映させたい状態の値を保持するフィールドを作成し、ボタンを押したときにこのフィールドを変更してから、このフィールドでボタンのテキストを変更することを検討してください。例えば:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class ChangeButton extends JPanel {
   private int buttonCount = 1;
   private JButton button = new JButton();

   public ChangeButton() {
      add(button);
      button.setText(makeButtonText());

      button.addActionListener(new ActionListener() {

         @Override
         public void actionPerformed(ActionEvent evt) {
            JButton btn = (JButton) evt.getSource();
            btn.setText(makeButtonText());
         }
      });
   }

   private String makeButtonText() {
      String buttonText = "Process number " + buttonCount;
      buttonCount++;
      return buttonText;
   }

   private static void createAndShowGui() {
      ChangeButton mainPanel = new ChangeButton();

      JFrame frame = new JFrame("ChangeButton");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

または、ActionListener自体の内部にフィールドを保持することもできます。

  button2.setAction(new AbstractAction("Process item 1") {
     private int button2Count = 2;

     @Override
     public void actionPerformed(ActionEvent evt) {
        JButton btn = (JButton) evt.getSource();
        btn.setText(makeButton2Text());
     }

     private String makeButton2Text() {
        String button2Text = "Process item " + button2Count;
        button2Count++;
        return button2Text;
     }


  });
于 2012-08-30T16:41:29.030 に答える