1

私の Java プロジェクトについて、本当の助けが必要です。これはコンソール制御の JFrame であり、コンソールに入力するコマンドは JFrame ウィンドウに反応する必要がありますが、反応しません。これは大きな問題です。これが私のコードです(Engine.java):

package com.boldchicky.commandsrpg.Main;

import java.io.*;

public class Engine {
public static boolean running;
public static GenerateWorld gw;

public static void main(String[] args) throws IOException{
    gw = new GenerateWorld();
    BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
    running = true;
    while(running){
        System.out.println("Enter a command:");
        String command = input.readLine();
        if(command.equalsIgnoreCase("move up")){
            gw.update(gw.getGraphics());
            GenerateWorld.x += GenerateWorld.dx;
            System.out.println("Moved!");
        } else {
            System.out.println(CommandControl.command(command));
        }
        if(CommandControl.add){
            String command2 = input.readLine();
            System.out.println(CommandControl.add(command2));
            CommandControl.add = false;
        }
        else if(CommandControl.remove){
            String command2 = input.readLine();
            System.out.println(CommandControl.remove(command2));
            CommandControl.remove = false;
        }
    }
    if(!running){
        System.exit(0);
    }
}
}

CommandControl.java:

package com.boldchicky.commandsrpg.Main;

import java.util.ArrayList;
import java.io.*;

public class CommandControl {
static ArrayList inv = new ArrayList();
public static boolean add = false;
public static boolean remove = false;
public static boolean move = false;
public static String commandReact = "";

public static String command(String command){
    BufferedReader input = new BufferedReader(new        InputStreamReader(System.in));
    if(command.equalsIgnoreCase("inventory")){
        if(inv.size() == 0){
            commandReact = "Empty!";
        }  else {
            commandReact = "";
            for(int i = 0; i<inv.size(); i++){
                commandReact += (String) inv.get(i) + "\n";
            }
        }
    }

    else if(command.equalsIgnoreCase("add")){
        add = true;
        commandReact = "What do you want to add?";
    }
    else if(command.equalsIgnoreCase("remove")){
        remove = true;
        commandReact = "Waht do you want to remove from your inventory?";
    }
    else{
        commandReact = "Please try again!";
    }
    return commandReact;
}

public static String add(String command){
    if(add){
        inv.add(command);
        commandReact = "Added!";
    }
    return commandReact;
}

public static String remove(String command){
    if(remove){
        if(inv.indexOf(command) != -1){
            inv.remove(inv.indexOf(command));
            commandReact = "Removed!";
        } else {
            commandReact = "Sorry! There is no " + command;
        }
    }
    return commandReact;
}
}

GenerateWorld.java:

package com.boldchicky.commandsrpg.Main;

import java.awt.*;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.image.*;
import java.io.File;
import java.io.IOException;

public class GenerateWorld extends JFrame{
public static int x = 0, y = 0, dx = 15, dy = 15;

public GenerateWorld() throws IOException{
    JFrame frame = new JFrame("Frame");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(300, 300);

    Image background = null;
    Image player = null;
    String backgroundPath = "C:\\Users\\Jesse Du\\Documents\\java eclipse\\CommandsRPG\\res\\grass.png";
    String playerPath = "C:\\Users\\Jesse Du\\Documents\\java eclipse\\CommandsRPG\\res\\player.png";
    background = ImageIO.read(new File(backgroundPath));
    player = ImageIO.read(new File(playerPath));
    ImagePanel panel = new ImagePanel(background, player);
    frame.getContentPane().add(panel);
    frame.show();

    frame.setLocationRelativeTo(getRootPane());
    frame.setResizable(false);
    frame.setVisible(true);
}
}

ImagePanel.java:

package com.boldchicky.commandsrpg.Main;

import java.awt.*;

import javax.swing.JPanel;

public class ImagePanel extends JPanel{
private Image backgroundImage;
private Image player;

public ImagePanel(Image background, Image player){
    super();
    this.backgroundImage = background;
    this.player = player;
}

public void paintComponent(Graphics g){
    super.paintComponent(g);
    g.drawImage(this.backgroundImage, 0, 0, null);
    g.drawImage(this.player, GenerateWorld.x, GenerateWorld.y, null);
}
}

ありがとう!:D

4

1 に答える 1

2

gwオブジェクトは、JFrame のインスタンスであるにもかかわらず、表示している JFrame ではありません。これは、コンストラクGenerateWorldターで、コンストラクター自体に対してローカルな JFrame が作成、設計、および表示されるためです。ローカル JFrame を作成する代わりに、superコンストラクターを使用してメソッドをスーパー インスタンスに適用します。

public GenerateWorld() throws IOException {
    super("Frame");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    // ... etc

また、この状況ではrepaint()、 ではなくを使用し、変更前ではなく変更update(Graphics)に呼び出す必要があります。

于 2012-09-26T23:51:16.867 に答える