2015-03-02 78 views
1

我剛剛建成使用(Java Swing庫)這個網格,這是代碼:如何在網格旁插入JPanel?

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.*; 

public class TestGrid02 extends JPanel { 

    private static final long serialVersionUID = 1L; 

    protected static final Color SELECTION_COLOR = Color.red; 
    private JPanel selectedPanel = null; 
    private Color originalColor = new Color(238,238,238) ; 
    private static final Dimension PREF_SIZE = new Dimension(50, 50); 
    public JPanel panel; 
    public JPanel panel_1; 
    public JFrame frame; 



    public TestGrid02() { 

    createMap(10,10); 

    } 


    public void createMap(int maxX,int maxY) {  

     String [ ][ ] map = new String [maxX][maxY]; 

     for (int i = 0; i < maxX; i++) { 

      for (int j = 0; j < maxY ; j++) { 
       map [i][j] = "["+ i + ","+ j +"]"; 


      JPanel panel = new JPanel(); 
       add(panel); 
       panel.setPreferredSize(PREF_SIZE); 
       String name = String.format("[%d, %d]", i, j); 
       setLayout(new GridLayout(maxX,maxY, 1, 1)); 
       setBackground(Color.GRAY); 
       panel.setName(name); 

       System.out.println(map [i][j]); 
      } 
     } 

     addMouseListener(new MouseAdapter() { 
      @Override 
      public void mousePressed(MouseEvent e) { 
      JPanel panel = (JPanel) getComponentAt(e.getPoint()); 

      if (panel == null || panel == TestGrid02.this) { 
       return; 
      } 

      if (selectedPanel != null) { 
       selectedPanel.setBackground(originalColor); 
       selectedPanel.removeAll(); 
       selectedPanel.revalidate(); 
       selectedPanel.repaint(); 
      } 

      selectedPanel = panel; 
      selectedPanel.setBackground(SELECTION_COLOR); 
      selectedPanel.add(new JLabel(selectedPanel.getName())); 
      selectedPanel.revalidate(); 
      selectedPanel.repaint(); 
      } 
     }); 

    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("Astar"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new TestGrid02()); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true);  
     frame.pack(); 


    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

但我要的是另一個JPanel添加到包含例如2文本電網的「東風」區和1個按鈕,這樣的形象 - [1]

我已經嘗試添加另一個面板,但它出現在網格的頂部。我怎麼解決這個問題?

+0

*「如何解決這個問題?」*結合佈局。使用'GridLayout'作爲按鈕,然後用另一個佈局將該面板添加到(新的第二面板)。將您的其他面板添加到第二個面板。 – 2015-03-02 11:59:00

回答

1

這可以通過組合佈局來實現。對按鈕使用GridLayout,然後使用另一個佈局將該面板添加到(新的第二個面板)。將您的其他面板添加到第二個面板。此示例爲每個主面板設置不同的顏色,以顯示它們如何一起工作。

enter image description here

。應注意的截圖,我做了面板尺寸的一半的網格。

import java.awt.*; 
import javax.swing.*; 
import javax.swing.border.EmptyBorder; 

public class TestGrid02 { 

    private static final Dimension PREF_SIZE = new Dimension(50, 50); 
    private JPanel ui; 
    private JPanel gameGrid; 

    public TestGrid02() { 
     initUI(); 
    } 

    private final void initUI() { 
     ui = new JPanel(new BorderLayout(5, 5)); 
     ui.setBackground(Color.YELLOW); 
     ui.setBorder(new EmptyBorder(4, 4, 4, 4)); 
     createMap(10, 10); 
     ui.add(gameGrid); 

     JPanel controlsConstrain = new JPanel(new BorderLayout(4, 4)); 
     ui.add(controlsConstrain, BorderLayout.LINE_END); 
     controlsConstrain.setBackground(Color.GREEN); 

     JPanel controls = new JPanel(new GridLayout(0, 1, 0, 25)); 
     controlsConstrain.add(controls, BorderLayout.PAGE_START); 
     controls.setBackground(Color.CYAN); 
     controls.setBorder(new EmptyBorder(40, 20, 20, 20)); 
     controls.add(new JTextField(10)); 
     controls.add(new JTextField(10)); 
     controls.add(new JButton("OK")); 
    } 

    public void createMap(int maxX, int maxY) { 
     gameGrid = new JPanel(new GridLayout(maxX, maxY, 1, 1)); 
     gameGrid.setBackground(Color.RED); 

     for (int i = 0; i < maxX; i++) { 

      for (int j = 0; j < maxY; j++) { 
       JPanel panel = new JPanel(); 
       panel.setPreferredSize(PREF_SIZE); 
       String name = String.format("[%d, %d]", i, j); 
       panel.setName(name); 
       gameGrid.add(panel); 
      } 
     } 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("Astar"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new TestGrid02().getUi()); 
     // this was being called at the wrong time, but .. 
     // frame.setLocationRelativeTo(null); 
     // ..better to.. 
     frame.setLocationByPlatform(true); 
     frame.pack(); 
     frame.setVisible(true); // should be last. 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGui(); 
      } 
     }); 
    } 

    public JPanel getUi() { 
     return ui; 
    } 
} 
+0

這真的非常感謝! – 2015-03-03 16:05:17

+0

不客氣。 :) – 2015-03-03 17:06:43

0

嘗試使用BorderLayout。像這樣的東西(我沒有測試它,但你可以從這裏開始和自己繼續):

public TestGrid02() { 
    setLayout(new BorderLayout()); 
    JPanel centerPanel = new JPanel(); 
    add(centerPanel, BorderLayout.CENTER); 
    createMap(centerPanel, 10,10); 
    add(otherPanel, BorderLayout.EAST); // otherPanel contains your buttons, text fields, etc. 
} 

而在createMap方法改變:

add(panel); 

由:

centerPanel.add(panel); 
+0

我跟着你的解決方案,但中心面板掉了下來,而另一個面板上移 – 2015-03-02 16:03:33

+0

也許這'setLayout(new GridLayout(maxX,maxY,1,1));'應該是'panel.setLayout(new GridLayout(maxX, maxY,1,1));' – 2015-03-02 16:46:54