2016-05-24 12 views
-2

私は単純なゲームを構築しています。さまざまな色のボタンでグリッドが必要です。グリッドは幅が10ボタンで、高さは無制限です。下に追加のボタンがあり、既存のボタンを同じグリッドにクローンします。あまりにも多くのボタンを追加するときにスクロールバーが表示されるように、ボタンのサイズを同じに保つ必要があります。JAVA:スクロール可能なパネルに新しいボタンを追加する

私の問題の一部の映像はhereです。

JScrollPaneを使用しようとしましたが、JPanelをその内部に配置しましたが、スクロールバーは表示されません。

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Random; 

import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 

public class Main { 
    private JFrame window; 
    private JPanel mainPanel; 
    private JPanel currentButtonsPanel; 

    private ArrayList<JButton> buttons; 

    private final int WINDOW_X, WINDOW_Y; 
    private final int N_BUTTONS = 10; 

    private final Color[] colors = new Color[]{ 
      Color.RED, Color.GREEN, Color.BLUE, 
      Color.YELLOW, Color.ORANGE, Color.MAGENTA}; 
    private final Random random = new Random(); 
    private JButton selectedButton = null; 

    public Main(int w, int h, String title){ 
     WINDOW_X = w; 
     WINDOW_Y = h; 


     window = new JFrame(title); 
     window.setLayout(new BorderLayout()); 
     window.setSize(new Dimension(w, h)); 
     window.setResizable(false); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     mainPanel = new JPanel(); 
     //mainPanel.setBorder(BorderFactory.createLineBorder(Color.RED)); 
     mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS)); 

     buttons = new ArrayList<>(); 

     for(int i = 0; i < N_BUTTONS*3.5; i++) 
      addNewButton(); 

     JScrollPane scrollPane = new JScrollPane(mainPanel); 
     scrollPane.setPreferredSize(new Dimension(w,h)); 
     scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
     scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); 

     window.add(scrollPane, BorderLayout.CENTER); 
     window.add(generateButtonsPanel(), BorderLayout.SOUTH); 
     window.pack(); 
     window.setVisible(true); 
    } 

    private JPanel generateButtonsPanel(){ 
     JPanel ret = new JPanel(); 

     JButton btn = new JButton("Check"); 
     btn.addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent e){ 
       copyButtons(); 
      } 
     }); 
     ret.add(btn); 

     return ret; 
    } 

    private void copyButtons(){ 
     ArrayList<JButton> newList = new ArrayList<>(); 
     for(JButton btn : buttons){ 
      JButton newBtn = new JButton(); 
      newBtn.setBackground(btn.getBackground()); 
      newBtn.addActionListener(btn.getActionListeners()[0]); 
      newList.add(newBtn); 
     } 
     for(JButton btn : newList) 
      addNewButton(btn); 
    } 

    private void addNewButton(){ 
     JButton newButton = new JButton(); 

     Color col = colors[random.nextInt(colors.length)]; 
     newButton.setBackground(col); 

     newButton.addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent e){ 
       JButton btn = (JButton)e.getSource(); 
       if(selectedButton == null){ 
        selectedButton = btn; 
        btn.setText("."); 
        return; 
       } 
       if(selectedButton == btn){ 
        selectedButton = null; 
        btn.setText(""); 
        return; 
       } 
       if(selectedButton.getBackground() == btn.getBackground()){ 
        System.out.println("Matching!"); 
        btn.setBackground(Color.BLACK); 
        selectedButton.setBackground(Color.BLACK); 
        btn.setEnabled(false); 
        selectedButton.setEnabled(false); 

        buttons.remove(btn); 
        buttons.remove(selectedButton); 
       }else 
        System.out.println("No match!"); 

       btn.setText(""); 
       selectedButton.setText(""); 
       selectedButton = null; 
      } 
     }); 

     addNewButton(newButton); 
    } 

    private void addNewButton(JButton btn){ 
     if(buttons.size() % 10 == 0){ 
      currentButtonsPanel = new JPanel(); 
      currentButtonsPanel.setLayout(new GridLayout(0,10)); 
      currentButtonsPanel.setMaximumSize(new Dimension(WINDOW_X*WINDOW_X,WINDOW_X/N_BUTTONS+10)); 
      currentButtonsPanel.add(btn); 
      mainPanel.add(currentButtonsPanel); 
     }else 
      currentButtonsPanel.add(btn); 
     buttons.add(btn); 
     window.setVisible(true); 
    } 

    public static void main(String[] args){ 
     new Main(400, 300, "Game"); 
    } 
} 

EDIT:このコードは、これまで私が唯一興味が、唯一の実験である私、これでかなり新しいですので、これに対処する方法上の任意のヒントがずっと

私のコードをいただければ幸いですこのプログラムの技術的側面はすべて簡素化されています。

+0

スクロールバーポリシーをどのように設定しましたか? ScrollPaneを初期化して設定するコードスニペットを投稿できますか?あなたが新しいと言ったので、[スクロールペインのチュートリアル](https://docs.oracle.com/javase/tutorial/uiswing/components/scrollpane.html#scrollbars)と[ JScrollPane Javadocs](https://docs.oracle.com/javase/8/docs/api/javax/swing/JScrollPane.html)を参照して、何も見逃さないようにしてください。 –

+0

リンクありがとう!私は自分の投稿を編集してコードを組み込んだ。それはまだ非常に実験的です。 – SalysBruoga

答えて

0

あなたの問題はcurrentButtonsPanel.setMaximumSize(new Dimension(WINDOW_X*WINDOW_X,WINDOW_X/N_BUTTONS+10));と思われます。この方法の目的は、特定のコンポーネントがそのサイズに設定するように指示するのではなく、その最大サイズをレイアウトマネージャに示すことです。レイアウトマネージャは、JPanelのサイズ(内部のボタンと同様)を自動的に決定し、スクロールバーの使用を避けるためにその決定を行い、指定したMaxサイズディレクティブに従います。それ。

代わりにsetPreferredSize()を試してください。これは、レイアウトマネージャに、コンポーネントが必要とするサイズを通知します。これにより、Layout ManagerはJPanelを希望のサイズに設定します。これにより、垂直スクロールポリシーが設定されているため、垂直スクロールバーが表示されます。

+0

ありがとう!これは機能しましたが、最初はボタンがまだ伸びていました。しかし、私は 'setPrefferedSize()'と 'setMaximumSize()'と 'setMinimumSize()'を組み合わせました。 – SalysBruoga

関連する問題