2013-05-09 3 views
0

Ошибка: Странно, у меня нет ошибок.Код не работает, но я не получаю сообщений об ошибках

То, что я пытаюсь сделать: (Я также добавил // сообщения, объясняет, что мой код делает.)

Что я пытаюсь сделать это довольно просто.

1) Заполните имя в JTextField, нажмите enter и имя должно появиться в JTextArea. После того, как имя находится в JTextArea, JTextField становится пустым, поэтому вы можете заполнить другое имя и так далее, должен появиться список имен в JTextArea.

2) Нажмите кнопку kiesWin, чтобы программа выбрала случайного пользователя из списка. (здесь это не так)

3) Нажмите кнопку resetL, чтобы сбросить программу, чтобы я мог создать новый список, чтобы выбрать случайного победителя.

Проблема: Когда я нажимаю кнопку Kies (Translated: Choose), он должен выбрать случайное имя из ArrayList и показать случайное имя в текстовом поле JTextField2. Но когда я нажимаю кнопку Kies, программа ничего не делает. И он должен показать мне случайное выбранное имя из ArrayList.

Это класс, который не работает должным образом: (I Think)

// This is the button that chooses a random name from the ArrayList. 
// The random chosen name should appear in the JTextField textvak2. (but it doesn't) 
// This is also the part where it goes wrong at the moment. 
class Kies extends OnthoudNaam implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     Random r = new Random(); 
     if (lijst.size() > 0) { 
      int n = r.nextInt(lijst.size()); 
      Naam kiesNaam = lijst.get(n); 
      textvak2.setText(kiesNaam.getIngevoerdNaam()); 
      } 
    } 
} 

Ибо в случае если вам нужен весь код:

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

// This is the Panel that goes into the frame. 
class Paneel extends JPanel { 
private Boven boven; 
JTextArea textvak1; 
JTextField textvak2; 
OnthoudNaam onthoudNaam = new OnthoudNaam(); 
JTextField invoervak1; // JTextField from class Boven. 

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

add(boven, BorderLayout.NORTH); // Where the class Boven should be. 
add(textvak1, BorderLayout.CENTER); 
add(textvak2, BorderLayout.SOUTH); 
} 

// This is the class Boven (Translation up or upper). 
// This is where the JButtons, JTextField and JLabels are. 
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); 
    } 
} 

// The class Naam (translation = name). 
// This is what the ArrayList should remember 
// In other words ArrayList should remember the Names I put in the JTextField. 
class Naam { 
    private String ingevoerdNaam; 

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

    public String getIngevoerdNaam() { 
     return ingevoerdNaam; 
    } 

    public String toString() { 
     return ingevoerdNaam; 
    } 
} 

// This is my ArrayList, 
// This should remember the names I type in the JTextField. 
class OnthoudNaam extends JPanel { 
    protected 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 JTextField where I enter the names. 
// The Name I fill in the JTextField should be remembered by the ArrayList. 
// The Name I fill in should be put in the JTextArea. 
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 button that chooses a random name from the ArrayList. 
    // This is also the part where it goes wrong at the moment. 
class Kies extends OnthoudNaam implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     Random r = new Random(); 
     if (lijst.size() > 0) { 
      int n = r.nextInt(lijst.size()); 
      Naam kiesNaam = lijst.get(n); 
      textvak2.setText(kiesNaam.getIngevoerdNaam()); 
      } 
    } 
} 

// This should become the button that resets everything so you can start over. 
class Reset implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
    } 
} 
} 
+0

Возможный дубликат http://stackoverflow.com/questions/4072594/exception-in-thread-main-java-lang-illegalargumentexception-n-must-be -positiv –

ответ

1

Random#nextInt требует положительной номер, но исходный размер Listlijst составляет 0, следовательно Исключение

docs четко это

Throws: IllegalArgumentException - if n is not positive

Убедитесь, что имеются данные, введенные в List первый.

if (lijst.size() > 0) { 
    int n = r.nextInt(lijst.size()); 
    Naam kiesNaam = lijst.get(n); 
    textvak2.setText(kiesNaam.getIngevoerdNaam()); 
} 

Кроме: Вместо литья объект из List, извлечь Naam объект и использовать его метод getIngevoerdNaam.

Помните также Отладчик ваш друг

+0

Теперь я не получаю ошибок при компиляции, выполнении или нажатии кнопки. Но когда я нажимаю кнопку, он все еще не показывает, кто является случайным выбранным именем из ArrayList. (Я изменил код в главном сообщении выше) – Morganis

+0

JTextField textvak2 по-прежнему остается пустым – Morganis

+0

да, но я не могу публиковать сообщения еще раз, достигнув предела из 6 вопросов – Morganis

Смежные вопросы