Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

他クラスのフレームにパネルを追加

Title.javaで作ったパネルをMain.javaのフレームに表示
するにはどうすればいいですか?


//Main.java
//メインクラス
import javax.swing.*;
import java.awt.*;
class Main extends JFrame{
public static void main(String args[]){
Main mf = new Main("棒人間のRPG"); //フレーム作成




Main (String title){ //フレーム
setTitle(title); //タイトルを表示
setResizable(false); //サイズ変更不可
setSize(640, 480); //大きさ
setLocationRelativeTo(null); //真ん中に表示
ImageIcon icon = new ImageIcon("./img/icon.gif"); //
アイコン
setIconImage(icon.getImage()); //アイコン 
setLayout(new BorderLayout()); //レイアウトマネージ
ャー
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //×
を押した時終了
setVisible(true); //表示
}
}
//--------------------------------------------------
--------------------------------------------
//Title.java
import javax.swing.*;
import java.awt.*;
public class Title extends JPanel{
public static void title(){ //タイトル画面メゾット
JPanel tp = new JPanel(); //パネル「titlep」作成
tp.setPreferredSize(new Dimension(640, 480)); //パネ
ルのサイズ
tp.setOpaque(false); //パネルの色は透明
tp.setLayout(new FlowLayout()); //レイアウトマネージ
ャー

JLabel titlel = new JLabel(); //ラベル作成
ImageIcon titlepng = new 
ImageIcon("./img/title.png"); //変数titlepngにアイコ
ンをセット
titlel.setIcon(titlepng); //画像をラベルにセット
tp.add(titlel); //パネルにラベルをセット
}
}

15

回答

12263

閲覧

15件の回答

評価

0

class Hoge{
  static void add(int a,int b){
    int c=a+b;
  }
}
のcを他のクラスで使うにはどうしたらいいか、と言ってるの
と同じなんだが。
これも分からないのなら、Swingは一旦止めて、基礎から勉強
しないとだめだ。

評価

0

こうですよね?
//Main.java
public class Main {
    public static void main(String[] args) {
        int a=new 
java.util.Scanner(System.in).nextInt();
        int b=new 
java.util.Scanner(System.in).nextInt();
        int c=Hoge.add(a,b);
        System.out.print(a+"+"+b+"="+c);
    }    
}
----------------------------------------------
//Hoge.java
class Hoge{
  static int add(int a,int b){
    int c=a+b;
    return c;
  }
}

評価

0

それが分かるなら、intがJPanelでも分かるはすなんだがな。

評価

0

ヒントありがとうございます。引数として渡すことができ
ました。
ただTitle.javaの
Container contentPane = getContentPane();
contentPane.add(tp);
がエラーになってしまいます。どうすればいいですか?

//Main.java
import javax.swing.*;
import java.awt.*;
class Main extends JFrame{
  public static void main(String args[]){
    Main mf = new Main("棒人間のRPG"); //フレーム作

    Title.title(mf);
  } 
  
    Main (String title){ //フレーム
    setTitle(title); //タイトルを表示
    setResizable(false); //サイズ変更不可
    setSize(640, 480); //大きさ
    setLocationRelativeTo(null); //真ん中に表示
    ImageIcon icon = new 
ImageIcon("./img/icon.gif"); //アイコン
    setIconImage(icon.getImage()); //アイコン    
    setLayout(new BorderLayout()); //レイアウトマネ
ージャー
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
//×を押した時終了
    setVisible(true); //表示
  }
}

//--------------------------------------------------
//Title.java
import javax.swing.*;
import java.awt.*;
public class Title extends JFrame{
    public static void title(JFrame mf){ //タイトル
画面メゾット
    JPanel tp = new JPanel(); //パネル「titlep」作成
    tp.setPreferredSize(new Dimension(640, 480)); //
パネルのサイズ
    tp.setOpaque(false); //パネルの色は透明
    tp.setLayout(new FlowLayout()); //レイアウトマネ
ージャー
    
    JLabel titlel = new JLabel(); //ラベル作成
    ImageIcon titlepng = new 
ImageIcon("./img/title.png"); //変数titlepngにアイコ
ンをセット
    titlel.setIcon(titlepng);  //画像をラベルにセッ

    tp.add(titlel); //パネルにラベルをセット
    
    Container contentPane = getContentPane();
    contentPane.add(tp);
    }
}

評価

0

追記です
Container contentPane = getContentPane();
contentPane.add(tp);
だと「staticでないメソッドgetContentPane()をstaticコ
ンテキストから参照する事はできません」
と表示され
Container contentPane = tp;
contentPane.add(tp);
にするとコンパイルはできますが実行中に
run:
Exception in thread "main" 
java.lang.IllegalArgumentException: adding 
container's parent to itself
    at 
java.awt.Container.checkAddToSelf(Container.java:477
)
    at 
java.awt.Container.addImpl(Container.java:1088)
    at 
java.awt.Container.add(Container.java:415)
    at Title.title(Title.java:16)
    at Main.main(Main.java:7)
と表示されます

評価

0

あー、引数使ったのがまずかったか。
こちらとしては、戻り値に注目して欲しかったんだが。

ま、引数として渡しても可能なことは可能なんだが。
getContentPane()が何を意味してるかをちゃんと把握できれ
ば、というか「何をどこに追加(add)するのか」を忘れてな
ければ、contentPane = tpという思い付きのコードではだめな
ことくらい、予想できそうなもんだが。

評価

0

エラーは起きなくなりましたがフレームに何も表示されま
せん。
//Main.java
//フレーム作成
import javax.swing.*;
import java.awt.*;
final class Main extends JFrame{
  public static void main(String args[]){
    Main mf = new Main("棒人間のRPG"); //フレーム作

  } 
  
    Main (String title){ //フレーム
    setTitle(title); //タイトルを表示
    setResizable(false); //サイズ変更不可
    setSize(640, 480); //大きさ
    setLocationRelativeTo(null); //真ん中に表示
    ImageIcon icon = new 
ImageIcon("./img/icon.gif"); //アイコン
    setIconImage(icon.getImage()); //アイコン    
    setLayout(new BorderLayout()); //レイアウトマネ
ージャー
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
//×を押した時終了
    setVisible(true); //表示
    Container contentPane = getContentPane();
    gra(contentPane);
    }
    public static void gra(Container contentPane){
        JPanel tp =Title.title();
        contentPane.add(tp);
    }
}

//Title.java
//タイトル画面クラス
import javax.swing.*;
import java.awt.*;
public class Title extends JFrame{
    public static JPanel title(){ //タイトル画面メソ
ッド
    JPanel tp = new JPanel(); //パネル「titlep」作成
    tp.setPreferredSize(new Dimension(640, 480)); //
パネルのサイズ
    tp.setOpaque(false); //パネルの色は透明
    tp.setLayout(new FlowLayout()); //レイアウトマネ
ージャー

    JLabel titlel = new JLabel(); //ラベル作成
    ImageIcon titlepng = new 
ImageIcon("./img/title.png"); //変数titlepngにアイコ
ンをセット
    titlel.setIcon(titlepng);  //画像をラベルにセッ

    tp.add(titlel); //パネルにラベルをセット
    return tp;
    }
}

評価

0

何を丸投げしているんだ。

評価

0

すみません。。
追記です。2015-03-22 14:51:49のコードだと一度ウィンドウ
を最小化してもう一度ウィンドウを表示すると画像が表示さ
れました。

評価

0

そういう状況に陥った人が他にいないか、手を尽くして検索
してみる。
よほど専門的な(つまり業務的な)話でない限り、今ハマっ
ていることは、大抵過去、何人も同じようにハマっている。
この考え方を持っているかどうかで色々と変わって来るか
ら、是非覚えておいて欲しいな。

評価

0

直接的な原因は分からないけど
現状のコードは複雑だから原因が掴みにくいんじゃないかな

TitleクラスなんかJFrameを継承しているのに
public static JPanel title(){ 
で定義されていて、JFrameを継承する意味なさそうだし。

サンプルレベルでそうするのは分かるんだけど
こういうのを見ると何か意図があるとして見るから
時間がかかって回答が得られ難いと思う。

評価

0

再表示のタイミングで表示される、という一点なんたがな。
実際、流れが間違ってる訳じゃない(ちょっと変えたらうち
では即座に表示された)。
それをどういうキーワードで、引っ掛けるかという話。

評価

0

色々調べると再描画という言葉が出てきました。
ただstaticメソッド関係のエラーでうまくできません。ま
たパネルのprint(Graphics g)をオーバーライドしてそこ
で背景を描画したいのですがやり方を教えて下さい。
//----------------------------------------
//Frame.java
import javax.swing.*;
import java.awt.*;
final class Frame extends JFrame{//メイン
  public static void main(String args[]){
    Frame mf = new Frame("棒人間のRPG"); //フレーム
作成
  } 

    Frame (String title){ //フレーム
    setTitle(title); //タイトルを表示
    setResizable(false); //サイズ変更不可
    setSize(640, 480); //大きさ
    setLocationRelativeTo(null); //真ん中に表示
    ImageIcon icon = new 
ImageIcon("./img/icon.gif"); //アイコン
    setIconImage(icon.getImage()); //アイコン 
    setLayout(new BorderLayout()); //レイアウトマネ
ージャー
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
//×を押した時終了
    setVisible(true); //表示
    Container contentPane = getContentPane(); 
//contentPane取得
    Panel.panel(contentPane);//パネル切り替えメソッ
ドに取得したcontentPaneを渡す
    }
}
//--------------------------------------------------
//Title.java
import javax.swing.*;
import java.awt.*;
public class Title extends JPanel{
    public static void title(Container contentPane){ 
//タイトル画面メソッド
    JPanel tp = new JPanel(); //パネル「titlep」作成
    tp.setPreferredSize(new Dimension(640, 480)); //
パネルのサイズ
    tp.setOpaque(false); //パネルの色は透明
    tp.setLayout(new FlowLayout()); //レイアウトマネ
ージャー

    JLabel titlel = new JLabel(); //ラベル作成
    ImageIcon titlepng = new 
ImageIcon("./img/title.png"); //変数titlepngにアイコ
ンをセット
    titlel.setIcon(titlepng);  //画像をラベルにセッ

    tp.add(titlel); //パネルにラベルをセット
    
    contentPane.add(tp); //フレームにセット
    }
}
//-------------------------------------------------
//Panel.java
//パネル切り替え
import javax.swing.*;
import java.awt.*;
public class Panel extends JPanel{
            public static void panel(Container 
contentPane){
                Title.title(contentPane);
                //repaint(); 
        }
}

評価

0

>staticメソッド関係のエラーでうまくできません。
前回も類似だがrepaint()はどこの持ち物なのか。

>やり方を教えて下さい。
こういう聞き方をしたくなったら、まず検索する癖を付け
る。
それがないといつまでも人に頼り続けることになる。

評価

0

もう少しコードを単純にした方がいいと・・・

>ただstaticメソッド関係のエラーでうまくできません。
以下のコードに置き換えても正常に動作しませんが、あなたの環境では動作するということですか

repaintの話が持ち上がっていますが
私は1行だけ呼び出し位置を変更すると正常に動作しました。
http://www.javadrive.jp/tutorial/jlabel/index6.html
いくつかサイトを確認しましたが、あなたのようにそのメソッドをその位置で呼び出しているサイトはありませんでした。

私はswingに詳しくないのでrepaintの呼び出しでも解決できるかもしれませんが。

package test;

//----------------------------------------
//Frame.java
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
final class Frame extends JFrame{//メイン
  public static void main(String args[]){
    Frame mf = new Frame("棒人間のRPG"); //フレーム作成
  }
  Frame (String title){ //フレーム
    setTitle(title); //タイトルを表示
    setResizable(false); //サイズ変更不可
    setSize(640, 480); //大きさ
    setLocationRelativeTo(null); //真ん中に表示
    ImageIcon icon = new ImageIcon("./2.png"); //アイコン
    setIconImage(icon.getImage()); //アイコン
    setLayout(new BorderLayout()); //レイアウトマネージャー
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //×を押した時終了
    setVisible(true); //表示
    Container contentPane = getContentPane();
    //contentPane取得

    //タイトル画面メソッド
    JPanel tp = new JPanel(); //パネル「titlep」作成
    tp.setPreferredSize(new Dimension(640, 480)); //パネルのサイズ
    tp.setOpaque(false); //パネルの色は透明
    tp.setLayout(new FlowLayout()); //レイアウトマネージャー

    JLabel titlel = new JLabel(); //ラベル作成
    ImageIcon titlepng = new ImageIcon("./header.png"); //変数titlepngにアイコンをセット
    titlel.setIcon(titlepng);  //画像をラベルにセット
    tp.add(titlel); //パネルにラベルをセット

    contentPane.add(tp); //フレームにセット
  }
}

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。