2012-05-17 143 views
1

我剛開始學習Java,現在我正在爲俄羅斯方塊製作GUI。我想有這樣的事情: 1 http://desmond.imageshack.us/Himg846/scaled.php?server=846&filename=tetrisf.png&res=landingJFrame中的JPanel

,但我得到:
2 http://img835.imageshack.us/img835/8466/tetrisissue.png

編輯:有人能告訴我如何解決這一問題?

這是一個TetrisFrame的(擴展的JFrame)構造的一部分:

setLayout(new BorderLayout()); 

/* adding a panel of the left side */ 
left = new TetrisPanel(Constants.WIDTH, Constants.HEIGHT); 
getContentPane().add(BorderLayout.LINE_START, left); 
left.setSize(Constants.WIDTH * Constants.BLOCK_SIZE, 
      Constants.HEIGHT * Constants.BLOCK_SIZE); 

/* adding a panel on the right side */ 
JPanel right = new JPanel(); 
getContentPane().add(BorderLayout.LINE_END, right); 

nextPiecePreview = new TetrisPanel(4 , 4); 
points = new JLabel("0"); 

right.add(nextPiecePreview); 

setSize(Constants.WIDTH * Constants.BLOCK_SIZE + Constants.RIGHT_MENU_SIZE, 
     Constants.HEIGHT * Constants.BLOCK_SIZE + Constants.BOTTOM_MARGIN); 

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
setResizable(false); 
setVisible(true); 

這是我TetrisPanel類的一部分:

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    setBounds(0, 0, Constants.BLOCK_SIZE * width , 
      Constants.BLOCK_SIZE * height); 

    for(int i = 0; i < width; ++i) { 
    for(int j = 0; j < height; ++j) { 
     drawSquare(g, i, j, colorsMap.get(BlocksType.Z_SHAPED)); 
    } 
    } 
} 

private void drawSquare (Graphics g, int x_temp, int y_temp, Color color) { 
    int x = x_temp * Constants.BLOCK_SIZE; 
    int y = y_temp * Constants.BLOCK_SIZE; 

    g.setColor(color); 
    g.fillRect(x + 1, y + 1, Constants.BLOCK_SIZE - 2, Constants.BLOCK_SIZE - 2); 

    g.setColor(color.brighter()); 

    g.drawLine(x, y + Constants.BLOCK_SIZE - 1, x, y); 
    g.drawLine(x, y, x + Constants.BLOCK_SIZE - 1, y); 

    g.setColor(color.darker()); 
    g.drawLine(x + 1, y + Constants.BLOCK_SIZE - 1, 
     x + Constants.BLOCK_SIZE - 1, y + Constants.BLOCK_SIZE - 1); 

    g.drawLine(x + Constants.BLOCK_SIZE - 1, y + Constants.BLOCK_SIZE - 1, 
      x + Constants.BLOCK_SIZE - 1, y + 1); 

回答

3

TetrisPanel主要面板,那麼你應該BorderLayout.CENTER而不是BorderLayout.LINE_START添加。

而且,參數的正確順序是getContentPane(component, layoutOrientation);

下面,佈局樣本:

public class GuiExample extends JPanel { 
    public GuiExample() { 
     JPanel gamePanel = new JPanel(); 
     gamePanel.setBackground(Color.GREEN); 
     gamePanel.setPreferredSize(new Dimension(300, 400)); 

     JPanel infoPanel = new JPanel(); 
     infoPanel.setBackground(Color.WHITE); 

     JPanel previewPanel = new JPanel(); 
     previewPanel.setBackground(Color.BLUE); 
     previewPanel.setPreferredSize(new Dimension(100, 100)); 

     JPanel pointsPanel = new JPanel(); 
     pointsPanel.setBackground(Color.RED); 
     pointsPanel.setPreferredSize(new Dimension(100, 50)); 

     infoPanel.setLayout(new BoxLayout(infoPanel, BoxLayout.Y_AXIS)); 
     infoPanel.setPreferredSize(new Dimension(100, 400)); 
     infoPanel.add(previewPanel); 
     infoPanel.add(pointsPanel); 

     add(gamePanel, BorderLayout.CENTER); 
     add(infoPanel, BorderLayout.EAST); 
    } 
    public static void main(String s[]) { 
     JFrame frame = new JFrame("Java Rules"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setContentPane(new GuiExample()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 

​​

+0

非常感謝。其實,這是最好的答案。 – nme

2

我實在不明白一個問題,任何地方,但我認爲你的問題是,「爲什麼我的GUI看起來不像我期望的?」或者按照「我如何修復佈局?」的方式

你可以做什麼,是得到一個像NetBeans一樣的GUI生成器,並在那裏製作你的GUI。然後像上面那樣使用代碼處理組件。至少您可以根據需要保證GUI佈局。其餘的功能。

+0

+1的猜測和回答問題有一個很好的答案。 – 11684

0

而是與BorderLayout.LINE_STARTBorderLayout.LINE_END加入您的左側和右側面板,嘗試(分別)使用BorderLayout.CENTERBorderLayout.EAST

+0

我已經試過這個,它不能解決這個問題。 – nme

+1

它們兩者都是相同的東西,雖然從Java 1.4開始,Java不鼓勵使用NORTH,EAST,WEST和SOUTH。 PAGE_START,LINE_END,PAGE_END和LINE_START分別取代了它的位置。 –

2

只是一個側面說明,當你覆蓋JPanel/JComponent的方法JPanel/JComponent使它成爲一個慣例,重寫它的以及。使用佈局管理器時,不要使用任何種類的setXxXSize()方法。讓Layout Manager處理該方面。這是你在尋找什麼:

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

public class Tetris extends JFrame 
{ 
    private void createAndDisplayGUI() 
    { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     GamePanel gp = new GamePanel(); 
     gp.createGUI(); 

     JPanel rightPanel = new JPanel(); 
     rightPanel.setLayout(new BorderLayout()); 
     PreviewPanel pp = new PreviewPanel(); 
     pp.createGUI(); 

     JPanel pointsPanel = new JPanel(); 
     pointsPanel.setOpaque(true); 
     pointsPanel.setBackground(Color.DARK_GRAY); 
     JLabel pointsLabel = new JLabel("Points"); 
     pointsPanel.add(pointsLabel); 
     rightPanel.add(pp, BorderLayout.PAGE_START); 
     rightPanel.add(pointsPanel, BorderLayout.CENTER); 

     getContentPane().add(gp, BorderLayout.CENTER); 
     getContentPane().add(rightPanel, BorderLayout.LINE_END); 

     pack(); 
     setLocationByPlatform(true); 
     setVisible(true); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new Tetris().createAndDisplayGUI(); 
      } 
     }); 
    } 
} 

class GamePanel extends JPanel 
{ 
    public Dimension getPreferredSize() 
    { 
     return (new Dimension(500, 500)); 
    } 

    protected void createGUI() 
    { 
     setOpaque(true); 
     setBackground(Color.BLUE); 
    } 
} 

class PreviewPanel extends JPanel 
{ 
    public Dimension getPreferredSize() 
    { 
     return (new Dimension(200, 200)); 
    } 

    protected void createGUI() 
    { 
     setOpaque(true); 
     setBackground(Color.WHITE); 
     JLabel label = new JLabel("Preview of the next Block."); 
    } 
} 

,輸出是:

TETRIS OUTPUT