我的代码:
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.*;
public class TAFrame {
private JFrame mainFrame;
private JPanel mainPanel;
private JButton button;
private JTextArea textArea; //eclipse say Syntax error } expected
mainFrame = new JFrame("mainFrame");
mainPanel = new JPanel();
button = new JButton("click me");
area = new JTextArea(10, 15);
}
无法找到解决方案,但我认为这很容易让人感到尴尬:/
答案 0 :(得分:5)
我相信你想把一些代码放在构造函数中,如下所示:
public class TAFrame {
private JFrame mainFrame;
private JPanel mainPanel;
private JButton button;
private JTextArea textArea;
public TAFrame() {
mainFrame = new JFrame("mainFrame");
mainPanel = new JPanel();
button = new JButton("click me");
area = new JTextArea(10, 15);
}
}
问题是你试图在任何方法之外执行任意代码。声明字段后,您需要通过方法访问它。只能在同一行上初始化它,因此您可以执行以下操作:
public class TAFrame {
private JFrame mainFrame = new JFrame("mainFrame");
private JPanel mainPanel = new JPanel();
private JButton button = new JButton("click me");
private JTextArea textArea = new JTextArea(10, 15);
}
在这种情况下,我建议使用构造函数方法,但无论如何,您最需要一个构造函数,因为您可能想要向该按钮添加一个actionlistener(例如)。
答案 1 :(得分:3)
这里的大多数答案都正确地指出您可以使用初始值进行初始化,并且可以使用构造函数。但是,Java教程Initializing Fields实际上描述了两个非构造函数初始化字段的方法:(i)初始值; (ii)初始化块。
以下代码演示了所有三种方法(并显示了实例和静态初始化块):
public class InitializationExample {
private int field1 = 1; // in-line initializer
private int field2a;
private static int field2b;
private int field3;
{
field2a = 3; // instance initializer
}
static {
field2b = 3; // static initializer
}
public InitializationExample( final int field3 ) {
this.field3 = field3;
}
}
使用初始化块,您可以对代码进行非常小的更改并进行编译:
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.*;
public class TAFrame {
private JFrame mainFrame;
private JPanel mainPanel;
private JButton button;
private JTextArea textArea;
{
mainFrame = new JFrame("mainFrame");
mainPanel = new JPanel();
button = new JButton("click me");
area = new JTextArea(10, 15);
}
}
即使这是可能的,但它并不是非常常见,所以除非你有一些特别好的理由使用它,或者它已经在你正在使用的代码库中很常见,初始值或构造函数可能更多可读和可维护的选项。同样重要的是要注意,根据Java语言规范中的12.5. Creation of New Class Instances,实例初始化代码(和初始值)在构造函数代码运行之前被处理。
与基于构造函数的方法相比,初始化块方法有一个可能的好处。如果你确实把它变成了构造函数,那就是
public TAFrame() {
mainFrame = new JFrame("mainFrame");
mainPanel = new JPanel();
button = new JButton("click me");
area = new JTextArea(10, 15);
}
然后引入另一个构造函数以后需要一些参数,你需要从该构造函数显式调用零参数构造函数(构造函数链接),或者在该构造函数中包含初始化赋值,太。使用初始化块,您不需要这样做。
当您创建匿名子类的实例时,初始化块也很方便,因为您可以将初始化代码视觉保持在类“内部”。您可以阅读double brace initialization了解更多详情,但这是一个简单的例子:
import java.util.HashMap;
import java.util.Map;
public class MapInitializationExample {
public static void main(String[] args) {
// initialization code for this Map is visually "inside" the map
final Map<Integer,String> numberNames = new HashMap<Integer,String>() {{
put(1,"one");
put(2,"two");
put(3,"three");
}};
}
}
答案 2 :(得分:1)
因为您将代码置于不属于的方法之外。
特别是这个块:
mainFrame = new JFrame("mainFrame");
mainPanel = new JPanel();
button = new JButton("click me");
area = new JTextArea(10, 15);
错误有点欺骗,因为看起来private JTextArea textArea;
需要一个右大括号。但实际上,问题是下一个行不属于那里。下一行mainFrame = new JFrame("mainFrame");
表示方法已经开始,前一个块从未关闭,因此引用了一个缺失的}。
您有两种选择:
实例化内嵌
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.*;
public class TAFrame {
private JFrame mainFrame = new JFrame("mainFrame");
private JPanel mainPanel = new JPanel();
private JButton button = new JButton("click me");
private JTextArea textArea = new JTextArea(10, 15);
}
使用构造函数实例化
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.*;
public class TAFrame {
private JFrame mainFrame;
private JPanel mainPanel;
private JButton button;
private JTextArea textArea;
public TAFrame() {
mainFrame = new JFrame("mainFrame");
mainPanel = new JPanel();
button = new JButton("click me");
area = new JTextArea(10, 15);
}
}
我个人更喜欢内联方法,因为它不那么详细。
答案 3 :(得分:0)
你应该这样做。
public class TAFrame {
private JFrame mainFrame;
private JPanel mainPanel;
private JButton button;
private JTextArea textArea;
public void initComponents() {
mainFrame = new JFrame("mainFrame");
mainPanel = new JPanel();
button = new JButton("click me");
area = new JTextArea(10, 15);
}
}
或者您可以在那里创建和实例化控件。
private JFrame mainFrame = new JFrame("mainFrame");
private JPanel mainPanel = new JPanel();
private JButton button = new JButton("click me");
private JTextArea textArea = new JTextArea(10, 15);