2015-09-04 93 views
0

我在JPanel的位置有問題。我開始創建一個小遊戲......我在設計中創建了2個面板(在JFrame上)。所有的工作都很好,面板都放在正確的地方。在我的遊戲中,我必須使用2個圖形表,所以我使用2個面板,並將其中的每個面板集佈局(new Grid Layout(10,10))都添加進去。JFrame上的JPanel位置

之後,我運行該項目以瞭解它是如何工作的,並且在其他地方以另一種尺寸發現了我的面板。我發現的方式,可以幫助我改變大小,但我找不到方法來改變位置或給我自己的位置的方式...

我試圖添加圖片,可以告訴你我看到的東西但該網站堵塞的照片...

的代碼是:

public class GameFrame extends javax.swing.JFrame { 
int [][]p1; 
int [][]p1Attac; 
int [][]p2; 
int [][]p2Attac; 
static int size=10; 
int player; 
JPanel [][]b1; 
JPanel [][]b2; 
int w=1100,h=900; 

/** 
* Creates new form GameFrame 
* @param player1 
* @param player2 
*/ 
public GameFrame(int [][]player1, int [][]player2) { 
    initComponents(); 
    // setSize(w, h); 
    setVisible(true); 
    // size=10; 
    p1=new int[size][size]; 
    p1Attac=new int[size][size]; 
    p2=new int[size][size]; 
    p2Attac=new int[size][size]; 
    b1=new JPanel[size][size]; 
    b2=new JPanel[size][size]; 
    init(player1, player2); 
    leftBoard.setBackground(Color.red); 
    rightBoard.setBackground(Color.blue); 
    GridLayout gl=new GridLayout(size, size); 
    leftBoard.setLayout(gl); 
    rightBoard.setLayout(gl); 
    for(int i=0;i<size;i++){ 
     for(int j=0;j<size;j++){ 
      b1[i][j]=new JPanel(); 
      b1[i][j].setBorder(BorderFactory.createLineBorder(Color.black)); 
      b1[i][j].setBackground(Color.red); 
      b2[i][j]=new JPanel(); 
      b2[i][j].setBorder(BorderFactory.createLineBorder(Color.black)); 
      b2[i][j].setBackground(Color.blue); 
      leftBoard.add(b1[i][j]); 
      rightBoard.add(b2[i][j]); 
     } 
    } 
    leftBoard.setPreferredSize(new Dimension(w/2-50, h/2)); 
    rightBoard.setPreferredSize(new Dimension(w/2-50, h/2)); 
    // leftBoard.setIgnoreRepaint(true); 
// leftBoard.setLocation(0, h/5); 
} 
public void init(int [][]player1,int [][]player2){ 
    for(int i=0;i<size;i++){ 
     for(int j=0;j<size;j++){ 
      p1[i][j]=player1[i][j]; 
      p2[i][j]=player2[i][j]; 
      p1Attac[i][j]=0; 
      p2Attac[i][j]=0; 
     } 
    } 
} 
/** 
* This method is called from within the constructor to initialize the form. 
* WARNING: Do NOT modify this code. The content of this method is always 
* regenerated by the Form Editor. 
*/ 
@SuppressWarnings("unchecked") 
// <editor-fold defaultstate="collapsed" desc="Generated Code">       
private void initComponents() { 

    leftBoard = new javax.swing.JPanel(); 
    rightBoard = new javax.swing.JPanel(); 
    jLabel1 = new javax.swing.JLabel(); 
    jLabel2 = new javax.swing.JLabel(); 

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

    javax.swing.GroupLayout leftBoardLayout = new javax.swing.GroupLayout(leftBoard); 
    leftBoard.setLayout(leftBoardLayout); 
    leftBoardLayout.setHorizontalGroup(
     leftBoardLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGap(0, 523, Short.MAX_VALUE) 
    ); 
    leftBoardLayout.setVerticalGroup(
     leftBoardLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGap(0, 498, Short.MAX_VALUE) 
    ); 

    javax.swing.GroupLayout rightBoardLayout = new javax.swing.GroupLayout(rightBoard); 
    rightBoard.setLayout(rightBoardLayout); 
    rightBoardLayout.setHorizontalGroup(
     rightBoardLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGap(0, 547, Short.MAX_VALUE) 
    ); 
    rightBoardLayout.setVerticalGroup(
     rightBoardLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGap(0, 498, Short.MAX_VALUE) 
    ); 

    jLabel1.setFont(new java.awt.Font("Tahoma", 0, 36)); // NOI18N 
    jLabel1.setText("Enemy Attacs:"); 

    jLabel2.setFont(new java.awt.Font("Tahoma", 0, 36)); // NOI18N 
    jLabel2.setText("Your Attacs:"); 

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
    getContentPane().setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addGroup(layout.createSequentialGroup() 
        .addGap(57, 57, 57) 
        .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 272, javax.swing.GroupLayout.PREFERRED_SIZE)) 
       .addComponent(leftBoard, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addGroup(layout.createSequentialGroup() 
        .addGap(118, 118, 118) 
        .addComponent(rightBoard, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
       .addGroup(layout.createSequentialGroup() 
        .addGap(193, 193, 193) 
        .addComponent(jLabel2))) 
      .addContainerGap(43, Short.MAX_VALUE)) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
      .addGap(15, 15, 15) 
      .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addGap(3, 3, 3) 
      .addComponent(leftBoard, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) 
     .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
      .addGap(22, 22, 22) 
      .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
      .addComponent(rightBoard, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addGap(65, 65, 65)) 
    ); 

    pack(); 
}// </editor-fold>       

/** 
* @param args the command line arguments 
*/ 
public static void main(String args[]) { 
    /* Set the Nimbus look and feel */ 
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
    * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
    */ 
    try { 
     for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
      if ("Nimbus".equals(info.getName())) { 
       javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
       break; 
      } 
     } 
    } catch (ClassNotFoundException ex) { 
     java.util.logging.Logger.getLogger(GameFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (InstantiationException ex) { 
     java.util.logging.Logger.getLogger(GameFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (IllegalAccessException ex) { 
     java.util.logging.Logger.getLogger(GameFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
     java.util.logging.Logger.getLogger(GameFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } 
    //</editor-fold> 
    /*int [][]p1=new int[size][size]; 
    int [][]p2=new int[size][size]; 
    for(int i=0;i<size;i++) 
     for(int j=0;j<size;j++){ 
      p1[i][j]=0; 
      p2[i][j]=0; 
     } 
    p1[0][0]=p1[1][0]=p1[2][0]=p1[3][0]=4; 
    p1[0][3]=p1[1][3]=p1[2][3]=3; 
    p1[5][3]=p1[6][3]=p1[7][3]=3; 
    p1[0][3]=p1[1][3]=2;*/ 
    int [][]p1={ 
     {4,4,4,4,0,1,0,0,0,0}, 
     {0,0,0,0,0,0,0,1,0,0}, 
     {3,3,3,0,3,0,0,0,0,0}, 
     {0,0,0,0,3,0,0,0,0,0}, 
     {2,2,0,0,3,0,0,1,0,0}, 
     {0,0,0,0,0,1,0,0,0,0}, 
     {0,0,0,0,0,0,0,2,2,0}, 
     {0,0,0,5,0,0,0,0,0,0}, 
     {0,0,0,0,0,0,5,0,2,2}, 
     {0,0,0,0,0,0,0,0,0,0} 
    }; 
    int [][]p2={ 
     {0,1,0,0,1,0,0,2,2,0}, 
     {0,0,0,0,0,0,0,0,0,0}, 
     {0,0,1,0,1,0,2,2,0,0}, 
     {0,0,0,0,0,0,0,0,0,0}, 
     {0,5,0,0,3,0,0,2,0,0}, 
     {0,0,0,0,3,0,0,2,0,0}, 
     {0,0,0,0,3,0,0,0,0,0}, 
     {0,0,0,0,0,0,4,4,4,4}, 
     {0,3,3,3,0,0,0,0,0,0}, 
     {0,0,0,0,0,0,5,0,0,0} 
    }; 
    new GameFrame(p1, p2); 
    /* Create and display the form */ 
    java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      // new GameFrame().setVisible(true); 
     } 
    }); 
} 

// Variables declaration - do not modify      
private javax.swing.JLabel jLabel1; 
private javax.swing.JLabel jLabel2; 
private javax.swing.JPanel leftBoard; 
private javax.swing.JPanel rightBoard; 
// End of variables declaration     
} 
+1

@AndrewThompson我認爲[這](http://i.stack.imgur.com/TiIad.png)是預期的佈局。我只是改變了垂直差距,並將'setVisible(true)'放在構造函數的末尾。我不確定它是否真的是預期的樣子,所以我不想編輯這個問題。 –

回答

0

一個問題是,在Netbeans的GUI Builder生成的的initComponents()已經正在由以後運行的代碼搞砸了佈局在構造函數中。 解決此問題的方法是使用設計器中的自定義代碼..右鍵單擊菜單選項。將代碼放在那裏將允許您保持由Gui Builder設置的外部設計並添加內部自定義組件。之後,您可以註釋掉構造函數中的所有代碼。

screenshot of Code Customizer

+0

非常感謝!有用!! – anton

2

感謝@AndrewThompson給了重要的思想對於這個問題(網格佈局,標題的邊框)。我等了大約30分鐘,看看他是否會發布自己的答案。他沒有,所以我決定張貼我自己的 - 我希望沒有人生我的氣。


不要使用的GroupLayout對於這一點,IMO它只是使事情變得複雜和用戶不友好的(至少在這種情況下)。相反,你可以用簡單的GridLayouts實現一切。 (用更少的代碼,可調整大小的)我創建了一個例子,告訴您如何:

import java.awt.Color; 
import java.awt.Font; 
import java.awt.GridLayout; 

import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.border.LineBorder; 
import javax.swing.border.TitledBorder; 

public class GameFrame { 

    JPanel[][] arrayL = new JPanel[10][10]; 
    JPanel[][] arrayR = new JPanel[10][10]; 

    public GameFrame() { 

     JFrame frame = new JFrame(); 
     frame.getContentPane().setLayout(new GridLayout(1, 2)); 

     JPanel left = new JPanel(new GridLayout(10, 10, 1, 1)); 
     left.setBorder(BorderFactory.createTitledBorder(new EmptyBorder(0, 0, 
       0, 0), "Enemy")); 
     ((TitledBorder) left.getBorder()).setTitleFont(new Font("Arial", Font.BOLD, 20)); 
     addCells(left, arrayL, Color.RED); 

     JPanel right = new JPanel(new GridLayout(10, 10, 1, 1)); 
     right.setBorder(BorderFactory.createTitledBorder(new EmptyBorder(0, 0, 
       0, 0), "You")); 
     ((TitledBorder) right.getBorder()).setTitleFont(new Font("Arial", Font.BOLD, 20)); 
     addCells(right, arrayR, Color.BLUE); 

     JPanel leftPanel = new JPanel(); 
     leftPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); 
     leftPanel.setLayout(new GridLayout(1, 1)); 
     leftPanel.add(left); 

     JPanel rightPanel = new JPanel(); 
     rightPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); 
     rightPanel.setLayout(new GridLayout(1, 1)); 
     rightPanel.add(right); 

     frame.getContentPane().add(leftPanel); 
     frame.getContentPane().add(rightPanel); 

     frame.setSize(500, 300); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 

    } 

    public void addCells(JPanel panel, JPanel[][] array, Color color) { 

     for (int i = 0; i < 10; i++) { 
      for (int j = 0; j < 10; j++) { 

       JPanel p = new JPanel(); 
       p.setBackground(color); 
       p.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 

       array[j][i] = p; 

       panel.add(p); 

      } 
     } 

    } 

    public static void main(String[] args) { 

     new GameFrame(); 

    } 

} 
+0

*「我希望沒有人生我的氣。」*不是我! :) –