2013-05-08 122 views
2

错误:Java错误:无法找到符号,并不能找出为什么

error: cannot find symbol 

什么似乎并不作品:

如果我写: “InvoerVakhandler延伸范博文”然后错误消失,但然后我得到一个无尽的循环,最后程序崩溃,并说堆栈溢出错误。

如果我尝试从类boven中更改“}”符号并将其放在文本的末尾,那么我甚至会得到更多的错误消息。

问题:我需要更改我的代码才能使其工作?

注: 我是新来的Java,我知道有更多的职位像这样的,但我不能与Java的我目前的了解有限,把它们应用到我的代码。

如果有人想知道:我正在使用JCreator。

我想做什么:我想要做的是相当简单。

1)在JTextField中填入名称,按回车键,名称应该出现在JTextArea中。名称位于JTextArea中后,JTextField变为空,所以您可以填充另一个名称等,那么应该在JTextArea中出现一个名称列表。 (这是我现在试图做的)

2)按下按钮kiesWin使程序从列表中选择一个随机的人。

3)按下按钮resetL重置程序,所以我可以做一个新的列表,从中选择一个随机获胜者。代码

部分地方出现的错误:(从类InvoerVakHandler)

String invoer = invoervak1.getText(); 

用我有限的Java知识的问题可能是litterly任何地方,所以在情况下,我会后整个代码。

整个代码:

import javax.swing.*; 
import javax.swing.border.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 

// Main method to make the frame 
public class Loterij3 extends JFrame { 
public static void main(String args[]) { 
    JFrame frame = new Loterij3(); 
    frame.setExtendedState(frame.MAXIMIZED_BOTH); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setTitle("Klanten Register"); 
    frame.setContentPane(new Paneel()); 
    frame.setVisible(true); 
} 
} 

class Paneel extends JPanel { 
private boven Boven; 
JTextArea textvak1; 
JTextField textvak2; 
OnthoudNaam onthoudNaam = new OnthoudNaam(); 

public Paneel() { 
setLayout(new BorderLayout()); // using border Layout. 
setBackground(Color.LIGHT_GRAY); 

textvak1 = new JTextArea(); 
add(new JScrollPane(textvak1)); 
textvak1.setBackground(Color.WHITE); 

textvak2 = new JTextField(); 
textvak2.setHorizontalAlignment(JTextField.CENTER); 
textvak2.setEditable(false); 

Boven = new boven();  

add(Boven, BorderLayout.NORTH); 
add(textvak1, BorderLayout.CENTER); 
add(textvak2, BorderLayout.SOUTH); 
} 

public class boven extends Paneel { 
JButton kiesWin, resetL; 
JLabel label1; 
JTextField invoervak1; 

public boven() { 
    setBackground(Color.LIGHT_GRAY); 
    setLayout(new GridLayout(1, 4, 100, 5)); // using GridLayout. 
    Border border = 
     BorderFactory.createEmptyBorder(10, 10, 10, 10); 
    setBorder(border); 

    kiesWin = new JButton("Kies een Winnaar!"); 
    kiesWin.addActionListener(new kies()); 
    resetL = new JButton("Reset alles"); 
    resetL.addActionListener(new reset()); 
    label1 = new JLabel("Voer Persoon in en druk op enter: ", JLabel.RIGHT); 
    invoervak1 = new JTextField(20); 
    invoervak1.addActionListener(new InvoerVakHandler()); 

    add(label1); 
    add(invoervak1); 
    add(kiesWin); 
    add(resetL); 
    } 
} 

// de naam 
class naam { 
    private String ingevoerdNaam; 

    public naam(String ingevoerdNaam) { 
     this.ingevoerdNaam = ingevoerdNaam; 
    } 

    public String getIngevoerdNaam() { 
     return ingevoerdNaam; 
    } 
} 

// Arraylist 
class OnthoudNaam extends JPanel { 
    private ArrayList<naam> lijst; 

    public OnthoudNaam() { 
     lijst = new ArrayList<naam>(); 
     } 

     public void voegNaamToe(naam x) { 
     lijst.add(x); 
     } 

     public String toString() { 
     StringBuffer buffer = new StringBuffer(); 
     for(naam x : lijst) { 
     buffer.append(x); 
     buffer.append("\n"); 
    } 
    return buffer.toString(); 
} 
} 

// this is the part where the code goes wrong 
public class InvoerVakHandler implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     String invoer = invoervak1.getText(); 
     naam naam = new naam(invoer); 
     onthoudNaam.voegNaamToe(naam); 
     textvak1.setText(onthoudNaam.toString()); 
    } 
} 
    // kies 
class kies implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
    } 
} 

// reset 
class reset implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
    } 
} 
} 

大家谁试图帮助我:谢谢您的帮助和耐心提前!

+0

在'public class boven extends Paneel {' – Maroun 2013-05-08 18:25:35

+0

之前你应该有'}'你可以提供哪条线明确地导致这个错误?通常,当你使用一个你没有在请求范围内定义的变量时,会发生这些错误。 – Makoto 2013-05-08 18:25:55

+0

@MarounMaroun:我可以看到有适当数量的大括号... – Makoto 2013-05-08 18:26:32

回答

1

有问题的行类:InvoerVakHandler

变量是在类中定义:boven

这就是为什么它不能找到它。

我认为你可以从ActionEvent传递给actionPerformed()方法得到事件的来源。

请注意,通常我们使用大写字母来开始任何类和小写字母的名称以开始方法和变量。 (常数是个例外。)

1

变量invoervak1boven类中定义,在InvoerVakHandler中不可见。由于InvoerVakHandlerinvoervak1组件专门注册,您可以使用您ActionListener源对象获取参考JTextField

JTextField textField = (JTextField) e.getSource(); 
String invoer = textField.getText(); 

通常匿名ActionListener实现使用。这使得预期来源与其相关的功能一起清晰。

1

该错误消失了来自Reimeus的答案。但是,你的程序不会运行,因为你创建了一个stackoverflow。 在Paneel你叫

Boven = new boven(); 

类然而范博文从Paneel类扩展。所以Java需要在构建需要Paneel等的Boven实例时构建Paneel实例。

使boave从JPanel扩展,您的GUI启动并工作。

但是你的输出看起来就像这样

[email protected] 

这是因为你的类“NAAM”没有overwritte toString方法等Object.toString被称为产生基于类名和hashCode一个String的一个对象。

所以你NAAM类扩展到这一点:

class naam { 
    private String ingevoerdNaam; 

    public naam(String ingevoerdNaam) { 
     this.ingevoerdNaam = ingevoerdNaam; 
    } 

    public String getIngevoerdNaam() { 
     return ingevoerdNaam; 
    } 

    public String toString() { 
     return ingevoerdNaam; 
    } 
} 

希望这有助于。如已经提到的那样,请坚持Java Coding Conventions