2016-05-31 5 views
-1

Ich versuche, Pong zu machen, und ich bin fast fertig. Ich habe es eingerichtet, wenn ein Spieler 5 Punkte erzielt, öffnet sich ein weiterer JFrame. Auf diesem JFrame gibt es zwei Schaltflächen; eins, um wieder zu spielen, und eins, um eine Anzeigetafel zu öffnen (eine Aufzeichnung der letzten drei Spiele). Aus irgendeinem Grund kann ich den Knopf nicht öffnen, um die Anzeigetafel zu öffnen. Würde etwas Hilfe lieben, herauszufinden, was falsch ist.JFrame wird nicht über ActionListener geöffnet

import java.awt.Graphics; 

import javax.swing.JPanel; 
import javax.swing.JFrame; 

public class scoreBoard extends JPanel { 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     g.drawLine(0, 50, 200, 50); 
     g.drawLine(0, 100, 200, 100); 
     g.drawLine(0, 150, 200, 150); 
     g.drawLine(95, 0, 95, 230); 

     g.drawString("PLAYER 1", 15, 30); 
     g.drawString("PLAYER 2", 115, 30); 

     g.drawString(String.valueOf(gameOver.Score[0][0]), 15, 80); 
     g.drawString(String.valueOf(gameOver.Score[0][1]), 115, 80); 
     g.drawString(String.valueOf(gameOver.Score[1][0]), 15, 130); 
     g.drawString(String.valueOf(gameOver.Score[1][1]), 115, 130); 
     g.drawString(String.valueOf(gameOver.Score[2][0]), 15, 180); 
     g.drawString(String.valueOf(gameOver.Score[2][1]), 115, 180); 
    } 

    public static void main(String[] args) { 
     scoreBoard board = new scoreBoard(); 

     JFrame boardFrame = new JFrame("Score Board"); 
     boardFrame.setSize(200, 230); 
     boardFrame.setVisible(true); 
     boardFrame.setResizable(false); 
     boardFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     boardFrame.add(board); 
    } 
} 

Dies ist die Klasse, die ich für die Anzeigetafel habe.

scores = new JButton("Recent Scores"); 
scores.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e) 
    { 
     scoreBoard board = new scoreBoard(); 
    } 
}); 

Dies ist der ActionListener, den ich habe, um die Anzeigetafel zu öffnen.

Vielen Dank im Voraus.

+0

Haben Sie einen Konstruktor für Scoreboard? Im Moment sehe ich nur eine Hauptmethode, die bei einem Standardkonstruktoraufruf nicht instanziiert wird. – Compass

+0

Werfen Sie einen Blick auf die Hauptmethode Ihres scoreBoards, es gibt ein Beispiel dafür, was Ihre actionPerformed-Methode tun sollte – MadProgrammer

+0

@MadProgrammer, ich glaube immer noch, dass ich in meinem ursprünglichen Kommentar zwei gültige Punkte angegeben habe. Aber da es zu Verwirrung geführt hat, werde ich den Kommentar entfernen und in Zukunft keine Kommentare abgeben. – camickr

Antwort

1

Zunächst sollten Klassennamen mit einem Großbuchstaben beginnen, sodass Ihre Klasse ScoreBoard lauten sollte.

public class ScoreBoard extends JPanel { 

Ihre Scoreboard Klasse ist eine JPanel

ScoreBoard board = new ScoreBoard(); 

Ihre Action Code erstellt gerade ein Panel. Sie können eine Anzeige nur anzeigen, wenn Sie sie zu einem Fenster hinzufügen.

Sie sollten Ihre Anzeigetafel in einem JDialog (kein JFrame) anzeigen.

würde der Grund Code sein:

scoreBoard board = new scoreBoard(); 
JDialog dialog = new JDialog(); 
dialog.add(board); 
dialog.pack(); 
dialog.setVisible(true); 

, die im Grunde der Code aus der main() Methode ist, muss die Action hinzugefügt werden, es sei denn Du eine JDialog verwenden, keine JFrame. Sie würden auch DISPOSE_ON_CLOSE anstelle von EXIT_ON_CLOSE verwenden.

+0

Danke! Das funktioniert perfekt. –

0

Ich gehe davon aus, dass Sie nicht diese Hauptfunktion verwenden, stattdessen starten Sie Ihr Programm von einem anderen Haupt (der, der macht, enthält Ihre Schaltfläche).

Wenn Sie ein Programm ausführen (vorausgesetzt, Sie verwenden eine IDE wie Eclipse), wird nur eine Hauptfunktion ausgeführt, daher diese main nicht.

Verschieben Sie den gesamten Code von main zur actionPerformed() -Methode.

Beachten Sie, dass dies keine optimale Lösung ist, da bei jedem Drücken der Taste ein neuer JFrame erstellt wird. Besser wäre es, einen JFrame ein- oder auszublenden.

+0

'Verschieben Sie den gesamten Code von main zur Methode actionPerformed(). - Nein, das sollten Sie nicht tun. Lesen Sie meinen Kommentar zur ursprünglichen Frage und sehen Sie sich meine Antwort an. – camickr