JavaFXで表に画像を表示できなくて困っています。 – java javafx exception

質問:


学校でソーシャルゲームを作っている最中、編成画面のために配列を解読して表を作成するプログラムを作ろうとした所、ResourceBundleがnullでセル内部に画像を表示できない状況です。

Cards.javaの最終的なコード:

class csvData{
// 列数
static int NUMBER = 5+1+10+3+2+5+3+3;//chara
static String[][] charlist = csvlist_hen.setload("_chara.csv",NUMBER);
static String[][] wepidlist = csvlist_hen.setload("_wep.csv",13);
static String[][] abidlist = csvlist_hen.setload("_ability.csv",14);
}

class cmain{
    private String here = (getClass().getResource("./")).toString();//※追加箇所
    private Image cimage;
    private int x = 0;
    private int y = 0;
    public Image getcimage(){
        if(this.cimage != null){ 
            return this.cimage;
        }else{
            return null;
        }
    }
    public int getx(){
        return this.x;
    }
    public int gety(){
        return this.y;
    }
    cmain(){
        try {
            this.cimage = new Image(here + "../card/null_smn_64.png");//※修正箇所
        }catch (Exception e){
            System.out.println("(@・^∧・'@)" + e);
        }
        this.x = 0;
        this.y = 0;
    }
    public void setcimage(String imghead,String x,String y){
        if(imghead != null){ 
            try {
                this.cimage = new Image(here + "../card/" + imghead + "_smn_64.png");//※修正箇所
            }catch (Exception e){
                System.out.println("(@・^∧・'@)" + e);
                System.out.println("(@・^∧・'@)" + imghead);
            }
            this.x = Integer.parseInt(x);
            this.y = Integer.parseInt(y);
        }else{
            try {
                this.cimage = new Image(here + "../card/null_smn_64.png");//※修正箇所
            }catch (Exception e){
                System.out.println("(@・^∧・'@)" + e);
            }
            this.x = 0;
            this.y = 0;
        }
    }
}
public class Cards {
private String cardid;
private String cname;
private String Ptype;
private String atk;
private String hp;
private String rensya;
private String spd;
private String wep;
private String ability;
private String length;
private String weptype;
private cmain cmain = new cmain();

//public Cards(String[][] carr,int num) {
Cards(String[][] carr,int num) {
    int _cid = -1;
    this.cname = "null";
    this.Ptype = " ";
    this.atk = "0";
    this.length = "0";
    this.rensya = "0";
    this.hp = "0";
    this.spd = "0";
    this.weptype = " ";
    this.cardid = "null#0#0";
    this.wep = "なし";
    if(carr != null && csvData.charlist != null){ 
        if(carr[num] != null){
            if(carr[num][0] != null && carr[num][1] != null){
                _cid = csvlist_hen.searchCard(csvData.charlist,carr[num][0],carr[num][1]);
            }
        }
    } 
    if(_cid != -1 && csvData.charlist[_cid] != null){ 
        setcname(csvData.charlist[_cid][3]);
    setPtype(csvData.charlist[_cid][4]);
    //5
    setatk(this.atk = csvData.charlist[_cid][6]);//6-7
    //8-9
    setlength(csvData.charlist[_cid][10]);//10-11
    setrensya(csvData.charlist[_cid][12]);//12-13
    sethp(csvData.charlist[_cid][14]);//14-15
    setspd(csvData.charlist[_cid][16]);//16
    setweptype(csvData.charlist[_cid][17]);//17-18 19
    setcardid(csvData.charlist[_cid][20] + "#" + csvData.charlist[_cid][23] + "#" + csvData.charlist[_cid][24]);
    //20-24 25
    setability(csvData.charlist[_cid][26]);//26-27
    setwep("なし");
        this.cmain.setcimage(csvData.charlist[_cid][20],csvData.charlist[_cid][23],csvData.charlist[_cid][24]);
    }
}

public void setcard(String[][] carr,int num) {
    int _cid = -1;
    this.cname = "null";
    this.Ptype = " ";
    this.atk = "0";
    this.length = "0";
    this.rensya = "0";
    this.hp = "0";
    this.spd = "0";
    this.weptype = " ";
    this.cardid = "null#0#0";
    this.wep = "なし";
    if(carr != null && csvData.charlist != null){ 
        if(carr[num] != null){
            if(carr[num][0] != null && carr[num][1] != null){
                _cid = csvlist_hen.searchCard(csvData.charlist,carr[num][0],carr[num][1]);
            }
        }
    } 
    if(_cid != -1 && csvData.charlist[_cid] != null){ 
        setcname(csvData.charlist[_cid][3]);
    setPtype(csvData.charlist[_cid][4]);
    //5
    setatk(this.atk = csvData.charlist[_cid][6]);//6-7
    //8-9
    setlength(csvData.charlist[_cid][10]);//10-11
    setrensya(csvData.charlist[_cid][12]);//12-13
    sethp(csvData.charlist[_cid][14]);//14-15
    setspd(csvData.charlist[_cid][16]);//16
    setweptype(csvData.charlist[_cid][17]);//17-18 19
    setcardid(csvData.charlist[_cid][20] + "#" + csvData.charlist[_cid][23] + "#" + csvData.charlist[_cid][24]);
    //20-24 25
    setability(csvData.charlist[_cid][26]);//26-27
    setwep("なし");
        this.cmain.setcimage(csvData.charlist[_cid][20],csvData.charlist[_cid][23],csvData.charlist[_cid][24]);
    }
}

    public Image getcimage(){
        Image ci = this.cmain.getcimage();
            System.out.println("(@・^∧・'@)" + ci);
        if(ci != null){ 
            return ci;
        }
        return new Image("../card/null_smn_64.png");//※修正箇所の修正前はこのように"here+"がありませんでした
    }
    public int getx(){
        return this.cmain.getx();
    }
    public int gety(){
        return this.cmain.gety();
    }

public String getcardid() {
    if(this.cardid != null){ 
        return this.cardid;
    }
    return "null#0#0";
}
public String getcname() {
    if(this.cname != null){ 
    return this.cname;
    }
    return "なし";
}
public String getPtype() {
    if(this.Ptype != null){ 
    return this.Ptype;
    }
    return "なし";
}
public String getatk() {
    if(this.atk != null){ 
    return this.atk;
    }
    return "0";
}
public String getspd() {
    if(this.spd != null){ 
    return this.spd;
    }
    return "0";
}
public String getlength() {
    if(this.length != null){ 
    return this.length;
    }
    return "0";
}
public String getrensya() {
    if(this.rensya != null){ 
    return this.rensya;
    }
    return "0";
}
public String gethp() {
    if(this.hp != null){ 
    return this.hp;
    }
    return "0";
}
public String getweptype() {
    if(this.weptype != null){ 
    return this.weptype;
    }
    return "なし";
}
public String getability() {
    if(this.ability != null){ 
    return this.ability;
    } 
    return "なし";
}
public String getwep() {
    if(this.wep != null){ 
    return this.wep;
    }
    return "なし";
}
void setcardid(String title) {
    if(title != null){ 
        this.cardid = title;
    } 
}
void setcname(String title) {
    if(title != null){ 
    this.cname = title;
    } 
}
void setPtype(String title) {
    if(title != null){ 
    this.Ptype = title;
    } 
}
void setatk(String title) {
    if(title != null){ 
    this.atk = title;
    } 
}
void setlength(String title) {
    if(title != null){ 
    this.length = title;
    } 
}
void setrensya(String title) {
    if(title != null){ 
    this.rensya = title;
    } 
}
void sethp(String title) {
    if(title != null){ 
    this.hp = title;
    } 
}
void setspd(String title) {
    if(title != null){ 
    this.spd = title;
    } 
}
void setweptype(String title) {
    if(title != null){ 
    this.weptype = title;
    } 
}
void setability(String title) {
    if(title != null){ 
    this.ability = title;
    }
}
void setwep(String title) {
    if(title != null){ 
    this.wep = title;
    } 
}
}

インポートしたコード:

import java.net.URL;
import java.util.*;

import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TableView.TableViewSelectionModel;
import javafx.scene.control.TableCell;
import javafx.scene.control.cell.*;
import javafx.event.*;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.*;
import javafx.collections.*;
import javafx.geometry.Rectangle2D;
import javafx.geometry.Pos;
import javafx.beans.value.*;
import javafx.util.*;

import java.io.*;
import java.lang.*;

メインクラスの.java:

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.Parent;
import javafx.stage.Stage;

public class hentst extends Application{

private Stage stage;

public static void main(String[] args) {
    // JavaFX の実行
    launch(args);
    //Application.launch(args);
}

@Override
public void start( Stage primaryStage ) throws Exception{
    stage = primaryStage;
    Parent root= FXMLLoader.load(getClass().getResource("hen_.fxml"));
    stage.setScene(new Scene(root, 640, 400));
    stage.show();
}

}

質問者: Laclip

Laclip

【原因】
ResourceBundleがnullの時は相対パスが使えませんでした。
それでも相対パスにしないとフォルダを移動した時に修正が大変です。
【解決方法】

private String here = (getClass().getResource("./")).toString();

この様にファイルのある場所をstringで予め保存しておきます。

this.cimage = new Image(here + "../card/null_smn_64.png");

それを相対パスで指定している文字列の手前に付けます。
こうする事で相対パスを指定しても画像が表示できるようになりました。

出典

Related Posts:

leap_year.javaにコンパイルエラーが出る – java
質問: leap_year.java class leap_year{ int dim; int uruudosi(int yy); if((year % 4 == 0 && year ...
最高得点と最低得点を出したいのですが・・・ – java
質問: java内での入力 import java.io.*; class sample61{ public static void main(String args) throws IOException{ System.out.println("テストの受験者数を入力してください。"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); ...
Javaについて – java
質問: AはBのオブジェクトを生成してBを返す Bはレコードを追加する Cは引数にBのオブジェクトを持ち追加したレコードによってファイルを作成しそのファイル名を返す AとBはできましたがBで作成したlistをどうやってCに渡すかがわかりません public class A{ public B create(){ B b = new B() ...
Aizu Onlineジャッジ 二つのサイコロの一致 – java
質問: Aizu online, Introduction to Programming 11-3のサイコロの一致を判定する問題をJavaで解いているのですが、テストケース(6/35)しか通らず、どこが間違っているのかわかりません。 どなたか間違いが見つかったら教えていただいてもいいでしょうか。 BufferedReader reader=new BufferedReader(new InputStreamReader(System.in)); String str; String dice; ...
変数の値が増えたか減ったかの判定方法 – javascript swift php
質問: Swiftで実装したいのですがロジックが応用できればどんな言語でも構いません。とある変数の値(数字)が動的に変わるのですが、その変数の値が増えたのか減ったのかで処理を分岐させたいと思っています。コードは下記のような感じです。 if(変数の値が増えた){ print("変数の値が増えた!") }esle if(いや、変数の値が減った){ print("変数の値が減った!") } 実装の方法が思いつきません。アドバイスいただければ幸いです 質問者: ryosuke-hujisawa 変更前の値と変更後の値を配列にとって配列の最初と最後を比較することで解決しました 出典
nullpointerexceptionについて – java processing leap-motion
質問: こんにちは、エラーが出て困ってます。ご教授ください。 import ddf.minim.*; //minimライブラリのインポート Minim minim; //Minim型変数であるminimの宣言 AudioPlayer player ; //サウンドデータ格納用の変数 int i; import com.onformative.leap.LeapMotionP5; import com.leapmotion.leap.Finger; AudioPlayer loopSound; float x,y; LeapMotionP5 leap; void setup(){ minim = ...
androidで写真撮影した画像を直接sqliteに書き込みたい – android java android-studio
質問: androidで写真撮影した画像を直接sqliteに保存したいのですが上手くできません。 写真の撮影で指定のフォルダーに写真保存できるのですがsqliteに写真データの保存ができなく困っています。 BitmapDB.java public class BitmapDB extends SQLiteOpenHelper { /** * 画像管理テーブル名 */ public static final String SAVE_PHOTO_TABLE = "save_photo"; /** * カラム名 画像ファイル名 */ public static final String COLUMN_FILE_NAME ...
Javaで値を繰り返し入力し合計値が100を超える、または、10回入力が行われた場合に入力を止めそれまでの値を出力するプログラム – java
質問: Java初心者です。 値を繰り返し入力し合計値が100を超える、または、10回入力が行われた場合に入力を止めそれまでの値を出力するプログラムを作成しています。 Eclipseでループ処理と配列を使って書いているんですが、whileで条件を指定したところ、 以下の警告が出てしまいます。 ・演算子 < は引数の型 Scanner, int で未定義です スコープの外で定義していると思うのですが、 エラーが出てしまう理由がよくわからないので、 解決策を教えてください。 お願いします。 int s = new int; int input = 0; ...
オプションメニューの内容を動的に変更する(Kotlin) – android java kotlin
質問: オプションメニューの内容を動的に変更したいのですが、MenuItemのインスタンス作成時にエラーが出ます。参考サイト var item = MenuItem() kotlinの場合、参考サイトと同じようにできるのでしょうか? こちらにも同じ質問をしていますTeratail 質問者: hai123 yukihane 正攻法としては、Kotlin文法を学びJavaコードと対応付けられるようにする、ということになると思いますが、マルチポスト先ではそのよう指向されているようなので別の邪道を。 KotlinでAndroid開発を行っているということはおそらくAndroid Studio上で開発していると思われますが、JavaからKotlinへの変換機能があります。 Javaコードが既に存在しているのであれば、その機能で自動変換してやればそれなりのKotlinコードが得られます。 今回の場合、適当にダミーのActivityクラスを新規作成し、そのファイルに該当メソッドをペーストした後、上記の機能を使用すると次のように変換されます。 override fun onPrepareOptionsMenu(menu: Menu): Boolean { super.onPrepareOptionsMenu(menu) // メニューアイテムを取得 ...
既存プログラム改定についての作業ノウハウ [クローズ済み] – java sql
質問: 業務プログラム開発に携わって5年以上、製造ラインで作業員として働いている状況です。 今の開発現場で2000年頃から保守され続けているプログラムの改定作業をやることが多くあり、経験も重なってきている状況です。 作業内容として、改定依頼(不具合事案から原因の修正)→(私)原因調査→修正という流れが主なのですが、原因調査を深く追えず、ダメ出しを頻繁に受けています。 長い年数やっても、こんな体たらくですが、自分で選んだ仕事、お客さんにご迷惑おかけしないよう努めていきたい一心ではあるのですが、うまくやれません。 ホウレンソウも下手なので、かなり注意を払っています。 指摘側からの言葉から察するに、自己注意力を問われている感じはします。 みなさん、どんな風に気を付けられていますか? 質問者: shinji tutinoco なぜ自分は原因調査を深く追えないのか、その理由を考えてみてはどうでしょうか。 恐らく、あなたは自分と向き合う時期に立たされているのではないかと思われます。 頑張っているはずなのに、うまくやれないという心理状態は 本当は心の奥ではやりたくないと思っていることが多いです。 人が何か行うとき、本来「必要だから行う」のであって 「行わなければならない」というものではありません。 もしあなたが「行わなければならない」という心理状態になっているのだとしたら 現在の自分の状況や立場、これからの自分について深く考察し 「必要だから行う」という思考に切り替えていく必要があります。 一人で考えて迷ったり悩んだりした場合には、できるだけ大きな書店に足を運び 目に止まった本をかたっぱしから読むことをおすすめします。 最後に、スタックオーバーフローでは、このような質問は少々不適切なので 右上の「ヘルプ」に使い方の詳細が掲載されていますので、いちど目を通しておくと良いでしょう! 出典
データベースでシングルクォーテーションを有効にするには? – java mysql
質問: 超初心者です。データベースに登録するのにシングルクオーテーションが入ってるとエラーが出ます。どうしたらシングルクォーテーションが有効にできますか? 質問者: user24415 sql = "SELECT * FROM tbl WHERE name = '" + param +"'"; こういうコードで、paramにシングルクオーテーションを含んだ文字列、例えば123'456が入っていると、生成されるSQLは SELECT * FROM tble WHERE name = ...
error: No resource identifier found for attribute ‘latout_height’ in package ‘android’ の意味を教えてください – android java
質問: error: No resource identifier found for attribute 'latout_height' in package 'android' javaを利用していたところこのようなエラーが発生しました。解決方法を教えていだだけますか。 質問者: user5871 スペルミスが原因です。 latout_heightではなくlayout_heightとすればエラーがなくなりませんか? エラーメッセージを読んでも原因が分からないときはそのままエラーメッセージでググって、そのエラーメッセージがどういう状況のときに発生するかを調べるのも直接的な解決にはならなくても1つの方法だと思います。そのうちに発生パターンが分かってくると自分で間違いに気付けるようになるかもしれません。 ...
public object の使い方 – android java android-studio
質問: この質問は、次と完全に重複しています: is not public in ...
R.javaの中身 – android java eclipse
質問: このプログラムでのエラーを治していただける方、お願いします。 package a.a; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; public class A extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { ...
AndroidStudioのWebViewでステータスコード – java
質問: AndroidStudioでWebviewでステータスコードを取得するために参考サイトを見てコードを書いたのですがアプリが途中で落ちてしまいます。どうしたらアプリが落ちないようになるでしょうか? 参考http://saki0n.blogspot.jp/2013/04/android-webview.html public class MainActivity extends AppCompatActivity { private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { ...

You Might Also Like

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です