2016-05-13 9 views
0

Also, ich erstelle ein RPG-Spiel für meine AP Informatik-Klasse. Eine der Ebenen, die ich dafür mache, ist eine Ebene, auf der der Spieler in einer Endlosschleife feststeckt, und er wird kontinuierlich zurück in die Mitte des Bildschirms bewegt. Um dies zu lösen, drückt der Spieler Enter, um ein Textfeld zu öffnen, um entweder "break" einzugeben. oder "zähle ++". Wenn ich jedoch die Eingabetaste drücke, wird die Größe des Fensters komplett geändert und die Dinge, die auf dem Jpanel gezeichnet sind, sind verschwunden.Wie fügen Sie ein Textfeld zu einem Jpanel hinzu, das auf einen Jframe gezeichnet wird?

import javax.imageio.ImageIO; 
import javax.swing.*; 
import java.awt.*; 
import java.io.File; 
import java.io.IOException; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.event.WindowEvent; 
import java.util.ArrayList; 
import java.util.HashSet; 
import java.util.Set; 

public class InfiniteLoop extends JPanel implements KeyListener{ 
    public Sprite character; 
    Set<Character> keys = new HashSet<Character>(); 
    ArrayList<Image> sprite = new ArrayList<Image>(); 
    static JFrame frame; 
    int frames; 

    public InfiniteLoop(){ 
     super(); 
     frames = 0; 
     addKeyListener(this); 
     try { 
      sprite.add(ImageIO.read(new File("src/Sprite/back.png"))); 
      sprite.add(ImageIO.read(new File("src/Sprite/back walk 1.png"))); 
      sprite.add(ImageIO.read(new File("src/Sprite/back walk 2.png"))); 
      sprite.add(ImageIO.read(new File("src/Sprite/left idle.png"))); 
      sprite.add(ImageIO.read(new File("src/Sprite/left walk.png"))); 
      sprite.add(ImageIO.read(new File("src/Sprite/left walk 2.png"))); 
      sprite.add(ImageIO.read(new File("src/Sprite/Idle.png"))); 
      sprite.add(ImageIO.read(new File("src/Sprite/front walk 1.png"))); 
      sprite.add(ImageIO.read(new File("src/Sprite/front walk 2.png"))); 
      sprite.add(ImageIO.read(new File("src/Sprite/right idle.png"))); 
      sprite.add(ImageIO.read(new File("src/Sprite/right walk.png"))); 
      sprite.add(ImageIO.read(new File("src/Sprite/right walk 2.png"))); 
      character = new Sprite(400,250, 0.25, sprite); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

    public Dimension getPreferredSize() { 
     return new Dimension(800, 500); 
    } 

    public static void main(String[] args){ 
     InfiniteLoop panel = new InfiniteLoop(); 
     frame = new JFrame("APCS the game"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(panel); 
     frame.addKeyListener(panel); 
     frame.setSize(800, 500); 
     frame.pack(); 
     frame.setBackground(Color.white); 
     frame.setVisible(true); 

    } 

    public void paintComponent(Graphics g) {  
     frames ++; 
     if(frames > 500){ 
      character.move(400, 250); 
      frames = 0; 
     } 
     int width = getWidth(); 
     int height = getHeight(); 
     g.clearRect(0, 0, width, height); 
     g.setColor(Color.black); 
     g.setFont(new Font("Comic Sans", Font.PLAIN, 32)); 
     g.drawString("while(count == 1){", 150, 100); 
     g.drawString("}", 600, 400); 
     character.draw(g); 
     character.move(keys, width, height); 
     repaint(); 
     } 

    public synchronized void keyPressed(KeyEvent event) { 
     //Adds pressed key to set 
     keys.add(event.getKeyChar()); 
     if(event.getKeyCode() == event.VK_ENTER){ 
      frame.getContentPane().add(new JTextField("Stop this infinite loop")); 
      frame.pack(); 
     } 

    } 

    public synchronized void keyReleased(KeyEvent event){ 
     //Method to remove key from Set if released 
     System.out.println(event.getKeyChar()); 
     if(keys.contains(event.getKeyChar())) 
      keys.remove(event.getKeyChar()); 
    } 

    //Empty Implemented method that has to be here for use of listener 
    public void keyTyped(KeyEvent event) { 
    } 
} 

Kann mir bitte jemand sagen, wie man richtig das Textfeld auf der JPanel hinzufügen, weil ich nur Leute, die es auf dem JFrame direkt hinzugefügt finden konnten?

* Hinweis: Sprite-Klasse ist eine einfache Klasse, die ich gemacht habe, um Zeichenbewegung, Gehen und Richtungswechsel durch eine ArrayList zu handhaben.

+0

Warum nicht Pop es in einem JOptionPane oder einem modalen JDialog? –

+0

Ich habe nie schwer von denen. Sind das separate Popout-Fenster? – OSXpro

Antwort

0

Sie können eine Sache machen, die JTextField zum JPanel hinzufügt und es zuerst sichtbares falsch gesetzt und wenn Sie vom Benutzer eintragen möchten, dann es für Benutzer sichtbar machen.

+0

Danke, das war die richtige Idee, aber wenn ich versuche, es vorher hinzuzufügen, kann ich das Zeichen nicht bewegen, weil das unsichtbare Textfeld die Eingabe übernimmt, also kann ich es nicht einmal mit der Eingabetaste sichtbar machen) . – OSXpro

0

-Sie müssen das JPanel-Layout definieren, um eine Komponente korrekt zu platzieren. Einfach in Ihrem Haupt-Methode hinzufügen:

panel.setLayout(new BorderLayout()); 

-Dann die Zugabe des JTextField wie folgt ändern:

frame.getContentPane().add(new JTextField("Stop this infinite loop"), BorderLayout.North); 

Auch ich Sie Layouts lesen dringend empfohlen: https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html