2013-03-12 3 views
0

Я пытаюсь реализовать Tetris в Swing, потому что я пытаюсь рисовать прямоугольники, смежные с каждым, но второй прямоугольник не приближается к первому.Как рисовать прямоугольники, смежные в Swing?

Также, если getPreferredSize() возвращает что-либо менее 50,50, то на экране ничего не отображается. Что не так в этом коде и как рисовать соседние прямоугольники.

public class Tetris extends JFrame 
{ 

    public Tetris(String string) 
    { 
     super(string); 
    } 
    public static void main(String[] args) 
    { 
     Tetris tetris = new Tetris("Tetris"); 
     tetris.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel mainPanel = new JPanel(); 
     tetris.getContentPane().add(mainPanel); 
     tetris.setVisible(true); 
     tetris.setLocationRelativeTo(null); 
     tetris.pack(); 
     tetris.setSize(500, 500); 
     tetris.setResizable(false); 
     tetris.paintBoard(mainPanel); 
    } 

    public void paintBoard(JPanel mainPanel) 
    { 
     Piece p1 = new Piece(10,10,50,50,Color.GREEN); 
     Piece p2 = new Piece(60,10,50,50,Color.RED); 
     mainPanel.add(p1); 
     mainPanel.add(p2); 
    } 
} 

public class Piece extends JComponent 
{ 
    private int X = 0; 
    private int Y = 0; 
    private int H = 0; 
    private int W = 0; 
    private Color c; 

    public Piece(int X, int Y, int W, int H, Color c) 
    { 
     this.X = X; 
     this.Y = Y; 
     this.W = W; 
     this.H = H; 
     this.c = c; 
    } 

    @Override 
    public void paintComponent(Graphics g) 
    { 
     g.setColor(c); 
     g.drawRect(X, Y, W, H); 
     g.fillRect(X, Y, W, H); 
     System.out.println("g.drawRect("+X+", "+Y+", "+W+", "+H+")"); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(50, 50); 
    } 
} 

ответ

2

если GetPreferredSize() возвращает все, что меньше, чем 50,50, то ничего не отображается на экране

Это потому, что вы установили X координату 60 для «красного «Piece, но предпочтительная ширина по размеру компонента равна 50, поэтому компонент вытягивается из экрана.

Чтобы добавить компоненты, вы можете просто нарисовать все компоненты Piece по адресу 0, 0 и позволить менеджеру компоновки позаботиться о позиционировании. Помимо этого, учитывая, что это игра Tetris, вы должны рассмотреть возможность рисования всех компонентов на одном компоненте и использовать Swing Timer для управления кусками.

0

Вам нужно установить LayoutManager JPanel равным null, если вы хотите, чтобы Pieces, который вы добавляете, отображались в указанных вами координатах.

public void paintBoard(JPanel mainPanel) 
{ 
    Piece p1 = new Piece(10,10,50,50,Color.GREEN); 
    Piece p2 = new Piece(60,10,50,50,Color.RED); 
    mainPanel.setLayout(null) 
    mainPanel.add(p1); 
    mainPanel.add(p2); 
} 
+0

независимо от проблемы, не используя LayoutManager _not_ решение – kleopatra

1
  • переопределение getPreferredSize для JPanel, в противном случае возвращает ноль JPanelDimension

  • поместить все Objects в массив

  • внутри петли paintComponent только в массиве

  • использование Swing Timer (только один экземпляр) для анимации

  • example about all a.m. points

+1

+1 для таймера качания – Reimeus

1

Общая проблема является проблемой Swing Layout. В вашей mainPanel JPanel есть макет по умолчанию FlowLayout, который пытается упорядочить каждую вещь (Piece), которую вы добавляете к ней. Каждый компонент paintComponent будет контролировать только сам цвет, а не на общей mainPanel. Поэтому ваши пьесы не окрашиваются относительно общей основной панели.

Что-то как:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Tetris extends JFrame 
{ 

    public Tetris(String string) 
    { 
     super(string); 
    } 
    public static void main(String[] args) 
    { 
     Tetris tetris = new Tetris("Tetris"); 
     tetris.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel mainPanel = new JPanel(); 
     mainPanel.setLayout(new BorderLayout()); 
     tetris.getContentPane().setLayout(new BorderLayout()); 
     tetris.getContentPane().add(mainPanel, BorderLayout.CENTER); 
     tetris.setLocationRelativeTo(null); 
     tetris.pack(); 
     tetris.setSize(500, 500); 
     tetris.setResizable(false); 
     tetris.setVisible(true); 
     tetris.paintBoard(mainPanel); 
    } 

    public void paintBoard(JPanel mainPanel) 
    { 
     Piece p1 = new Piece(10,10,50,50,Color.GREEN); 
     Piece p2 = new Piece(60,10,50,50,Color.RED); 

     Board board = new Board(); 

     board.addPiece(p1); 
     board.addPiece(p2); 

     mainPanel.add(board, BorderLayout.CENTER); 
    } 

    private class Board extends JComponent 
    { 
     private List<Piece> pieces = new ArrayList<Piece>(); 

     public void addPiece(Piece piece) 
     { 
      pieces.add(piece); 
     } 

     @Override 
     public void paintComponent(Graphics g) 
     { 
      for(Piece piece : pieces) 
      { 
       g.setColor(piece.c); 
       g.drawRect(piece.X, piece.Y, piece.W, piece.H); 
       g.fillRect(piece.X, piece.Y, piece.W, piece.H); 
      } 
     } 
    } 

    private class Piece 
    { 
     private int X = 0; 
     private int Y = 0; 
     private int H = 0; 
     private int W = 0; 
     private Color c; 

     public Piece(int X, int Y, int W, int H, Color c) 
     { 
      this.X = X; 
      this.Y = Y; 
      this.W = W; 
      this.H = H; 
      this.c = c; 
     } 
    } 
} 
1

Существует одна логическая ошибка здесь. Вы рисуете Piece с использованием метода paintComponent(), но исходные координаты x и y, которые вы даете, можно подстраивать в контексте mainPanel (10, 10 или 60, 10), в то время как вам нужно предоставить их в контексте текущего компонента Piece, например попробуйте это :

@Override 
public void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); 
    g.setColor(c); 
    g.drawRect(0, 0, W, H); 
    g.fillRect(0, 0, W, H); 
    System.out.println("g.drawRect("+X+", "+Y+", "+W+", "+H+")"); 
} 

он правильно показывает, что вы хотите.

Он также объясняет, почему меньший размер не работал, вещь в контексте текущего компонента, а не родительского компонента.

Смежные вопросы