Here我找到了这段代码:
import java.awt.*;
import javax.swing.*;
public class FunWithPanels extends JFrame {
public static void main(String[] args) {
FunWithPanels frame = new FunWithPanels();
frame.doSomething();
}
void doSomething() {
Container c = getContentPane();
JPanel p1 = new JPanel();
p1.setLayout(new BorderLayout());
p1.add(new JButton("A"), BorderLayout.NORTH);
p1.add(new JButton("B"), BorderLayout.WEST);
JPanel p2 = new JPanel();
p2.setLayout(new GridLayout(3, 2));
p2.add(new JButton("F"));
p2.add(new JButton("G"));
p2.add(new JButton("H"));
p2.add(new JButton("I"));
p2.add(new JButton("J"));
p2.add(new JButton("K"));
JPanel p3 = new JPanel();
p3.setLayout(new BoxLayout(p3, BoxLayout.Y_AXIS));
p3.add(new JButton("L"));
p3.add(new JButton("M"));
p3.add(new JButton("N"));
p3.add(new JButton("O"));
p3.add(new JButton("P"));
c.setLayout(new BorderLayout());
c.add(p1, BorderLayout.CENTER);
c.add(p2, BorderLayout.SOUTH);
c.add(p3, BorderLayout.EAST);
pack();
setVisible(true);
}
}
我不明白“doSomething”如何使用“frame”是JFrame类的一个实例。我不清楚,因为在“doSomething”方法的代码中没有引用“this”。
增加:
也许这是相关的。在这段代码中:
import java.awt.*;
import java.applet.Applet;
public class ButtonGrid extends Applet {
public void init() {
setLayout(new GridLayout(3,2));
add(new Button("1"));
add(new Button("2"));
add(new Button("3"));
add(new Button("4"));
add(new Button("5"));
add(new Button("6"));
}
}
在“init”方法中,我们使用方法“setLayout”和“add”,我们不将它们绑定到特定对象(例如objectName.setLayout(...)
)。那是为什么?
答案 0 :(得分:3)
虽然未使用this
,但该方法经常使用JFrame方法,特别是在获取内容窗格的方法的第一行Container c = getContentPane();
使用this
关键字可以使示例更加清晰,但您不需要它。
该示例可以重写为:
import java.awt.*;
import javax.swing.*;
public class FunWithPanels extends JFrame {
public static void main(String[] args) {
FunWithPanels frame = new FunWithPanels();
frame.doSomething();
}
void doSomething() {
Container c = this.getContentPane();
// .. snip unaltered code
this.pack();
this.setVisible(true);
}
}
这完全等效。
答案 1 :(得分:2)
这是因为this
隐含在编译器的搜索路径中。编译器将按以下顺序查找变量:
this
)答案 2 :(得分:1)
如果我没有误解某些事情,答案是微不足道的:
编译器不需要this.
限定符来检测何时使用该类的成员。显式使用this.
的唯一需要是存在名称冲突,例如
public MyClass {
private Foo foo;
MyClass(Foo foo) {
this.foo = foo;
}
}
更新:显然我确实误解了这个问题......虽然我显然并不孤单。
无论如何,doSomething()
调用getContentPane()
JFrame
的方法,以及来自pack()
父类的setVisible()
和JFrame
, Window
。但是,这本身并不会使FunWithPanels
扩展JFrame
,因为所有这些方法都是公开的,任何人都可以访问。
我相信作者认为FunWithPanels
是JFrame
的一种特殊类型,这就是它成为子类的原因。这种方式FunWithPanels
可以在需要通用JFrame
的任何地方使用。有关详细说明,请参阅Liskov Substitution Principle。 (注意:这可能是也可能不是良好的课堂设计,但在不了解背景的情况下我不能说太多。)
答案 3 :(得分:1)
我不明白“doSomething”是怎么回事 使用“框架”是一个事实 JFrame类的实例
因为FunWithPanels extends JFrame
,您在FunWithPanels中定义的每个方法都将在FunWithPanels的实例上调用。
答案 4 :(得分:1)
此行中隐含使用this
:
Container c = getContentPane();
getContentPane()
相当于this.getContentPane()
。