2016-05-13 1 views
0

Итак, я создаю игру rpg для своего класса компьютерной науки AP. Один из уровней, который я делаю для него, - это уровень, в котором игрок застревает в бесконечном цикле, и он постоянно возвращается обратно в центр экрана. Чтобы решить эту проблему, игрок нажимает enter, чтобы открыть текстовое поле для ввода типа «break;» или "count ++". Однако, когда я нажимаю enter, размер окна полностью изменяется, и вещи, нарисованные на jpanel, исчезают.Как вы добавляете текстовое поле в jpanel, который нарисован на jframe?

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

Может кто-то пожалуйста, скажите мне, как правильно добавить текстовое поле на JPanel, потому что я мог только найти людей, которые добавили его непосредственно на JFrame?

* Примечание: класс Sprite - это простой класс, который я сделал для управления движением персонажа, хождением и изменением направления через ArrayList.

+0

Почему не поп это в JOptionPane или модальном JDialog? –

+0

Я никогда не был таким. Это отдельные окна всплывающих окон? – OSXpro

ответ

0

Вы можете сделать одно добавление JTextField в JPanel и изначально установить его Видимое значение false, и если вы хотите ввести пользователя, сделайте его видимым для пользователя.

+0

Спасибо, это была правильная идея, но когда я пытаюсь добавить ее перед рукой, я не могу перемещать символ, потому что невидимое текстовое поле принимает вход, поэтому я не могу даже сделать его видимым с помощью клавиши ввода) , – OSXpro

0

-Вы должны определить макет JPanel, чтобы правильно разместить в нем компонент. Просто добавьте в основной метод:

panel.setLayout(new BorderLayout()); 

-Тогда изменить добавление JTextField следующим образом:

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

Кроме того, я настоятельно рекомендую вам прочитать о макетах: https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

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

  • Нет связанных вопросов^_^