質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

440閲覧

JFrameにコンポーネントが追加されず真っ白い状態となる

tarutarupop

総合スコア20

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/09/26 09:04

編集2017/09/27 15:10

四目並べを行うプログラムを作ったのですがうまく起動してくれません。具体的には正しくコンポーネントが追加されていないようで真っ白になってしまします。コンポーネントを追加する順序にミスがあるのでしょうか...?自力では解決しなかったためご指摘のほどお願いします。また、ほかの点で改善点があれば容赦なくお願いします。

Java

1import java.awt.Color; 2import java.awt.Dimension; 3import java.awt.GridLayout; 4import java.awt.event.ActionEvent; 5import java.awt.event.ActionListener; 6import java.util.ArrayList; 7 8import javax.swing.JButton; 9import javax.swing.JFrame; 10import javax.swing.JLabel; 11import javax.swing.JPanel; 12import javax.swing.border.BevelBorder; 13 14public class GameScreen extends JPanel implements ActionListener{ 15 private int cn; //升目の数 cn * cn 16 private JPanel backpane; 17 private JLabel telllimit; 18 private JLabel tellcolor; 19 private GameSystem s; 20 private Color player_c; 21 static JLabel timelimit; 22 static boolean play_turn; //現在のターンを保持 23 static boolean[] enter = new boolean[400]; //すべての入力を保持 24 static ArrayList<ArrayList<JButton>> y_coordinate = new ArrayList<ArrayList<JButton>>(); 25 26 public static void main(String args[]){ 27 JFrame jf = new JFrame(); 28 GameScreen gs = new GameScreen(15); 29 jf.add(gs); 30 jf.setVisible(true); 31 32 } 33 public GameScreen(int n){ 34 /* 35 * 画面生成 36 */ 37 //親パネル 38 super(); 39 this.setPreferredSize(new Dimension(930,700)); 40 this.setLayout(null); 41 this.setBackground(Color.GREEN); 42 43 //ターン表示のためのパネル 44 tellcolor = new JLabel(); 45 tellcolor.setBackground(getPlayer_c()); 46 tellcolor.setBounds(0, 0, 200, 200); 47 this.add(tellcolor); 48 49 //残り時間表示のためのパネル 50 telllimit = new JLabel(); 51 telllimit.setBorder(new BevelBorder(BevelBorder.RAISED, Color.white, Color.black)); 52 telllimit.setBounds(200, 0, 200, 430); 53 telllimit.setForeground(Color.WHITE); 54 55 this.add(telllimit); 56 57 //升目パネル 58 JPanel screen = new JPanel(); 59 screen.setBounds(207,200,456, 516); 60 screen.setLayout(new GridLayout(20,20,0,0)); 61 cn = n; 62 for(int i = 0;i<cn;i++){ 63 ArrayList<JButton> x_coordinate = new ArrayList<JButton>(); 64 for(int t = 0;t<cn;t++){ 65 JButton cell = CreateCell(i,t); 66 cell.addActionListener(this); 67 screen.add(cell); 68 x_coordinate.add(cell); 69 } 70 y_coordinate.add(x_coordinate); 71 } 72 this.add(screen); 73 74 //ゲーム開始 75 s = new GameSystem(15); 76 } 77 78 public JButton CreateCell(int x,int y){ 79 JButton btn = new JButton(); 80 btn.setSize(10, 10); 81 btn.setActionCommand(x+"-"+y); 82 return btn; 83 } 84 public void setTelllimittext(int second){ 85 String s= "残り時間 "+ second+"秒"; 86 telllimit.setText(s); 87 } 88 89 @Override 90 public void actionPerformed(ActionEvent e) { 91 String coordinate = e.getActionCommand(); 92 for(int k=0;k<cn;k++){ 93 for(int j = 0;j<cn;j++){ 94 String number = k+"-"+j; 95 if(coordinate.equals(number)){ 96 int order = k*20 + j+1; //入力の番号を作成 97 if(play_turn == true){ 98 player_c = Color.RED; 99 s.addA(order); 100 }else{ 101 player_c = Color.BLUE; 102 s.addB(order); 103 } 104 changeTurn(); 105 106 if(k == 19){ //入力が底の時 107 processEnter(order,k,j,player_c); 108 }else{ //入力が上部の時 109 if(enter[order+20] == false){ 110 System.out.println("無効な入力です"); 111 }else{ 112 processEnter(order,k,j,player_c); 113 } 114 } 115 s.createCombinations(); 116 } 117 } 118 } 119 return; 120 } 121 122 public Color getPlayer_c(){ 123 if(play_turn == true){ 124 player_c = Color.RED; 125 }else{ 126 player_c = Color.BLUE; 127 } 128 return player_c; 129 } 130 public void changeTurn(){ 131 if(play_turn == true){ 132 player_c = Color.RED; 133 tellcolor.setBackground(Color.red); 134 play_turn = false; 135 }else{ 136 player_c = Color.BLUE; 137 tellcolor.setBackground(Color.BLUE); 138 play_turn = true; 139 } 140 tellcolor.setBackground(getPlayer_c()); 141 } 142 /* 色塗り処理 */ 143 public void processEnter(int order,int k,int j,Color player_c){ 144 /* 過去に入力があればtrueなければfalse */ 145 if( enter[order] == true){ 146 System.out.println("既に入力されています"); 147 return; 148 }else{ 149 y_coordinate.get(k).get(j).setBackground(player_c); 150 enter[order] = true; 151 } 152 } 153} 154

Java

1import java.awt.event.ActionEvent; 2import java.awt.event.ActionListener; 3import java.util.ArrayList; 4import java.util.Collections; 5import java.util.Iterator; 6import java.util.List; 7 8import javax.swing.Timer; 9 10public class GameSystem implements ActionListener{ 11 private Timer timer; 12 private int sec; 13 private Combinations<Integer> c ; 14 private GameScreen gs ; 15 private Screen sc; 16 private ArrayList<Integer> number_a = new ArrayList<Integer>(); //player1の入力 17 private ArrayList<Integer> number_b = new ArrayList<Integer>(); //player2の入力 18 private boolean finish = false; 19 20 21 public GameSystem(int limit){ 22 sec = 0; 23 timer = new Timer(limit*1000,this); 24 timer.start(); 25 } 26 27 public void createCombinations(){ 28 if(GameScreen.play_turn == !true){ 29 if(number_a.size() > 3){ 30 c = new Combinations<Integer>(number_a,4); 31 //con = c.count(number_a.size(),4); 32 judgeWinner(); 33 }else{ 34 return; 35 } 36 }else{ 37 if(number_b.size() > 3){ 38 c = new Combinations<Integer>(number_b,4); 39 //con = c.count(number_b.size(),4); 40 judgeWinner(); 41 }else{ 42 return; 43 } 44 } 45 46 } 47 /* 勝者判定 */ 48 public void judgeWinner(){ 49 Iterator<List<Integer>> i = c.iterator(); 50 while(i.hasNext()){ 51 List<Integer> t = i.next(); 52 Collections.sort(t); //小さい順に並び替え 53 Collections.reverse(t); //大きい順へ 54 if(t.get(0)-t.get(3)==3 && t.get(0)-t.get(1)==1 || 55 t.get(0)-t.get(1)==20 && t.get(1)-t.get(2)==20 && t.get(2)-t.get(3)==20 || 56 t.get(0)-t.get(1)==21 && t.get(1)-t.get(2)==21 && t.get(2)-t.get(3)==21 || 57 t.get(0)-t.get(1)==19 && t.get(1)-t.get(2)==19 && t.get(2)-t.get(3)==19 ){ 58 finish = true; 59 System.out.println("ゲーム終了"); 60 } 61 } 62 } 63 public void addA(int n){ 64 number_a.add(n); 65 } 66 public void addB(int n){ 67 number_b.add(n); 68 } 69 70 @Override 71 public void actionPerformed(ActionEvent e) { 72 if(finish == true){ 73 timer.stop(); 74 } 75 if (sec == 15){ 76 sec = 0; 77 gs.changeTurn(); 78 }else{ 79 gs.setTelllimittext(sec); 80 sec++; 81 82 } 83 } 84}

Java

1/*http://kuidaored.hatenablog.com/entry/20101120/1290268944様より引用 2*組み合わせをすべて列挙するプログラム 3*/ 4import java.util.ArrayList; 5import java.util.Arrays; 6import java.util.Iterator; 7import java.util.List; 8public class Combinations<T> implements Iterator{ 9 10 private List<List<T>> combinations; 11 private List<T> list; 12 private int[] index; 13 private boolean[] visited; 14 private int r; 15 private boolean overHalf; 16 private Iterator<List<T>> iterator; 17 18 public Combinations(List<T> l,int r){ 19 if(l.size() < 1 || r < 1 || l.size() < r){ 20 throw new IllegalArgumentException(); 21 } 22 23 this.combinations = new ArrayList<List<T>>(); 24 this.list = l; 25 this.r = r; 26 if(this.r == l.size()){ 27 this.combinations.add(list); 28 } 29 else{ 30 if(this.r > list.size() / 2){ 31 this.r = list.size() - this.r; 32 this.overHalf = true; 33 } 34 35 this.index = new int[this.r]; 36 this.visited = new boolean[list.size()]; 37 this.compute(0); 38 } 39 40 this.iterator = this.combinations.iterator(); 41 } 42 43 public Combinations(T[] array, int r){ 44 this(Arrays.asList(array),r); 45 } 46 47 private void compute(int n){ 48 if(n == this.r){ 49 List<T> combination = new ArrayList<T>(); 50 if(overHalf){ 51 for(int i = 0;i < this.list.size();i++){ 52 boolean skip = false; 53 for(int j = 0;j < this.index.length;j++){ 54 if(i == this.index[j]){ 55 skip = true; 56 } 57 } 58 if(skip){ 59 continue; 60 } 61 combination.add(list.get(i)); 62 } 63 } 64 else{ 65 for(int i = 0;i < this.index.length;i++){ 66 combination.add(list.get(index[i])); 67 } 68 } 69 this.combinations.add(combination); 70 } 71 else{ 72 for(int i = 0;i < this.list.size();i++){ 73 if(n == 0 || !this.visited[i] && index[n - 1] < i){ 74 this.visited[i] = true; 75 this.index[n] = i; 76 this.compute(n + 1); 77 this.visited[i] = false; 78 } 79 } 80 } 81 } 82 83 public List<List<T>> getCombinations(){ 84 return this.combinations; 85 } 86 87 public static int count(int n, int r) throws IllegalArgumentException{ 88 if(n < 1 || r < 1 || n < r){ 89 throw new IllegalArgumentException(); 90 } 91 92 int res = 1; 93 for(int i = n;i > r;i--){ 94 res *= i; 95 } 96 for(int i = n - r;i > 1;i--){ 97 res /= i; 98 } 99 return res; 100 } 101 102 public List<T> next(){ 103 104 return this.iterator.next(); 105 } 106 107 public boolean hasNext(){ 108 return this.iterator.hasNext(); 109 } 110 111 public Iterator<List<T>> iterator(){ 112 return this.iterator; 113 } 114 115 public void remove(){ 116 } 117} 118

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masaya_ohashi

2017/09/27 00:52

「うまく起動してくれません」と言われても、我々にはコードを1から10まで眺める時間はありません。「ビルドがエラーを起こしている」「そもそもウィンドウが出ない」「ウィンドウは出るが、なにも見えない」「ゲームが始まらない」など、なにがどう起動しないのか具体的な情報が必要です。また、エラー情報が分かればそれも記載してください。
masaya_ohashi

2017/09/27 01:09

少なくともCombinationsというクラス、Screenというクラスの情報も必要です。もしそんなクラスが無いというなら、起動しないのはまずそれが原因です。
tarutarupop

2017/09/27 15:14

コード以前に質問が稚拙に過ぎたため大幅に変えました。指摘ありがとうございました。加えてScreenクラスは今は関係ありませんでしたので削除し、combinationsクラスのソースコードを追加しておきました
guest

回答1

0

ベストアンサー

正しくコンポーネントが追加されていないようで真っ白になってしまします。

細かくはチェックできてないですが、大まかな印象では原因は「swingで画面をレイアウトするための標準的な方法を採っていないから」であるように思えます。

まず最初にごく単純なswingの画面サンプルをご覧ください。

java

1import javax.swing.*; 2import java.awt.*; 3 4public class MyFrame extends JFrame { 5 public static void main(String[] args) { 6 new MyFrame().setVisible(true); 7 } 8 9 MyFrame() { 10 super("title"); 11 JPanel content = (JPanel)getContentPane(); 12 JButton top = new JButton("上"); 13 JButton center = new JButton("中央"); 14 center.setPreferredSize(new Dimension(200, 50)); // (1) 15 JButton bottom = new JButton("下"); 16 content.add(top, BorderLayout.NORTH); // (2) 17 content.add(center, BorderLayout.CENTER); 18 content.add(bottom, BorderLayout.SOUTH); 19 setDefaultCloseOperation(EXIT_ON_CLOSE); 20 pack(); // (1) 21 } 22}

申し訳ないですが質問のコードとはクラス構成が異なっており、メインクラスはJFrameの派生でありメイン画面の定義処理はmainメソッドではなくMyFrameクラスのコンストラクターでやっている点が若干比較しずらいですが、自分がポイントであると思う処理の違いは(1),(2)ですのでとりあえずはそこに注目してください。

(1) コンポーネントのレイアウト(位置と大きさ)
特にswing前提でのゲームのコードで、普通のレイアウト機構を用いずに標準的とはいえない方法で(つまり自前で各々のコンポーネントのレイアウトを明示する方針で)書いたコードをよく見かける気がします。ご質問のコードもその傾向にあると思います。少なくとも自分にはそのようなコードを見たとき、正しくレイアウトできているかどうか分かりづらく感じます。普通のレイアウト機構とは「レイアウト制約を宣言的に指定し、実際のリサイズや配置はレイアウトマネージャーに任せる」「初期レイアウトはJFrame#packにより行う」といった点を指します。

そんなわけで、「平易なレイアウト方式に改める」のが一番よい対処という気がしますが、それはそれでなかなか大事かも知れません。そこで・・・

とりあえず何もコンテントが出ないという状況はJFrame#setVisibleの直前でJFrame#packを呼び出せば解消できます。コンテントが表示されるようになるので、後は個々のコンポーネントのレイアウトの乱れを修正していくことで期待するレイアウトにもっていけそうです。(実際にいくつか乱れがあるようですが、自分はそれらの原因を指摘できるほどには詳細にコードをみていません。)

(2) メイン画面へのコンポーネントの追加
こちらは現象と直接的な因果関係はありませんが気になるのでコメントします。
JFrameのウインドウ枠の内側の領域は大まかに言えばconetentPaneに設定されたコンポーネントになります。ここにはデフォルトでJPanel(そのレイアウトマネージャーはBorderLayout)が設定されている点を知っておいた方がよいと思います。BorderLayoutを用いたJPanelへ子供を追加するには普通

Container#add(Component comp, Object constraints)

を用います。constraintsには上記サンプルの(1)のようにBorderLayout.CENTERなどの位置を指定します。ご質問のコードでは

Container#add(Component comp)

を用いています。こうすると実際にはconstraintsとしてBorderLayout.CENTERが仮定されるので追加自体は行えるのですがあまり行儀がよいコードとは言えない気がします。


(1),(2)共通に言えることなのですが、swingに限らず、GUIプログラミング(特にレイアウト)はそもそもの機構が複雑なので、なるべく平易な方法(作法)を知りそれに沿ったコードを書くことが大事な気がします。そうでないとコードを見ても「うまく動くかどうか」がすぐにはわかりづらく(※)、悪くすると動かしてみても原因がつかめないといったことになりがちと思います。何が平易な作法なのかというのは一言で言うのは難しいですが、とりあえず本件でいえば「レイアウトマネージャーにレイアウトをまかせること」というのが自分の意見です。

※: ちなみに今回のコードを調べるまでは自分は「JFrame#add(Component)を用いたときBorderLayoutがCENTERを仮定する」という事実を知りませんでした。ひょっとしたらこれは常識であって自分が知らなかっただけかも知れませんが・・・

投稿2017/09/27 16:58

編集2017/09/27 17:11
KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問