• 締切済み

次のように書いたのですが、ウィンドウの背景色が白になりませんでした。setBackground辺りがおかしいと思うんですが。

本に書いてあった下記のプログラムを書いて実行したのですが、ウィンドウズの背景色が白になりませんでした。 setBackground(WHITE)をBLACKにしても、背景色は変わりません。 どこに問題があるのか教えていただけないでしょうか。 import javax.swing.JFrame; import java.awt.Color; import java.awt.Insets; public class GameTestMain { JFrame frame1; GameTestMain(){ frame1 = new JFrame("ゲームテスト"); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.setBackground(Color.WHITE); frame1.setResizable(false); frame1.setVisible(true); Insets insets = frame1.getInsets(); frame1.setSize(600 + insets.left + insets.right, 400 + insets.top + insets.bottom); frame1.setLocationRelativeTo(null); } public static void main(String[] args) { GameTestMain gtm = new GameTestMain(); } Eclipse3.0.1を使っています。 よろしくお願いしますm(_ _)m

みんなの回答

  • ssr-y6
  • ベストアンサー率71% (5/7)
回答No.3

 以前にLinux環境で同様の現象が起きたときには、 Eclipseが標準で使用する実行時ライブラリ(libgcj)をSunの実行時ライブラリに変更することでうまくいきました。  その本の著者さんは、IDEを使わずにプログラムを作って実行したのかもしれません。

全文を見る
すると、全ての回答が全文表示されます。
  • HarukaV49
  • ベストアンサー率53% (48/89)
回答No.2

私の見た目で言いますと、その本の内容は怪しく思えます。 まず、フレームを、直接操作しようとしているような姿勢は良くないと思います。 どいういことかというと、例えれば、ファイルをフォルダに分けずにルートに 全てのファイルを保存しようとしているような感じです。 フレームに対して、直接処理しているために、Insets等の技巧的な計算が 必要ななってしまいます。(Insetsを取得している位置も怪しい) フレームに、JPanelをaddして、そのJPanelに対してJPanel#setBackground() するのが、基本的な方法だと思います。 なぜ、JFrame#getContentPane()#setBackground()でなければならないかを 理解するためには、JFrameの構造を理解しないとなりません。 JFrameは、タイトルバー等も含めて全てがJFrameですので、その中の デフォルトでコンポーネントをaddして使用可能な領域がgetContentPane() で取得できるという感じです。 ですから、そこにバックグラウンドのカラーを設定する必要があります。  frame1.getContentPane().setBackground( Color.WHITE ); です。 初心者の人にとって、JFrameの構造を理解するのは少し難しい部分も あるかもしれませんが、JPanelを追加すれば、それを意識しなくても 済むようになります。 frame1 = new JFrame("ゲームテスト"); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.setResizable(false); frame1.setVisible(true); Insets insets = frame1.getInsets(); frame1.setSize(600 + insets.left + insets.right, 400 + insets.top + insets.bottom); frame1.setLocationRelativeTo(null); JPanel panel = new JPanel(); frame1.add( panel ); //  または frame1.getContentPane().add( panel ); panel.setBackground( Color.WHITE ); こんな感じです。 >ウィンドウの背景色を「frame1.setBackground(Color.WHITE);」 >という文で変える事は無理なんでしょうか? 無理です。間違っています。 繰り返しますが、JPanelをaddしておけば、直感と一致して、  panel.setBackground( Color.WHITE ); で、バックグランドの色が設定できます。 >間違った事が書かれてるなら、違う本で勉強した方がいいのでしょうか? 私としては、まずJavaは、オブジェクト指向設計の考え方が示されている 書籍から勉強を始めることをお勧めします。 ゲームプログラミングは、リアルタイム性が要求される部分がありますので、 Javaで行うためには、技巧的な事をしなければなくなる部分がどうしても出てきます。 そういう事を初めに身に付けてしまうことの弊害は、個人的にはかなり大きいと 考えます。

shuri55
質問者

補足

返信が遅れて大変申し訳ありません。 落ち込んで気力が無くなってました。 本屋に行き、片っ端から眺めてみたのですが、Jflameが索引に載ってる本は置いてありませんでした。 >私としては、まずJavaは、オブジェクト指向設計の考え方が示されている >書籍から勉強を始めることをお勧めします。 よろしければお奨めのオブジェクト指向の考え方が示されてる本を教えていただけないでしょうか。 結城浩という方が書いた「JAVA言語プログラミングレッスン 上・下」は読み終えているので、基礎の基礎は出来てはいると思います。 返信が遅れた上に申し訳ないのですが、宜しくお願いいたしますm(_ _)m

全文を見る
すると、全ての回答が全文表示されます。
  • bgbg
  • ベストアンサー率53% (94/175)
回答No.1

JFrameにおいて、Windowの中身の描画に関することは、そのWindowのContentPaneに対して行う必要があります。 Container pane = frame1.getContentPane(); pane.setBackground(Color.WHITE);

shuri55
質問者

補足

回答ありがとうございます。 教えていただいた事を元に調べたのですが、調べているうちに混乱してしまいました。 ウィンドウの背景色を「frame1.setBackground(Color.WHITE);」という文で変える事は無理なんでしょうか? このプログラムは「15歳からはじめるJAVAゲームプログラミング教室」という本に載ってるままだと思うんですが、JAVAのバージョンアップなどによって、上記のような形ではできなくなったんでしょうか? それとも著者自身が間違った事を書いてるのでしょうか? 2005年4月に初版が発行された本みたいなんですが・・・。 ちなみにこの本です。 http://www.amazon.co.jp/dp/4899771053 間違った事が書かれてるなら、違う本で勉強した方がいいのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • eclipseにて~背景色が表示されない~

    JAVAゲームプログラムミング教室という本でただいまゲームを作っているのですが 本にそって、それどおりに進めていたのですが、ウィンドウの背景色を決めるところでエラーも出ていないのに指定された背景色になりません 以下にプログラムを書きます package jp.aroro.minigame; import java.awt.Color; import java.awt.Insets; import javax.swing.JFrame; public class GameTestMain { JFrame frame1; GameTestMain(){ frame1=new JFrame("ゲームテスト"); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.setBackground(Color.WHITE); frame1.setResizable(false); frame1.setVisible(true); Insets insets = frame1.getInsets();// frame1.setSize(600+insets.left+insets.right,400+insets.top+insets.bottom); frame1.setLocationRelativeTo(null); } public static void main(String[] args) { GameTestMain gtm = new GameTestMain(); } } flame1のセットに関してはカラー以外問題なく実行されており、コンパイラ時にもエラーが出ません。 しかし、背景色は表示されません。 本の実際の実行画面では無色?→白色となっておるのですが、無色(グレーみたいな)のままです。 ちなみにEclipseのバージョンは3.0.1で 関係あるか分かりませんが Java Runtime Environment Version 6 Update 2 というものもダウンロードしてあります。 原因が分かる方はご教授ください。

    • ベストアンサー
    • Java
  • Javaでパラパラアニメを作成するには、

    どうしたらいいのでしょうか。 初心者なのにイキナリ作ることになってしまいました。 5枚の絵をループでアニメーションさせたいのですが。 フレームを作るところまでは出来たのですが、その先がよく分かりません。どのようにして画像を読み込んで一定のタイミングではなくそれぞれの絵のタイミングでアニメさせればいいのでしょうか、お願い致します。 import java.awt.Insets; import javax.swing.JFrame; public class Animetion { static JFrame frame1; Animetion(){ frame1 = new JFrame("アニメ"); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.setVisible(true); } public static void main(String[] args) { Animetion gtm = new Animetion(); //インスタンス Insets insets = frame1.getInsets(); frame1.setSize(600 + insets.left + insets.right,400 + insets.top + insets.bottom); } }

    • ベストアンサー
    • Java
  • javaの質問です。24フォントでg.drawString表示した文字

    javaの質問です。24フォントでg.drawString表示した文字に、8フォントのg.drawStringをy軸をいじり、ふりがなをつけたいのです。24フォントの文字の上に8フォントを表示するのだからx軸を3倍し、24フォントの半分の12を足せばいい(ふりがなが一文字の場合)とおもっていたのですが。24フォントの「あ*10」と8フォントの「あ*30」を表示し試したところ少しずつずれているようです。(以下のプログラムで試してみました)。x軸を揃え表示するためにはどうすればいいでしょうか import javax.swing.*; import java.awt.*; import java.awt.image.*; import java.util.*; public class MojiTest2 { JFrame frame1; BufferStrategy bstrategy; MojiTest2(){ frame1=new JFrame("ゲームテスト"); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.setBackground(Color.WHITE); frame1.setResizable(false); frame1.setVisible(true); Insets insets = frame1.getInsets(); frame1.setSize(800 + insets.left + insets.right,600 + insets.top + insets.bottom); frame1.setLocationRelativeTo(null); frame1.setIgnoreRepaint(true); frame1.createBufferStrategy(2); bstrategy = frame1.getBufferStrategy(); java.util.Timer t=new java.util.Timer(); t.schedule(new MyTimerTask(),2,15); } public static void main(String args[]){ MojiTest2 gtm =new MojiTest2(); } class MyTimerTask extends TimerTask{ int line = 0; int position = 0; String[] messages = { "あelloWorlハローワールド", "あいうあいうあいうあいうあいうあいうあいうあいうあい", "年収うううう万円の米市職員退職"}; @Override public void run() { Graphics g = bstrategy.getDrawGraphics(); if(bstrategy.contentsLost()==false){ Insets insets = frame1.getInsets(); g.clearRect(insets.left,insets.top,insets.right - insets.left,insets.bottom - insets.top); g.translate(insets.left,insets.top); g.setColor(Color.BLUE); g.setFont(new Font("MS ゴシック",Font.BOLD,24)); g.drawString(messages[line].substring(0,position), 76,500 + 40 * line); g.drawString("ああああああああああああああああああああ", 76, 480); if((line==2) && (position==2)){ g.setFont(new Font("MS ゴシック",Font.BOLD,8)); g.drawString("ああああああああああああああああああああああああああああああ" + "ああああああああああああああああああああああああああああああ", 76, 460); }if(position < messages[line].length()){ position += 1; }else if(line == messages.length - 1){ }else{ position = 0; line += 1; } } bstrategy.show(); } } }

    • ベストアンサー
    • Java
  • index0920さん

    index0920さん javaの質問です なぜ以下のプログラムがループするのかがわかりません 文字列を全文出し切った時点でとめたいのですがどうすればいいでしょうか? 方法と解説をおねがいします。 import javax.swing.*; import java.awt.*; import java.awt.image.*; import java.util.*; import java.util.concurrent.TimeUnit; public class MojiTest0730 { JFrame frame1; BufferStrategy bstrategy; MojiTest0730(){ frame1=new JFrame("ゲームテスト"); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.setBackground(Color.WHITE); frame1.setResizable(false); frame1.setVisible(true); Insets insets = frame1.getInsets(); frame1.setSize(800 + insets.left + insets.right,600 + insets.top + insets.bottom); frame1.setLocationRelativeTo(null); frame1.setIgnoreRepaint(true); frame1.createBufferStrategy(2); bstrategy = frame1.getBufferStrategy(); java.util.Timer t=new java.util.Timer(); t.schedule(new MyTimerTask(),30,150); } public static void main(String args[]){ MojiTest0730 gtm =new MojiTest0730(); } class MyTimerTask extends TimerTask{ int line = 0; int position = 0; String[] messages = { "Hello、Worldハローワールド", "aaa", "年収7000万円 の米市職員退職"}; @Override public void run() { Graphics g = bstrategy.getDrawGraphics(); if(bstrategy.contentsLost()==false){ Insets insets = frame1.getInsets(); g.clearRect(insets.left,insets.top,insets.right - insets.left,insets.bottom - insets.top); g.translate(insets.left,insets.top); g.setColor(Color.BLUE); g.setFont(new Font("MS ゴシック",Font.BOLD,24)); g.drawString(messages[line].substring(0,position), 200,500 + 40 * line); System.out.println(messages[line].substring(0,position)); if((line==2) && (position==2)){ g.setFont(new Font("MS ゴシック",Font.BOLD,12)); //g.drawString(messages2[line].substring(0,position), 200,500 + 40 * line); g.drawString("ねん", 200, 560); } if(position < messages[line].length()){ position += 1; }else if(line == messages.length - 1){ position += 1; }else{ position = 0; line += 1; } } bstrategy.show(); g.dispose(); } }

    • ベストアンサー
    • Java
  • javaの質問ですdrawStringを使いゲームのオートモードの文字

    javaの質問ですdrawStringを使いゲームのオートモードの文字を描写しているのですが、そのオートモードに描画される文字とふり仮名を同じタイミングで描写するプログラムを打ちたいのですがどうすればよろしいでしょうか? できればループを抜ける方法もお願いします。初心者質問ですみません。 import javax.swing.*; import java.awt.*; import java.awt.image.*; import java.util.*; public class test0725 { JFrame frame1; BufferStrategy bstrategy; test0725(){ frame1=new JFrame("ゲームテスト"); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.setBackground(Color.WHITE); frame1.setResizable(false); frame1.setVisible(true); Insets insets = frame1.getInsets(); frame1.setSize(800 + insets.left + insets.right,600 + insets.top + insets.bottom); frame1.setLocationRelativeTo(null); frame1.setIgnoreRepaint(true); frame1.createBufferStrategy(2); bstrategy = frame1.getBufferStrategy(); java.util.Timer t=new java.util.Timer(); t.schedule(new MyTimerTask(),10,50); } public static void main(String args[]){ test0725 gtm =new test0725(); } class MyTimerTask extends TimerTask{ int line = 0; int position = 0; String[] messages = { "Hello新着メッセージなしを読む", "aaa", "年収7000万円の米市職員退職" }; @Override public void run() { Graphics g = bstrategy.getDrawGraphics(); if(bstrategy.contentsLost()==false){ Insets insets = frame1.getInsets(); g.clearRect(insets.left,insets.top,insets.right - insets.left,insets.bottom - insets.top); g.translate(insets.left,insets.top); g.setColor(Color.BLUE); g.setFont(new Font("MS ゴシック",Font.BOLD,24)); for(int i = 0;i < line ;i++){ //g.drawString(messages[i], 200,500 + 40 * i); } System.out.println(messages[line].substring(0,position)); g.drawString(messages[line].substring(0,position), 200,500 + 40 * line); if(line==2){ line=0; } if(line==1){ g.drawString("ありがとう", 50, 50); } if(position < messages[line].length()){ position += 1; }else if(line == messages.length - 1){ }else{ position = 0; line += 1; } } bstrategy.show(); g.dispose(); } } }

  • javaでのコンテントペインの使い方についてです

    public class GameTestMain { JFrame frame1; BufferStrategy bstrategy; int count = 0; GameTestMain(){ frame1 = new JFrame("ゲームテスト"); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.setVisible(true); Insets insets = frame1.getInsets(); frame1.setSize(600 + insets.left + insets.right, 400 + insets.top + insets.bottom); frame1.setResizable(false); frame1.setLocationRelativeTo(null); Container pane = frame1.getContentPane(); pane.setBackground(Color.WHITE); frame1.setIgnoreRepaint(true); frame1.createBufferStrategy(2); bstrategy = frame1.getBufferStrategy(); Timer t = new Timer(); t.schedule(new MyTimerTask(), 0, 500); } public static void main(String[] args) { GameTestMain gtm = new GameTestMain(); } class MyTimerTask extends TimerTask{ public void run () { Graphics g = bstrategy.getDrawGraphics(); if (bstrategy.contentsLost()==false){ Insets insets = frame1.getInsets(); g.translate(insets.left, insets.top); g.setColor(Color.BLUE); g.fillRect(0, 0, 100, 100); bstrategy.show(); g.dispose(); } } } } (文字数の関係でimport文は省略) 四角形を表示させる部分を追記したところ、背景が白でなくなってしまいました。 以前、Jframeに直接描写するのではなく、コンテントペインという透明レイヤーのインスタンスを取得し、そこに色々と表示させていくということを耳にしました。 背景を白にしたのが反映されないのは、四角形をコンテントペインのインスタンスでなくframe1に直接表示させているからではないかと思うのですが、背景の時に作製した「pane」とは別に新しくコンテントペインのインスタンスを取得し、そこに描写するのがいいでしょうか? どちらにしてもコンテントペインのインスタンスに四角形を描写する方法がわかりません。 背景の部分についてはネットで同じような質問をされている方がいたので、 その回答を元に記入しました。 今読んでいる入門本、「JAVAわくわくゲームプログラミング教室」だとコンテントペインなしで解説されているのですが、せっかくなのでコンテントペインも同時に導入しながら進めたいです。 これからこの本で簡単なゲームを作成するところまでやっていきますので、 コンテントペインの大まかな仕組みや使い方を理解していなければ同じように躓くと思います。 なので、今この場を切り抜ける方法も教えて欲しいのですが、コンテントペインの使い方がわかる書籍なども知っている方がいれば教えていただけないでしょうか。 よろしくお願いします。

  • javaの質問です ボタンを右、左クリックすることでswitch文を切

    javaの質問です ボタンを右、左クリックすることでswitch文を切り替えたいのですがどうすればいいでしょうか?できれば直接以下のプログラムを直してしまってください。 import java.awt.*; import java.awt.image.*; import java.util.*; import java.util.Timer; public class MojiTest0817 { JFrame frame1; BufferStrategy bstrategy; MojiTest0817(){ frame1=new JFrame("ゲームテスト"); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.setBackground(Color.WHITE); frame1.setResizable(false); frame1.setVisible(true); Insets insets = frame1.getInsets(); frame1.setSize(800 + insets.left + insets.right,600 + insets.top + insets.bottom); frame1.setLocationRelativeTo(null); frame1.setIgnoreRepaint(true); frame1.createBufferStrategy(2); bstrategy = frame1.getBufferStrategy(); java.util.Timer t=new java.util.Timer(); t.schedule(new MyTimerTask(),2,15); } public static void main(String args[]){ MojiTest0817 gtm =new MojiTest0817(); } class MyTimerTask extends TimerTask{ int line = 0; int position = 0; //表示する文字列の配列 String[] messages = { "あelloWorlハローワールド", "あいうあいうあいう", "年収うううう万円の米市職員退職"}; String[] messages2 = { "あんかけちゃーはん", "回答が寄せられるよう、以下を参考にたち", "2教えて!goo では"}; @Override public void run() { int sen=1; Graphics g = bstrategy.getDrawGraphics(); switch(sen){ case 1: if(bstrategy.contentsLost()==false){ System.out.println(messages[line].substring(0,position)); if(position < messages[line].length()){ position += 1; }else if(line == messages.length - 1){ }else{ position = 0; line += 1; } } bstrategy.show(); break; case 2: Graphics g2 = bstrategy.getDrawGraphics(); if(bstrategy.contentsLost()==false){ System.out.println(messages[line].substring(0,position)); if(position < messages2[line].length()){ position += 1; }else if(line == messages2.length - 1){ }else{ position = 0; line += 1; } } bstrategy.show(); break; } } } }

  • eclipseで以下のようなプログラムを書いて、それをjar形式でエクスポートしました。

    eclipseで以下のようなプログラムを書いて、それをjar形式でエクスポートしました。 しかし、そのjarファイルをクリックして開こうとすると「could not find main class」と出てききます。どうすればいいのでしょうか public class GameTestMain { /** * @param args */ JFrame frame1; BufferStrategy bstrategy; int count = 0; BufferedImage backimage1, backimage2; GameTestMain() { frame1 = new JFrame("ノベルゲーム"); frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame1.setBackground(Color.WHITE); frame1.setResizable(false); frame1.setVisible(true); Insets insets = frame1.getInsets(); frame1.setSize(600 + insets.left + insets.right, 400 + insets.top + insets.bottom); frame1.setLocationRelativeTo(null); frame1.setIgnoreRepaint(true); frame1.createBufferStrategy(2); bstrategy = frame1.getBufferStrategy(); try { backimage1 = ImageIO.read(getClass().getResource("img1.jpg")); backimage2 = ImageIO.read(getClass().getResource("img2.jpg")); } catch (IOException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } Timer t = new Timer(); t.schedule(new MyTimerTask(), 10, 500); } public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ GameTestMain gtm = new GameTestMain(); } class MyTimerTask extends TimerTask { public void run() { Graphics g = bstrategy.getDrawGraphics(); if (bstrategy.contentsLost() == false) { Insets insets = frame1.getInsets(); g.translate(insets.left, insets.top); g.drawImage(backimage1, 0, 0, frame1); g.setFont(new Font("Selif", Font.PLAIN, 40)); drawStringCenter("秒速1キロメートル", 100, g); bstrategy.show(); g.dispose(); } } } void drawStringCenter(String str, int y,Graphics g) { int fw = frame1.getWidth() / 2; FontMetrics fm = g.getFontMetrics(); int strw = fm.stringWidth(str) / 2; g.drawString(str, fw-strw, y); } }

  • 音楽を流したい。

    現在画像や文字を表示させるとともに、BGMも同時に流れるようになるプログラムを作っていますが、BGMを流すための処理メソッド(?)が分からなくて困っています。 分かる方は教えていただけると有難いです。 BGMのファイル名は「bgm.mid」です。 <プログラムソース> import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import java.lang.String; import java.awt.Font; import javax.swing.*; class BGMTest extends JFrame{ public BGMTest() { add(new DrawPanel()); } public static void main(String args[]){ JFrame frame = new GameTitle(); frame.setSize(640, 480); frame.setTitle("BGMテスト"); frame.setLocationRelativeTo(null); frame.setBackground(Color.pink); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } class DrawPanel extends JPanel{ String path = "start.jpg"; Image image; public DrawPanel() { ImageIcon icon = new ImageIcon(path); image = icon.getImage(); } public void paintComponent(Graphics args) { super.paintComponent(args); args.drawImage(image, 0, 0, this); args.setFont(new Font("TimesRoman",Font.ITALIC,100)); args.setColor(Color.red); args.drawString("BGMテスト", 120, 230); } }

  • JavaのSwingのレイアウト

    Swingを学習中ですが、うまくレイアウトできません。 添付した画像のようなレイアウトにしたいです。 作ってみたものは以下です。 import java.awt.BorderLayout; import java.awt.Color; import javax.swing.*; public class LayoutTest { public static void main(String[] args) { JFrame frame = new JFrame(); JPanel panel = new JPanel(); JTextField searchFiled = new JTextField("テキスト"); String[] comboboxString = {"C", "C++", "Java"}; JComboBox comboBox = new JComboBox(comboboxString); JButton button = new JButton("ボタン"); panel.add(comboBox, BorderLayout.EAST); panel.add(searchFiled, BorderLayout.CENTER); panel.add(button, BorderLayout.WEST); frame.add(panel, BorderLayout.PAGE_START); JPanel redPanel = new JPanel(); redPanel.setBackground(Color.RED); frame.add(redPanel); frame.setSize(700, 500); frame.setLocationRelativeTo(null); frame.setVisible(true); } }

    • ベストアンサー
    • Java