2012-04-07 83 views
0

3rd Code Sample contains the error - how to solve?参考对象被转移为参数

在下面的代码中,我生成了一个名为“generator”的方法。 此方法接收JTextField和JLabel作为参数。

它生成单独的JPanel并将它们添加到另一个JPanel(带有“Vermieter”边框的JPanel)。 结果应该是这样的(标红):

http://imageshack.us/photo/my-images/853/stammdateneraffsenguibe.png/

我在这里实例化JTextFields将作为字段:

private JTextField txtplzvermieter; 
private JTextField txtemailvermieter; 
private JTextField txtgeburtsdatumvermieter; 
private JTextField txthandyvermieter; 
private JTextField txtidvermieter; 
private JTextField txtnamevermieter; 
private JTextField txtortvermieter; 
private JTextField txtstrassevermieter; 
private JTextField txttelefonvermieter; 
private JTextField txtvornamevermieter; 

在这里,我打电话给我的梅索德我在上面

描述
 public void vermieterPanel(JPanel verPanel){ 
     verPanel.add(generator("ID", txtidvermieter)); 
     verPanel.add(generator("Name", txtnamevermieter)); 
     verPanel.add(generator("Vorname", txtvornamevermieter)); 
     verPanel.add(generator("Straße", txtstrassevermieter)); 
     verPanel.add(generator("PLZ", txtplzvermieter)); 
     verPanel.add(generator("Ort", txtortvermieter)); 
     verPanel.add(generator("Geburtsdatum", txtgeburtsdatumvermieter)); 
     verPanel.add(generator("Telefon", txttelefonvermieter)); 
     verPanel.add(generator("Handy", txthandyvermieter)); 
     verPanel.add(generator("E-Mail", txtemailvermieter)); 

这里是包含错误的方法发生器:

 public JPanel generator(String lableText, JTextField s){ // generiert ein Panel mit einer Zeile aus lable + TextFeld 

    JPanel gens = new JPanel(); 
    JLabel lable = new JLabel(lableText); 
    lable.setPreferredSize(new Dimension(100,25)); 

    s = new JTextField(); 
    s.setPreferredSize(new Dimension(200, 25)); 


    gens.add(lable); 
    gens.add(s); 
    return gens; 
    } 

以后我不能得到与.getText();我TeftFields参考,因为我已经创建了一个引用到这里s = new JTextField();

一个新的JTextField,-Object如果我删除订单中的行访问我的对象,我得到一个空指针异常。

我在做什么错?

回答

0

当然你会得到一个异常,因为你在初始化之前传递了JTextield!
您只是声明它,
在将它作为参数传递之前,用new关键字初始化它。

+0

Whops。忘记提及那个调用引用JTextFields的方法initComponents。 即使我声明这样的JTextFields: private JTextField txtplzvermieter = new JTextField(); private JTextField txtemailvermieter = new JTextField(); private JTextField txtgeburtsdatumvermieter = new JTextField(); private JTextField txthandyvermieter = new JTextField(); private JTextField txtidvermieter = new JTextField(); 我仍然得到相同的空指针 – RCK69 2012-04-07 22:08:56

+0

调试代码并监视发电机入口点的场,并看看发生了什么 – GingerHead 2012-04-07 22:11:54

+0

THX!当我呕吐时,我看到了generator() - 方法很好! 错误在这里: mieterPanel(mietPanel); mieterPanel(mietObjektPanel); 第二行导致错误,因为“mietObjektPanel”只包含一些随机的东西(导致我认为是空指针),并将其添加到mieterPanel而不是一个新的面板...当我创建一个新的面板,并与发电机构建mietObjektPanel () - 方法它像一个魅力。以前从未使用过调试器,因此我学习了一项新技能 - 欢迎您光临 – RCK69 2012-04-08 10:51:58

0

原始值永远不会被创建。你需要这样做

private JTextField txtplzvermieter = new JTextField(); 

为他们每个人。但它必须在方法之外,而不是在里面。

+0

感谢您的建议,但我已经尝试过。 如果删除该行,然后我得到一个NullPointerException: 异常在线程 “AWT-EventQueue的-0” 显示java.lang.NullPointerException \t在database.Gui.generator(Gui.java:192) \t在数据库中。 Gui.mieterPanel(Gui.java:173) \t at database.Gui。stammdatenErfassen(Gui.java:139) \t at database.Gui.actionPerformed(Gui.java:241) – RCK69 2012-04-07 21:56:27

0

的Java你不能传递一个对象作为参考,它永远不会发生
这是创建的Java语言,最小的内存管理
如果你传递一个对象作为参数,复制的目的对象的引用将通过
,因此对象field的每个更改都会反映,除非将关键字new指定为新对象,此时您将松开抓取对象 尝试使您的JField s作为全球classfield s,不要通过参数部分将它们传递给方法。

+0

thx - 这非常有用! 我的JFields已经是全球级的Fiels! 如果我不能通过对象的引用,我怎么能写通用的方法“生成器”,以便它为每个这些TextField生成JPanel(带有JLabel和JTextfield)? – RCK69 2012-04-07 22:04:49

+0

@ RCK69阅读我的其他答案 – GingerHead 2012-04-07 22:06:23