Search code examples
javaswingjframejpaneltetris

JPanel within JFrame


I've just started learning Java and now I'm making a GUI for Tetris. I want to have something like that: 1

But I get:
2

EDIT: Could someone tell me how to fix this?

It is the part of a TetrisFrame's (extending JFrame) constructor:

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);

It is a part of my TetrisPanel class:

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);

Solution

  • The TetrisPanel is the main panel, then you should add it with BorderLayout.CENTER instead of BorderLayout.LINE_START.

    And, parameters correct order is getContentPane(component, layoutOrientation);

    Below, a layout sample:

    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);
        }
    }
    

    JFrame generated by the code