0

我正在尝试创建一个 gui 程序,其中 JButtons 在一个循环中,并且它们随着每次迭代而改变。我在实现这一点时遇到了困难,我不明白为什么,它似乎不应该是一个问题,但无论我尝试什么,我的“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

考虑创建一个字段来保存您希望按钮反映的任何状态的值,在按钮按下时更改此字段,然后使用此字段更改按钮的文本。例如:

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 回答
1

下面的代码是处理按钮按下事件的方法。

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

然而,这是一个位于类构造函数内部的内部类。在这种情况下,当在内部类中使用在构造函数或内部方法中初始化的局部变量时,必须将变量声明为 final。但是,您不能将其声明为 final,因为您想增加它。

无论如何,在actionPerformed方法内增加它是错误的。正如我之前所说,该代码在按下按钮时执行。

于 2012-08-30T16:31:35.690 回答