【问题标题】:Modifying Variables with the Inner Class (Java)使用内部类修改变量 (Java)
【发布时间】:2015-07-20 05:06:18
【问题描述】:

所以目前我正在自学 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);
            }
        });
    }
}

【问题讨论】:

  • 只是变量contentsinitUI方法的局部变量,所以你只需要在使用前声明为final即可。\
  • 避免使用null 布局,像素完美的布局是现代用户界面设计中的一种错觉。影响组件单个尺寸的因素太多,您无法控制。 Swing 旨在与核心布局管理器一起工作,丢弃这些将导致无穷无尽的问题和问题,您将花费越来越多的时间来尝试纠正
  • 您是否尝试过使用area.append("some new text");
  • @nIcEcOw final 将意味着 OP 无法为变量分配新值...
  • contents = "Pressed"; -> area.setText("Pressed");

标签: java swing class variables calculator


【解决方案1】:
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 本地内部类中使用 final 变量。或者声明一个 final 变量并为 Text 和 Button 使用相同的名称,这是您不想要的。 所以如果你在外面定义一个普通的String,你可以正常的将它用于Text Field,但是你不能在方法本地内部类中。 如果你在外部定义了一个 final 变量,只需将它添加到方法本地内部类中,但不要尝试再次更改它,因为它是 Final。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      您可以通过直接从ActionEvent 访问JButton 来解决您的问题:

      addButton.addActionListener(new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent event) {
              Component comp = (Component) event.getSource();
              if (comp instanceof JButton) {
                  ((JButton)comp).setText("Pressed");
              }       
          }
      });
      

      【讨论】:

        猜你喜欢
        • 2014-10-12
        • 2015-02-25
        • 1970-01-01
        • 2014-05-19
        • 2016-04-17
        • 2020-04-07
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        相关资源
        最近更新 更多