2016-11-24 23 views
2

私は何か超基本的なものを作成しようとしていますが、非常に不満を抱いた後、GridLayoutボタンを使って複数のJPanelを表示するには

望ましい結果:今ここに

https://i.stack.imgur.com/0LfGV.png

は私のコードです:

GUIクラス

package bookingProject; 

import java.awt.Color; 
import javax.swing.JPanel; 
import java.awt.GridLayout; 
import javax.swing.BorderFactory; 
import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import static javax.swing.JFrame.EXIT_ON_CLOSE; 

public class GUI extends javax.swing.JFrame { 

    JFrame frame = new JFrame(); 
    JPanel silverPanel = new JPanel(); 
    JPanel goldPanel = new JPanel(); 
    Button buttons[] = new Button[30]; 

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

    public GUI() { 
     setSize(500, 500); 
     setResizable(false); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

     JPanel bronzePanel = new JPanel(); 
     bronzePanel.setLayout(new GridLayout(3, 10)); 
     bronzePanel.setBackground(Color.red); 
     for (int i = 0; i < 30; i++) { 
      buttons[i] = new Button(); 
      bronzePanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 
      bronzePanel.add(buttons[i]); 
     } 
     add(bronzePanel); 
     setVisible(true); 

     silverPanel.setLayout(new GridLayout(3, 10)); 
     silverPanel.setBackground(Color.yellow); 
     for (int i = 0; i < 30; i++) { 
      buttons[i] = new Button(); 
      silverPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 
      silverPanel.add(buttons[i]); 
     } 
     add(silverPanel); 
     setVisible(true); 

     goldPanel.setLayout(new GridLayout(3, 10)); 
     goldPanel.setBackground(Color.green); 
     for (int i = 0; i < 30; i++) { 
      buttons[i] = new Button(); 
      goldPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 
      goldPanel.add(buttons[i]); 
     } 
     add(goldPanel); 
     setVisible(true); 
    } 

} 

そして、私は

を使用したいボタンのクラスボタンクラス

package bookingProject; 
import java.awt.Color; 
import javax.swing.JButton; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 

public class Button extends JButton implements ActionListener{ 
    public Button(){ 
    this.addActionListener(this); 
} 

    public void actionPerformed(ActionEvent e){ 
     Object source = e.getSource(); 
     if (source instanceof GUI){ 
      ((GUI)source).setBackground(Color.YELLOW); 
     } 
} 
} 

このは私が取得していますものです:ので、私の完全な無知/能力を許す

https://i.stack.imgur.com/uu9SO.png

私はこのようなものに新しいブランドだ...しかし、私は希望して行く3枚のパネルです上から下へ(ブロンズ/シルバー/ゴールド)、それぞれグリッドレイアウトのボタンが付いています...しかし、私が得ることのできるのは、他のすべてのものの真ん中に貼っているブロンズパネルだけです。私はBoxLayoutを使用して3つのパネルを並べ替えることになっていると思いますが、これを約4時間使って遊んでいました。

私はそれらを押してもボタンが黄色に変わる方法が必要ですが、現在は機能していません。私はそれをほとんど見ていませんでした。

+0

_psst_ [コード](http://stackoverflow.com/a/40777221/2575725)と[ビデオ](https://でyoutu .be/9pQEF_phhAs) – Arvind

+0

あなたの投稿は役に立ちましたか? – Arvind

答えて

0

これは私が取得していますものです:デフォルトでは

JFrameのコンテンツペインがBorderLayoutを使用しています。フレームにコンポーネントを追加すると、制約を指定しなかったため、コンポーネントはデフォルトでBorderLayout.CENTERに追加されます。 CENTERに表示できるコンポーネントは1つだけなので、最後に追加されたコンポーネントだけが表示されます。

私は私が手動で各行のコンポーネント間のスペースを指定する必要がありますように、1つのアプローチ(おそらく最も簡単ではない)であるBoxLayout

を使用するようになってると思います。

How to Use Box LayoutのSwingチュートリアルのセクションには、始めるための実例があります。

最も簡単なのは、フレームのレイアウトマネージャーとして3行2列のGridLayoutを使用することです。各パネルでは、3行5列のGridLayoutを使用することもできます。

各パネルのコンポーネント間にスペースが必要な場合は、GridLayout APIを参照する必要があります。コンポーネント間の垂直方向と水平方向の間隔を指定することができます。

もう1つの方法はGridBagLayoutですが、追加するコンポーネントごとに制約を指定する必要があるため、もう少し複雑です。

このチュートリアルには、How to Use GridBag LayoutHow to Use GridLayoutのセクションもあります。

このチュートリアルの例では、コンポーネントがEvent Dispatch Thread(EDT)で作成されるようにコードをよりよく構造化する方法も示しています。

0

代わりGridBagLayoutを試すことができます。

import javax.swing.JFrame; 
import javax.swing.JButton; 
import java.awt.GridBagLayout; 
import java.awt.GridBagConstraints; 
import javax.swing.SwingUtilities; 
import javax.swing.JPanel; 
import java.awt.Insets; 
import java.awt.Color; 
class Demo{ 
    public static void main(String[]args){ 
     SwingUtilities.invokeLater(()->{ 
      JFrame frame=new JFrame("Grid"); 
      JPanel panel=(JPanel)frame.getContentPane(); 
      GridBagConstraints gbc=new GridBagConstraints(); 
      gbc.insets=new Insets(9,7,5,5); 
      panel.setLayout(new GridBagLayout()); 

      panel.add(newGrid(Color.YELLOW,gbc, 0, 0),gbc); 
      panel.add(newGrid(Color.YELLOW,gbc, 1, 0),gbc); 

      panel.add(newGrid(Color.LIGHT_GRAY,gbc, 0, 1),gbc); 
      panel.add(newGrid(Color.LIGHT_GRAY,gbc, 1, 1),gbc); 

      panel.add(newGrid(Color.GREEN,gbc, 0, 2),gbc); 
      panel.add(newGrid(Color.GREEN,gbc, 1, 2),gbc); 

      frame.pack(); 
      frame.setLocationByPlatform(true); 
      frame.setVisible(true); 
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     }); 
    } 
    private static JPanel newGrid(Color color, GridBagConstraints pGbc, int pX, int pY){ 
     JPanel panel=new JPanel(new GridBagLayout()); 
     GridBagConstraints gbc=new GridBagConstraints(); 
     gbc.insets=new Insets(5,5,5,5); 
     for(int x=0;5>x;x++){ 
      for(int y=0;3>y;y++){ 
       gbc.gridx=x; 
       gbc.gridy=y; 
       JButton btn=new JButton("<html>&nbsp;</html>"); 
       btn.setBackground(color); 
       panel.add(btn,gbc); 
      } 
     } 
     pGbc.gridx=pX; 
     pGbc.gridy=pY; 
     return panel; 
    } 
} 

enter image description here

関連する問題