请考虑以下示例,请:
import javax.swing.*;
import java.awt.event.*;
public class JavaWindow extends JFrame {
JButton button1;
public static void main(String[]args)
{
new JavaWindow();
// or JavaWindow Mwindow = new JavaWindow(); Question 1
}
public JavaWindow()
{ //setting window parameters etc.
this.setSize(500,500);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("My window");
JPanel thePanel = new JPanel();
button1 = new JButton("Get answer");
ListenForButton lForButton = new ListenForButton();
button1.addActionListener(lForButton);
thePanel.add(button1);
this.add(thePanel);
this.setVisible(true);
}
private class ListenForButton implements ActionListener
{
public void actionPerformed(ActionEvent e) {
if(e.getSource()==button1)
{
JOptionPane.showMessageDialog(JavaWindow.this, "Hello!"); //JavaWindow.this - Question 2
}
}
}
}
问题1:在Internet上的大多数示例中,创建一个对象是
应该是通过这种方式完成的“new JavaWindow();”但是不是吗
等同于在创建/创建对象时创建对象并同时命名它,但替换为“new JavaWindow();”例如“JavaWindow MyWindow = new JavaWindow();” ?
问题2:请考虑以下行:“JOptionPane.showMessageDialog(JavaWindow.this,” Hello!“);”。在这条线
JavaWindow.this应该是parentComponent。
在这种情况下,parentComponent是:
A)button1-触发动作的按钮(我想不是),
B)对象(类的实例)ListenForButton,其中包含名为actionPerformed的方法/函数,在这种特殊情况下,该类的实例(此类型的对象)称为lForButton(我不确定,但这是真的),
C)其在main中创建的对象-我们创建的窗口(在这里:new JavaWindow()); ( 我觉得不行),
D)其他答案???
最佳答案
问题1:new JavaWindow();
和JavaWindow javaWindow = new JavaWindow();
之间的区别在于,后者是在变量中存储JavaWindow类型的对象,通过这种方式,您可以使用该对象使用该类的方法和公共变量。您不能调用的第一个,只需调用类构造函数即可。好吧,您可以执行new JavaWindow().methodName()
,但是例如,您将无法在要求JavaWindow类型的方法中将其作为参数提供。
总而言之,仅在要稍后使用或与其他类不同的情况下才创建类的实例,在这种情况下,仅new JavaWindow()
无效。
问题2:parentComponent
是要JOptionPanel出现的主要组件。在这种情况下,您的JFrame就是JavaWindow
。之所以不仅仅是this
和JavaWindow.this
是因为该语句在内部类内部,而this
将引用该类。可以使用JavaWindow.this
正确地引用外部类JavaWindow
。