2015-02-05 6 views
2

Я пытаюсь написать большую программу, но сейчас я застрял, и я не могу понять, как решить эту проблему, что должно быть легко. Я создаю матрицу JLabels, и когда обновление фреймов я устанавливаю цвета каждой JLabel из другой матрицы. Кажется, что он работает хорошо, но самый последний JLabel выглядит странно. Неважно, сколько JLabels находится в моей сетке, это всегда один в нижнем правом углу, выглядящий странно.Java JLabel имеет белый центр, когда он должен быть заполнен

JPanel View

Я пробовал все, чтобы избавиться от маленькой белой площади в центре, но ничего не работает.

Вот код:

import javax.swing.*; 
import javax.swing.tree.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.awt.geom.*; 
import javax.swing.event.*; 
import java.io.*; 
import java.awt.GridLayout; 
import java.util.Arrays; 
import javax.swing.text.*; 


public class Tetris extends JPanel{ 
private int xsize = 10; 
private int ysize = 21; 
private JFrame tetrisFrame = new JFrame("Tetris"); 
private JLabel[][] tetrisField = new JLabel[xsize][ysize]; 
private byte[][] playGrid = new byte[xsize][ysize]; 
private byte[][] pieceL = {{-1, 0}, {-1, 1}, {0, 1}, {1, 1}}; 
private GridBagConstraints c = new GridBagConstraints(); 


    public Tetris(){ 
     tetrisFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     tetrisFrame.setPreferredSize(new Dimension(300, 600)); 
     tetrisFrame.setLayout(new GridBagLayout()); 
     c.weightx = 1; 
     c.weighty = 1; 
     c.fill = GridBagConstraints.NONE; 

     for (int x = 0; x < xsize; x++) { 
      for (int y = 0; y < ysize; y++) { 
       c.gridx = x; 
       c.gridy = y; 
       JLabel temp = new JLabel(); 
       temp.setPreferredSize(new Dimension(20, 20)); 
       temp.setOpaque(true); 
       temp.setBackground(new Color(0, 255, 0)); 
       tetrisField[x][y] = temp; 
       tetrisFrame.add(temp, c); 
      } 
     } 

     tetrisFrame.add(this, c); 
     tetrisFrame.pack(); 
     tetrisFrame.getContentPane().setBackground(new Color(120, 120, 120)); 
     tetrisFrame.setVisible(true); 
     spawnPiece(); 
    } 

    public void spawnPiece() { 
     for (int i = 0; i < 4; i++) { 
      playGrid[4+pieceL[i][0]][pieceL[i][1]] = 1; 
     } 
    } 


    public void paint(Graphics g) { 
     g.clearRect(0, 0, 500, 1050); 
     for (int x = 0; x < xsize; x++) { 
      for (int y = 0; y < ysize; y++) { 
       if (playGrid[x][y] == 1) { 
        tetrisField[x][y].setBackground(new Color(0, 0, 255)); 
       } else { 
        tetrisField[x][y].setBackground(new Color(255, 0, 0)); 

       } 
      } 
     } 
    } 
} 

Белый цвет происходит от g.clearRect(), если я удалю эту линию в центре серого цвета, такой же, как фон.

У меня также есть класс, который запускает это. Он создает только новый экземпляр класса Tetris, запускает таймер и переписывает.

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.awt.geom.*; 
import javax.swing.event.*; 
import java.io.*; 


public class Controller extends JPanel implements ActionListener { 
    private Tetris tetrisView; 
    private Timer test; 

    public Controller() { 
     tetrisView = new Tetris(); 
     test = new Timer(100, this); 
     test.start(); 
    } 

    public void actionPerformed(ActionEvent e) { 
     tetrisView.repaint(); 
    } 

    public static void main(String[] args) { 
     new Controller(); 
    } 
} 

ответ

2

Это происходит потому, что вы добавляете все компоненты JFrame и затем добавить экземпляр Tetris выше последнего JLabel:

tetrisFrame.add(this, c); 

Вы можете решить путем перемещения компонентов в JPanel.

Кроме того, для пользовательских живописи использовать paintComponent() метод вместо paint() и вызвать super.paintComponent() при запуске метода вместо g.clearRect(0, 0, 500, 1050);.

+0

Я попробую, спасибо, что нашел мою ошибку! Как вы подразумеваете, что я должен переместить компоненты в JPanel? – maxb

+0

Я пошел на другой метод, но вы все еще ответили на мой первоначальный вопрос. Спасибо! – maxb

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