所以目前我自学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);
}
});
}
}
答案 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)
我建议你阅读实例和类(静态)变量之间的区别。
contents
是main
的实例变量,这意味着您只能在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");
}
}
});