Java JLabel应该填充白色中心

时间:2015-02-05 13:30:29

标签: java swing jlabel

我正在尝试编写一个更大的程序,但是现在我卡住了,我无法弄清楚如何解决这个问题,这应该很容易。我正在创建一个JLabel矩阵,当帧更新时,我从不同的矩阵设置每个JLabel的颜色。它似乎运作良好,但最后一个JLabel看起来很奇怪。无论我的网格中有多少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();
    }
}

1 个答案:

答案 0 :(得分:2)

这是因为您将所有组件添加到JFrame,然后在Tetris之上添加JLabel的实例:

tetrisFrame.add(this, c);

您可以通过将组件移至JPanel来解决此问题。

另外,对于自定义绘画,请使用paintComponent()方法而不是paint(),并在方法开头而不是super.paintComponent()调用g.clearRect(0, 0, 500, 1050);