光滑的文本字段不起作用 [英] Slick TextField not working

查看:35
本文介绍了光滑的文本字段不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在使用 Slick2D 的 TextField 时遇到问题.

I have a problem when using Slick2D's TextField.

当使用 Slick 的BasicGame"时,TextField 工作正常 - 我可以点击它,输入单词,然后 System.out.println 文本字段的内容.

When using Slick's 'BasicGame' the TextField works fine - I am able to click on it, type words, and System.out.println the text fields contents.

但是,当在BasicGameState"上使用相同的代码时,TextField 不可点击并且不响应任何输入.

However, when using the same code on a 'BasicGameState', the TextField is un-clickable and doesn't respond to any input.

所以:工作代码:

package Help;
import java.awt.Font;
import org.newdawn.slick.AppGameContainer;
import org.newdawn.slick.BasicGame;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.UnicodeFont;
import org.newdawn.slick.font.effects.ColorEffect;
import org.newdawn.slick.gui.AbstractComponent;
import org.newdawn.slick.gui.ComponentListener;
import org.newdawn.slick.gui.TextField;

public class TextFieldWorking extends BasicGame{
    private TextField text1;
    private UnicodeFont font = getNewFont("Arial" , 16);


    public TextFieldWorking() {
        super("Test");
    }
    @Override
    public void init(GameContainer container) throws SlickException {
        font.loadGlyphs();
        text1 = new TextField(container, font, 50,50,100,25);
    }
    @Override
    public void update(GameContainer gc, int delta) throws SlickException {
        System.out.println(text1.getText());
    }
    @Override
    public void render(GameContainer gc, Graphics g) throws SlickException {
        text1.render(gc, g);
    }
    public UnicodeFont getNewFont(String fontName , int fontSize){
        UnicodeFont returnFont = new UnicodeFont(new Font(fontName , Font.PLAIN , fontSize));
        returnFont.addAsciiGlyphs();
        returnFont.getEffects().add(new ColorEffect(java.awt.Color.white));
        return (returnFont);
    }
    public static void main(String[] args) throws SlickException  {
        TextFieldWorking g = new TextFieldWorking();
        AppGameContainer gc = new AppGameContainer(g);
        gc.setDisplayMode(500, 500, false);
        gc.start();
    }
}

非工作代码:

package Help;
import java.awt.Font;
import org.newdawn.slick.AppGameContainer;
import org.newdawn.slick.BasicGame;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.UnicodeFont;
import org.newdawn.slick.font.effects.ColorEffect;
import org.newdawn.slick.gui.AbstractComponent;
import org.newdawn.slick.gui.ComponentListener;
import org.newdawn.slick.gui.TextField;

import org.newdawn.slick.state.BasicGameState;
import org.newdawn.slick.state.StateBasedGame;


public class TextFieldTest extends BasicGameState{

    int WindowWidth, WindowHeight;  
    TextField text1;
    private UnicodeFont font = getNewFont("Arial" , 16);
    private int stateId = 0;

    public TextFieldTest(int State) {
        this.stateId = State;
    }

    public void init(GameContainer gc, StateBasedGame sbg) throws SlickException{

        WindowWidth = gc.getWidth();
        WindowHeight = gc.getHeight();
        font.loadGlyphs();
        text1 = new TextField(gc, font, 50,50,100,25);
    }

    public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException{
        text1.render(gc, g);
    }

    public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException{
        System.out.println(text1.getText());
    }

    public UnicodeFont getNewFont(String fontName , int fontSize){
        UnicodeFont returnFont = new UnicodeFont(new Font(fontName , Font.PLAIN , fontSize));
        returnFont.addAsciiGlyphs();
        returnFont.getEffects().add(new ColorEffect(java.awt.Color.white));
        return (returnFont);
    }

    public int getID(){
        return this.stateId; //Returns the Id of this state (menu is 0)
    }
}

为了方便:

这与 BasicGameState 一起使用 - 这就是 Slick2D 的工作方式 - 您可以直接复制 - 现在粘贴代码:P

This goes with the BasicGameState - It's how Slick2D works - you can just copy - paste code now :P

package Help;
import org.newdawn.slick.AppGameContainer;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.state.StateBasedGame;

public class Game extends StateBasedGame{

    public static final String gamename = "Problem!";
    public static final int TextFieldTestNum = 1;

    public Game(String gamename){
        super(gamename); 
        this.addState(new TextFieldTest(TextFieldTestNum));

    }
    public void initStatesList(GameContainer gc) throws SlickException{
        this.getState(TextFieldTestNum).init(gc, this);
        this.enterState(TextFieldTestNum); //The First state to enter
    }

    @Override
    public boolean closeRequested(){
        System.exit(0);
        return false;
    }

    public static void main(String[] args) {
        AppGameContainer appgc;
        try{
            Game g = new Game(gamename);
            appgc = new AppGameContainer(g);
            appgc.setDisplayMode(500, 500, false);
            appgc.start();
        }catch(SlickException e){
            e.printStackTrace();
        }
    }
}

任何想法表示赞赏!

推荐答案

您的问题是您如何处理流畅的 StateBasedGames.如果你在这里参考我的维基条目:http://slick.ninjacave.com/wiki/index.php?title=Game_States

Your problem is how you are going about StateBasedGames in slick. If you refer to my wiki entry here: http://slick.ninjacave.com/wiki/index.php?title=Game_States

您会注意到,在 initStatesList() 方法中,我只使用了 this.addState(new StateName()).这是因为 addState() 方法的作用.它为您调用 init 方法,因此无需在顶级 Application 类(在您的情况下为 Game.java)中执行 getState() 或 enterState().

You will notice that in the initStatesList() method, I only use this.addState(new StateName()). This is because of what addState() method does. It calls the init method for you, so there is no need to do getState() or enterState() in the top level Application class (Game.java in your case).

总结如何解决您的问题,删除 initStatesList() 方法中的所有内容,然后移动 this.addState(new TextFieldTest(TextFieldTestNum));从主构造函数到 initStatesList() 方法.

To summarize how to fix your problem, remove everything in your initStatesList() method, then move this.addState(new TextFieldTest(TextFieldTestNum)); from your main constructor to your initStatesList() method.

一旦我在你的程序中纠正了这一点,它对我来说运行得很好.

Once I corrected that in your program, it ran just fine for me.

这篇关于光滑的文本字段不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆