Резюме из моего последнего вопроса, я 15-летний новичок в сообществе stackoverflow. В настоящее время я пытаюсь самостоятельно разработать игру Rock Paper Scissors с использованием java. Я думал, что работа над этим проектом будет полезным опытом, который поможет мне изучить Java и ее основы. Я немного новичок в языке программирования java, поэтому, пожалуйста, не критикуйте меня, я медленно учусь методом проб и ошибок. Для этого конкретного проекта я решил использовать Eclipse, поскольку мне нравится его пользовательский интерфейс больше, чем в других IDE. В любом случае, я решил внедрить JPanel, чтобы сделать игру более наглядной. Мой код выглядит следующим образом: скопирован и вставлен из моего проекта eclipse:

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import java.awt.event.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class prompt extends JPanel implements ActionListener {      
    public static void main(String []args) {
        JPanel panel = new JPanel();
        JButton rockButton = new JButton("ROCK");
        JButton scissorsButton = new JButton("SCISSORS");
        JButton paperButton = new JButton("PAPER");
        JFrame choicePrompt = new JFrame("Rock, Paper, Scissors Game");
        choicePrompt.add(panel);
        choicePrompt.setSize(300, 300);
        choicePrompt.setVisible(true);
        panel.add(rockButton);
        panel.add(scissorsButton);
        panel.add(paperButton);

        rockButton.addActionListener(new ActionListener() {
            public void rockChosen(ActionEvent r)
            {
                JLabel rock = new JLabel("You have chosen Rock!");
                panel.add(rock);
            }
        }
        scissorsButton.addActionListener(new ActionListener() {
            public void scissorsChosen(ActionEvent s)
            {
                JLabel scissors = new JLabel("You have chosen Scissors!");
                panel.add(scissors);
            }               
        }
        paperButton.addActionListener(new ActionListener() {
            public void paperChosen(ActionEvent p) 
            {
                JLabel paper = new JLabel("You have chosen Paper!");
                panel.add(paper);
            }   
        }
    }
}

Что не так с моими ActionListeners при добавлении кнопок в JPanel? Я хочу, чтобы эта программа работала так, чтобы когда пользователь щелкал по камню, бумаге или ножницам, он отображал JLabel для его решения. Все остальные "тряпки" я могу сделать сам.

0
Stilicho 8 Июн 2014 в 22:49
Возможно, вы должны просто иметь одну метку и изменить текст.
 – 
BitNinja
8 Июн 2014 в 22:50
Вызовите panel.revalidate() и panel.repaint() после добавления любого JLabel в JPanel.
 – 
Braj
8 Июн 2014 в 22:51
ActionListener неправильно реализован в вашем коде. где реализован метод actionPerformed()
 – 
Braj
8 Июн 2014 в 22:55

2 ответа

Лучший ответ

Ваш код не должен даже компилироваться, и если это так, и вы обращаетесь сюда за помощью, вам необходимо сообщить нам об этом и опубликовать все сообщения об ошибках компиляции, указав, какая строка их вызывает. Рекомендации:

  • Не позволяйте вашему классу расширять ActionListener.
  • Дайте каждой JButton анонимный внутренний класс, аналогичный тому, что вы делаете, но который компилируется и имеет метод actionPerformed.
  • Внутри этого метода не добавляйте новый JLabel в свой графический интерфейс, поскольку нет смысла добавлять новые компоненты при нажатии кнопки. Вместо этого вызовите actionPerformed setText(...) для JLabel, который уже является частью вашего графического интерфейса.
  • Начните с заглавной буквы в имени вашего класса, чтобы соответствовать стандартам именования Java.
1
Hovercraft Full Of Eels 8 Июн 2014 в 23:08

Вы не реализовали ActionLIstener должным образом, в этом интерфейсе есть метод actionPerformed (ActionEvent e), попробуйте это (для всех ваших слушателей):

paperButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) 
    {
        JLabel paper = new JLabel("You have chosen Paper!");
        panel.add(paper);
    }
0
troy 8 Июн 2014 в 23:03
Менеджеры компоновки Swing не уведомляют о том, что что-то происходит в уже видимом графическом интерфейсе Swing, вы должны программно уведомить контейнер, например. panel.revalidate() и panel.repaint(), тогда бумага будет видна
 – 
mKorbel
9 Июн 2014 в 11:03