有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用户界面Java basic GUI程序错误

在我的在线Java类中,我需要编写一个程序,计算一帧内鼠标单击按钮的次数。这是我的密码:

import java.awt.*;
import java.awt.event.*;

public class option1 extends Frame {
    option1() {
        setTitle("Final Project Option 1");
        setSize(300,300);
        show();
    }
    public static void main(String[] args) {
        option1 test = new option1();

        int a = 0;
        String s1 = "" + a;

        Frame objFrame;
        Button objButton1;
        Label objLabel1;

        objFrame = new option1();
        objButton1 = new Button("Button");
        objLabel1 = new Label();

        objLabel1.setBounds(150,220,50,30);
        objButton1.setBounds(40,35,50,50);

        objLabel1.setText(s1);

        objButton1.addMouseListener(new MyMouseListener()); //line 29

        objFrame.add(objLabel1);
        objFrame.add(objButton1);
    }
    public class MyMouseListener extends MouseAdapter {
        public void mouseClicked(MouseEvent me) {
            a++; //line 36
        }
    }
}

编译时,我得到两个错误。一个错误出现在第29行,这是“非静态变量,无法从静态上下文引用”,另一个错误出现在第36行,这是“找不到符号”

那么,我到底做错了什么?我希望响应者能准确地告诉我需要做什么来解决问题,并避免使用技术术语,因为我对编程相当陌生


共 (3) 个答案

  1. # 1 楼答案

    我只是想让你的代码正常工作。但是关于标准Java编码还有一些问题。但是你应该考虑以前关于编码风格的答案。

    import java.awt.*;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.beans.PropertyChangeEvent;
    import java.beans.PropertyChangeListener;
    
    public class Main {
    
    public static void main(String[] args) {
    
        final Frame mainFrame = new OptionOne();
        Button button = new Button("Button");
        final Label label = new Label();
    
        label.setBounds(150, 220, 50, 30);
        label.setText("0");
        button.setBounds(40, 35, 50, 50);
    
        label.addPropertyChangeListener(label.getText(), new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                mainFrame.addNotify();
            }
        });
    
        button.addMouseListener(new MouseListener() {
            @Override
            public void mouseClicked(MouseEvent e) {
                int value = Integer.parseInt(label.getText());
                label.setText(String.valueOf(value + 1));
            }
    
            @Override
            public void mousePressed(MouseEvent e) {
    
            }
    
            @Override
            public void mouseReleased(MouseEvent e) {
    
            }
    
            @Override
            public void mouseEntered(MouseEvent e) {
    
            }
    
            @Override
            public void mouseExited(MouseEvent e) {
    
            }
        });
    
        mainFrame.add(label);
        mainFrame.add(button);
     }
    }
    
    class OptionOne extends Frame {
    
       OptionOne() {
        setTitle("Final Project Option 1");
        setSize(300, 300);
        show();
       }
    }
    
  2. # 2 楼答案

    通常,尽可能快地从main方法进入非静态上下文

    public class option1 extends Frame {
        private int a = 0;
        private Label objLabel1;
        option1() {
            setTitle("Final Project Option 1");
            setSize(300,300);
    
    
            Button objButton1;
    
            objButton1 = new Button("Button");
            objLabel1 = new Label();
    
            objLabel1.setBounds(150,220,50,30);
            objButton1.setBounds(40,35,50,50);
    
            objLabel1.setText(Integer.toString(a));
    
            objButton1.addMouseListener(new MyMouseListener()); //line 29
    
            add(objLabel1);
            add(objButton1);
    
            show();
        }
        public static void main(String[] args) {
            option1 test = new option1();
        }
        public class MyMouseListener extends MouseAdapter {
            public void mouseClicked(MouseEvent me) {
                a++; //line 36
                objLabel1.setText(Integer.toString(a));
            }
        }
    }
    
    • 一般来说,AWT已经过时(大约15年了),您确实应该尝试使用Swing或JavaFX
    • 按钮应该使用ActionListener,因为鼠标不是触发按钮的唯一方式
    • 您可能希望有一个通读Code Conventions for the Java TM Programming Language,它将使人们更容易阅读您的代码,您也更容易阅读其他代码
  3. # 3 楼答案

    我看到两个问题,即您的内部类应该是static(在没有option1实例的情况下使用它,该实例可能应该是Option1,以符合Java命名约定),并且您需要定义和初始化a。差不多

    public static class MyMouseListener extends MouseAdapter {
        int a = 0; //<  add this.
        public void mouseClicked(MouseEvent me) {
            a++; 
        }
    }
    

    另外,我建议您考虑使用更现代的^{}代替旧的^ {CD6>}。

    编辑

    您需要保存对MouseListener类的引用

    MyMouseListener mml = new MyMouseListener();
    objButton1.addMouseListener(mml);
    

    然后你可以像a一样得到它

    System.out.println(mml.a);
    

    最后,您最初的"" + a方法是"0"