【问题标题】:How do you add a text field to a jpanel that is drawn onto a jframe?如何将文本字段添加到绘制到 jframe 上的 jpanel?
【发布时间】:2016-05-13 02:45:32
【问题描述】:

所以,我正在为我的 AP 计算机科学课程创建一个 rpg 游戏。我正在为它制作的关卡之一是玩家陷入无限循环并不断移动回屏幕中心的关卡。为了解决这个问题,玩家按下回车键打开一个文本框,输入“break;”。或“计数++”。但是,当我按下回车时,窗口的大小完全改变了,在 jpanel 上绘制的东西也不见了。

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 处理角色移动、行走和改变方向。

【问题讨论】:

  • 为什么不在 JOptionPane 或模态 JDialog 中弹出它?
  • 我从来没有硬过这些。那些是单独的弹出窗口吗?

标签: java swing jframe jpanel textfield


【解决方案1】:

您可以做一件事,将JTextField 添加到 JPanel 并最初将其设置为 Visible false,然后当您想从用户输入时,使其对用户可见。

【讨论】:

  • 谢谢,这是正确的想法,但是当我尝试预先添加它时,我无法移动字符,因为不可见的文本字段正在接受输入,所以我什至无法制作用回车键可见)。
【解决方案2】:

-您需要定义 JPanel 布局以便在其中正确放置组件。只需添加您的 main 方法:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多