Java JLabel 在应该填充的时候有白色的中心
Java JLabel has white center when it should be filled
我正在尝试编写一个更大的程序,但现在我卡住了,我不知道如何解决这个问题,这应该很容易。我正在创建一个 JLabel 矩阵,当框架更新时,我从不同的矩阵设置每个 JLabel 的颜色。它似乎运行良好,但最后一个 JLabel 看起来很奇怪。无论我的网格中有多少个 JLabel,它始终是右下角看起来很奇怪的那个。
我已经尝试了所有方法来去除中间的白色小方块,但没有任何效果。
代码如下:
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()
,如果我删除那条线,中心是灰色的,与背景相同。
我也有一个运行这个的 class。它只会创建俄罗斯方块的新实例 class、启动计时器并重新绘制。
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();
}
}
发生这种情况是因为您将所有组件添加到 JFrame
,然后在最后一个 JLabel
上方添加 Tetris
的实例:
tetrisFrame.add(this, c);
你可以通过将组件移动到JPanel
来解决它。
同样对于自定义绘画使用 paintComponent()
方法而不是 paint()
,并在方法开始时调用 super.paintComponent()
而不是 g.clearRect(0, 0, 500, 1050);
。
我正在尝试编写一个更大的程序,但现在我卡住了,我不知道如何解决这个问题,这应该很容易。我正在创建一个 JLabel 矩阵,当框架更新时,我从不同的矩阵设置每个 JLabel 的颜色。它似乎运行良好,但最后一个 JLabel 看起来很奇怪。无论我的网格中有多少个 JLabel,它始终是右下角看起来很奇怪的那个。
我已经尝试了所有方法来去除中间的白色小方块,但没有任何效果。
代码如下:
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()
,如果我删除那条线,中心是灰色的,与背景相同。
我也有一个运行这个的 class。它只会创建俄罗斯方块的新实例 class、启动计时器并重新绘制。
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();
}
}
发生这种情况是因为您将所有组件添加到 JFrame
,然后在最后一个 JLabel
上方添加 Tetris
的实例:
tetrisFrame.add(this, c);
你可以通过将组件移动到JPanel
来解决它。
同样对于自定义绘画使用 paintComponent()
方法而不是 paint()
,并在方法开始时调用 super.paintComponent()
而不是 g.clearRect(0, 0, 500, 1050);
。