2013-05-08 2 views
1

Примечание: Я читал другие сообщения, и я попытался применить его к своему тексту, и это результат его.Java get random string from 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.

В случае если вам нужен весь код: (Scroll весь путь вниз для класса 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

Вы пытаетесь использовать lijst в kies - но это не является член kies, или любым суперкласс kies или неявным ограждающим экземпляр kies. Он входит в состав OnthoudNaam.

Таким образом, вам нужно либо изменить, где вы пытаетесь его использовать, либо получить экземпляр OnthoudNaam, чтобы получить его.

, все это будет проще, если вы прекратите использовать все эти внутренние классы (и классы, которые не соответствуют соглашениям об именах Java). Пожалуйста, не продолжайте пахать с грязным кодом - если вы сделаете шаг назад и сделаете свой существующий код намного чище, у вас не будет почти столько же проблем.

+0

Не то принадлежность к суперкласса бы помочь, так как он является частным. – Keppil

+1

@ Keppil: True - хотя, по крайней мере, это было бы легче решить (например, с помощью метода доступа). –

1

частный ArrayList lijst; (Наличие вашего кода на голландском языке не является лучшей практикой, особенно если вы собираетесь работать с иностранными людьми).

Эта переменная является частной, что означает, что ни один другой класс вне класса, определяющего ее, не может достичь этого. Единственный класс, который имеет к нему доступ прямо сейчас, - OnthoudNaam. Любая функция или класс вне класса OnthoudNaam не знает о существовании вашего списка (lijst). Что вам нужно сделать, чтобы сделать эту работу, так это сделать доступной переменную lijst для kies.

Может быть хорошее место, чтобы начать изучать государственные, частные, защищенные и такие: http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html