使用内部类修改变量(Java)

时间:2015-07-20 05:06:18

标签: java swing class variables calculator

所以目前我自学Java,我想用Swing编写一个带有小按钮和文本字段的简单计算器。虽然我设法实际创建一个文本字段,其中填充了一个文本变量,但我无法通过按钮更改字段中的文本。我一直收到关于内部类无法更改外部变量的错误。什么是我实现目标的最佳方式,为什么?

先谢谢,代码如下:

查看我的第一个按钮(addButton)的操作位置,以及我测试更改文本字段的能力。

/**
 * Created by Ray on 7/19/2015.
 */

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

public class main extends JFrame {
    double x = 0;
    double y = 0;
    double z = 0;

    public main() {
        initUI();
    }

    private void initUI() {

        setLayout(null);

        JPanel text = new JPanel();
        text.setLayout(new BorderLayout());
        text.setBounds(100, 10, 200, 25);

        JScrollPane pane = new JScrollPane();
        JTextArea area = new JTextArea();

        area.setLineWrap(true);
        area.setWrapStyleWord(true);
        area.setBounds(100, 10, 200, 25);
        pane.getViewport().add(area);
        text.add(pane);
        String contents = "Test";
        area.setText(contents);
        JButton addButton = new JButton("Add");
        addButton.setToolTipText("Addition operation.");
        addButton.setBounds(10, 10, 80, 25);
        addButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                contents = "Pressed";
            }
        });
        JButton subButton = new JButton("Sub");
        subButton.setToolTipText("Subtraction operation.");
        subButton.setBounds(10, 40, 80, 25);
        subButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                System.exit(0);
            }
        });
        JButton mulButton = new JButton("Mul");
        mulButton.setToolTipText("Multiplication operation.");
        mulButton.setBounds(10, 70, 80, 25);
        mulButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                System.exit(0);
            }
        });
        JButton divButton = new JButton("Div");
        divButton.setToolTipText("Division operation.");
        divButton.setBounds(10, 100, 80, 25);
        divButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                System.exit(0);
            }
        });
        add(text);
        add(addButton);
        add(subButton);
        add(mulButton);
        add(divButton);

        setTitle("Simple example");
        setSize(500, 300);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                main ex = new main();
                ex.setVisible(true);
            }
        });
    }
}

3 个答案:

答案 0 :(得分:0)

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

public class HelloWorld extends JFrame {
double x = 0;
double y = 0;
double z = 0;
public HelloWorld() {
    initUI();
}


private void initUI() {

    setLayout(null);

    JPanel text = new JPanel();
    text.setLayout(new BorderLayout());
    text.setBounds(100, 10, 200, 25);

    JScrollPane pane = new JScrollPane();
    JTextArea area = new JTextArea();

    area.setLineWrap(true);
    area.setWrapStyleWord(true);
    area.setBounds(100, 10, 200, 25);
    pane.getViewport().add(area);
    text.add(pane);
    String contents1="Text";
    area.setText(contents1);
    JButton addButton = new JButton("Add");
    addButton.setToolTipText("Addition operation.");
    addButton.setBounds(10, 10, 80, 25);
    addButton.addActionListener(new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent event) {
           final String contents = "Pressed";
        }
    });
    JButton subButton = new JButton("Sub");
    subButton.setToolTipText("Subtraction operation.");
    subButton.setBounds(10, 40, 80, 25);
    subButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent event) {
            System.exit(0);
        }
    });
    JButton mulButton = new JButton("Mul");
    mulButton.setToolTipText("Multiplication operation.");
    mulButton.setBounds(10, 70, 80, 25);
    mulButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent event) {
            System.exit(0);
        }
    });
    JButton divButton = new JButton("Div");
    divButton.setToolTipText("Division operation.");
    divButton.setBounds(10, 100, 80, 25);
    divButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent event) {
            System.exit(0);
        }
    });
    add(text);
    add(addButton);
    add(subButton);
    add(mulButton);
    add(divButton);

    setTitle("Simple example");
    setSize(500, 300);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
}



public static void main(String[] args) {

    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            HelloWorld ex = new HelloWorld();
            ex.setVisible(true);
        }
    });
}
}

你只需要声明两个变量,因为我们只能在Method local inner class中使用final变量。或者声明一个final变量并对Text和Button使用相同的名称,这是你不想要的。 因此,如果您在外部定义普通String,则可以将其用于文本字段,但是您无法在方法本地内部类中使用它。 如果您在外部定义最终变量,只需将其添加到方法本地内部类中,但不要尝试再次更改它,因为它是最终的。

答案 1 :(得分:0)

如果您将变量String contents视为该类的成员,则不会遇到此问题。在代码中,只需将其称为contents即可覆盖它,因此请从String contents = ...方法中删除所有initGui()声明。

public class main extends JFrame {
double x = 0;
double y = 0;
double z = 0;
String contents = "Test";

public main....

答案 2 :(得分:0)

我建议你阅读实例和类(静态)变量之间的区别。

contentsmain的实例变量,这意味着您只能在main的上下文中引用它。在创建新的ActionListener时,您正在创建Anonymous的新ActionListener实例,并尝试从新创建的contents的实例中访问ActionListener而不是main

您可以直接从JButton

访问ActionEvent来解决您的问题
addButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent event) {
        Component comp = (Component) event.getSource();
        if (comp instanceof JButton) {
            ((JButton)comp).setText("Pressed");
        }       
    }
});