2013-05-08 32 views
1

注意:我读过其他帖子,我尝试将它应用到我自己的文本,这是它的结果。Java从arraylist中获得随机字符串

问题:我必须更改或添加到我的代码才能正常工作?

错误:

error: cannot find symbol 
error: cannot find symbol 

这些是下列行:134,135

int n = r.nextInt(lijst.size()) ; 
kies KiesNaam = lijst.get(n); 

这是类:

class kies implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     Random r = new Random(); 
     int n = r.nextInt(lijst.size()) ; 
     kies chooseName = lijst.get(n); 
     textvak2.setText("" + KiesNaam); 
    } 
} 

这是我试图实现的:按下kiesWin按钮,让程序从ArrayList中选择一个随机的人。随机选择的人的姓名应该出现在JTexstField textvak2中。

情况下,你需要整个代码:(滚动一路下跌的类KIES)

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("My Lottery!"); 
    frame.setContentPane(new Paneel()); 
    frame.setVisible(true); 
} 
} 

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

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

boven = new boven(); 

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

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

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


public class boven extends JPanel { 
JButton kiesWin, resetL; 
JLabel label1; 

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; 
    } 

    public String toString() { 
     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(); 
} 
} 

// invoer handler 
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()); 
     invoervak1.setText(""); 
    } 
} 
    // This is the part where it goes wrong. 
class kies implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     Random r = new Random(); 
     int n = r.nextInt(lijst.size()) ; 
     kies chooseName = lijst.get(n); 
     textvak2.setText("" + KiesNaam); 
    } 
} 

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

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

回答

2

你试图lijstkies使用 - 但它不是kies成员,或kies任何超类,或kies隐含的类实例。它是OnthoudNaam的成员。

所以你要么改变你想要使用它的地方,要么有一个OnthoudNaam的实例来获取它。如果你不再使用所有这些内部类(以及不遵循Java命名约定的类),这将会更简单。如果你不再使用所有这些内部类(以及不遵循Java命名约定的类),那么这将会更简单。请不要随意乱用乱码 - 如果你退后一步,并使现有代码更清洁,你将不会遇到太多问题。

+0

不在于它属于超会有所帮助,因为它是私有的。 – Keppil 2013-05-08 22:09:03

+1

@Keppil:对 - 尽管至少它会更容易解决(例如,通过访问器方法)。 – 2013-05-08 22:09:39

1

private ArrayList lijst; (使用荷兰语代码不是最好的做法,尤其是如果你要和外国人一起工作的话)。

该变量是私有的,这意味着定义它的类之外没有其他类可以访问它。目前唯一可以访问的类是OnthoudNaam。 OnthoudNaam类之外的任何函数或类都不知道列表(lijst)的存在。你必须做的工作是让变种可用于变种。

也许一个不错的地方开始学习公共,私有,保护和这样的: http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html