Sina.iRoid
یک شنبه 18 آبان 1393, 16:57 عصر
سلام. اگر امکانش هست به کد زیر نگاه کنید:
کد کلاس TextFieldFrame:
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class TextFieldFrame extends JFrame{
private final JTextField textField1; //text field with set size
private final JPasswordField passwordField; //password field with text
//Constructor
public TextFieldFrame() {
super("Window Demo");
setLayout(new FlowLayout());
//constructed textfield with 10 columns
textField1 = new JTextField(10);
add(textField1);
//constructed passwordfield with default text
passwordField = new JPasswordField("Hidden text");
add(passwordField);
//register event handler
TextFieldHandler handler = new TextFieldHandler();
textField1.addActionListener(handler);
passwordField.addActionListener(handler);
}
//getter
public JTextField getTextField1(){
return textField1;
}
public JPasswordField getPasswordField(){
return passwordField;
}
}
و کد کلاس TextFieldHandler:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JOptionPane;
public class TextFieldHandler implements ActionListener{
//object from TextFieldFrame
TextFieldFrame tff = new TextFieldFrame();
@Override
public void actionPerformed(ActionEvent e) {
String string;
if (e.getSource() == tff.getTextField1()) {
string = String.format("textfield1: %s", e.getActionCommand());
}else if (e.getSource() == tff.getTextField2()) {
string = String.format("textfield2: %s", e.getActionCommand());
}else if (e.getSource() == tff.getTextField3()) {
string = String.format("textfield3: %s", e.getActionCommand());
}else{
string = String.format("passwordfield: %s", e.getActionCommand());
}
//display JTextField Content
JOptionPane.showMessageDialog(null, string);
}
}
و کد کلاس اصلی:
import javax.swing.JFrame;
public class DriverClass {
public static void main(String[] args) {
TextFieldFrame frame = new TextFieldFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOS E);
frame.setSize(350, 100);
frame.setVisible(true);
}
}
حالا مشکل اینجاست که اگر الان برنامه رو اجرام کنیم، برنامه کرش می کنه!
اما اگر در کلاس TextFieldHandler با استفاده از کانستراکتور یک شی ایجاد می کنیم برنامه درست عمل می کنه. یعنی اگر کد کلاس TextFieldHandler و به صورت زیر بنویسیم:
//object from TextFieldFrame
TextFieldFrame tff;
//Constructor
public TextFieldHandler(TextFieldFrame tff) {
this.tff = tff;
}
و در کلاس TextFieldFrame موقع ایجاد یک شی به صورت زیر بنویسیم:
TextFieldHandler handler = new TextFieldHandler(this);
اگر اینطور بنویسیم برنامه درست اجرا میشه. اما من دلیلشو نمی دونم.
اگر راهنماییم کنید ممنون میشم.
کد کلاس TextFieldFrame:
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class TextFieldFrame extends JFrame{
private final JTextField textField1; //text field with set size
private final JPasswordField passwordField; //password field with text
//Constructor
public TextFieldFrame() {
super("Window Demo");
setLayout(new FlowLayout());
//constructed textfield with 10 columns
textField1 = new JTextField(10);
add(textField1);
//constructed passwordfield with default text
passwordField = new JPasswordField("Hidden text");
add(passwordField);
//register event handler
TextFieldHandler handler = new TextFieldHandler();
textField1.addActionListener(handler);
passwordField.addActionListener(handler);
}
//getter
public JTextField getTextField1(){
return textField1;
}
public JPasswordField getPasswordField(){
return passwordField;
}
}
و کد کلاس TextFieldHandler:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JOptionPane;
public class TextFieldHandler implements ActionListener{
//object from TextFieldFrame
TextFieldFrame tff = new TextFieldFrame();
@Override
public void actionPerformed(ActionEvent e) {
String string;
if (e.getSource() == tff.getTextField1()) {
string = String.format("textfield1: %s", e.getActionCommand());
}else if (e.getSource() == tff.getTextField2()) {
string = String.format("textfield2: %s", e.getActionCommand());
}else if (e.getSource() == tff.getTextField3()) {
string = String.format("textfield3: %s", e.getActionCommand());
}else{
string = String.format("passwordfield: %s", e.getActionCommand());
}
//display JTextField Content
JOptionPane.showMessageDialog(null, string);
}
}
و کد کلاس اصلی:
import javax.swing.JFrame;
public class DriverClass {
public static void main(String[] args) {
TextFieldFrame frame = new TextFieldFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOS E);
frame.setSize(350, 100);
frame.setVisible(true);
}
}
حالا مشکل اینجاست که اگر الان برنامه رو اجرام کنیم، برنامه کرش می کنه!
اما اگر در کلاس TextFieldHandler با استفاده از کانستراکتور یک شی ایجاد می کنیم برنامه درست عمل می کنه. یعنی اگر کد کلاس TextFieldHandler و به صورت زیر بنویسیم:
//object from TextFieldFrame
TextFieldFrame tff;
//Constructor
public TextFieldHandler(TextFieldFrame tff) {
this.tff = tff;
}
و در کلاس TextFieldFrame موقع ایجاد یک شی به صورت زیر بنویسیم:
TextFieldHandler handler = new TextFieldHandler(this);
اگر اینطور بنویسیم برنامه درست اجرا میشه. اما من دلیلشو نمی دونم.
اگر راهنماییم کنید ممنون میشم.