2016-03-31 6 views
0

私はJavaを初めて使用しています。私は、いくつかのロジックコードとインターフェイスできるゲームグリッドを作りたいと思っています。Swingでこの種のグリッドをプログラム的に作成するにはどうすればよいですか?

NetbeanのGUIビルダーツールを使用して作成できました(部分的にしか示されていませんが、同じパターンが10 x 10まで繰り返されます)。しかし、私はまだコードで複雑なレイアウトを作成することに精通していません。

grid (partially shown)

問題は、アレイを構成する方法があるように思われないよう、私のゲームロジックでの配列要素への各ボタンをフック反復作業の多くであることを行っているように見え、ありますGUIビルダーのボタンの数。

(種類のボタンの各セットは、それ自身の配列を持っています。)

は、誰かが、私は純粋にコードでグリッドの同じ種類を作成することができますどのように私を見ることができますか?私はGridBagLayoutが必要であると推測しています。 (異なるタイプのブロック間のアラインメントは重要です)しかし、コード例を見ると、多くの概念が関与しているようで、一度に取り込むのは多すぎるようです。私は正しい方向にスタートしていただければ幸いです。

また、GUIビルダーツールでこれを効率的に行う方法がある場合は、それについて聞きたいと思います。

+1

*」のHow to Use GridBagLayoutを参照してください。.. GUIビルダーでボタンの配列を構成する方法がないようです」*ほとんどの人がGUIビルダーを使用しないことを望んでいる(または少なくとも多くの理由の1つ)。 'GridBagLayout'を使用して、 'GridBagConstraints'を使ってコンポーネントを'四角形間のビット 'の幅や高さに伸ばしてください。ああ、おそらく、「ファクトリメソッド」は繰り返しパターンを考えればそこにも役立つでしょう。 –

+0

あなたのコメントをありがとう。私は誰かが私が肉体的にできるいくつかのスケルトンコードでチャイムインすることを望んでいる。 (おそらくあまりにも多くのことを願っていますが...) – Ryoom

+0

*「誰かがスケルトンコードでチャイムしてくれることを願っています」*多くの場合、特定のタスクを実行するための完全なコードがあります。しかし、それは典型的には、私が既にその人に質問をしたときに、[mcve]の形で試行を見たときの***です。ボールはあなたの裁判所にあります。 –

答えて

2

基本的に2つの選択肢があります。例えば、繰り返しパターンのように、何らかの方法で複合コンポーネントを使用することができます.1つの「タイル」を分離して、別のレイアウトマネージャを使用して、タイルを物理的にレイアウトするか、またはGridBagLayoutのようなものを使用してすべてレイアウトします。あなたが使用

は、あなたが達成したいものに降りてくるだろうし、あなたが

Example

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setLayout(new GridBagLayout()); 
      GridBagConstraints gbc = new GridBagConstraints(); 
      gbc.gridx = 0; 
      gbc.gridx = 0; 
      gbc.fill = GridBagConstraints.HORIZONTAL; 
      gbc.insets = new Insets(4, 4, 4, 4); 

      for (int row = 0; row < 9; row++) { 
       gbc.gridy = row; 
       for (int col = 0; col < 9; col++) { 
        gbc.gridx = col; 
        if (row % 2 == 0) { 
         if (col % 2 == 0) { 
          add(bigButton(), gbc); 
         } else { 
          add(verticalButton(), gbc); 
         } 
        } else if (col % 2 == 0) { 
         add(horizontalButton(), gbc); 
        } 
       } 
      } 
     } 

     protected JButton bigButton() { 
      JButton btn = new JButton() { 
       @Override 
       public Dimension getPreferredSize() { 
        return new Dimension(100, 100); 
       } 
      }; 
      return btn; 
     } 

     protected JButton verticalButton() { 
      JButton btn = new JButton() { 
       @Override 
       public Dimension getPreferredSize() { 
        return new Dimension(45, 100); 
       } 
      }; 
      return btn; 
     } 

     protected JButton horizontalButton() { 
      JButton btn = new JButton() { 
       @Override 
       public Dimension getPreferredSize() { 
        return new Dimension(100, 45); 
       } 
      }; 
      return btn; 
     } 
    } 

} 

を生成しようとしている機能は、より詳細

+0

うわー、華麗に見える..ありがとう! (まだそれをテストしていない - 私は少しそれを行うだろう)。私は自分自身でコンパウンドコンポーネントのアイデアを持っていました。 JPanelの3次元配列を含む2次元配列をまとめていますか?最後に非対称性をどのように扱うのですか(私はいくつかのボタンを見えなくすることができると思います)。 – Ryoom

+0

私はちょっと残念ですが、私はまだあなたをアップアップすることはできません。(あなたは笑いを傷つけているわけではありません) – Ryoom

+0

"スタート"、 "ミドル"、 "エンド"のコンポーネントを書くことができます – MadProgrammer

関連する問題