我有一些正在编写(实际上是重写)的拼字游戏的代码,到目前为止它分为 3 个类。 Tile
类在放入窗口时似乎会生成 BorderFactory 工件。为什么会出现这个伪影,如何消除它?
*如果您没有看到伪影,请尝试慢慢调整窗口大小。
这是 Scrabble
类。
import javax.swing.JFrame;
import java.awt.BorderLayout;
public class Scrabble extends JFrame implements Runnable
{
public Board board;
public Scrabble()
{
super("Scrabble!");
board = new Board();
addBorderLayoutObjects();
}
public void run()
{
makeSettings();
setVisible(true);
}
public void makeSettings()
{
setSize(850, 900);
setDefaultCloseOperation(EXIT_ON_CLOSE);
//this.setResizable(false);
}
public void addBorderLayoutObjects()
{
getContentPane().add(BorderLayout.CENTER, board);
}
public static void main(String[] args)
{
Scrabble s = new Scrabble();
javax.swing.SwingUtilities.invokeLater(s);
}
}
这是 Board
类。
import javax.swing.JPanel;
import java.awt.Point;
import java.awt.Color;
import java.awt.GridLayout;
public class Board extends JPanel
{
public Tile [][] board;
public Board()
{
super(new GridLayout(15, 15));
board = new Tile[15][15];
makeBoard();
}
public void makeBoard()
{
for(int k = 0; k < 225; k++)
{
board[k/15][k%15] = new Tile(new Color(0xCBC4A8), Color.BLACK);
}
for(int a = 0; a < 15; a++)
{
for(int l = 0; l < 15; l++)
{
add(board[a][l]);
}
}
}
}
以及Tile
类。
import javax.swing.JPanel;
import javax.swing.BorderFactory;
import java.awt.Point;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
public class Tile extends JPanel implements MouseListener
{
private Color color;
private Color border;
public Tile(Color _color, Color _border)
{
color = _color;
border = _border;
}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mousePressed(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
public void mouseClicked(MouseEvent e){}
@Override
public void paintComponent(Graphics g)
{
g.setColor(color);
setBorder(BorderFactory.createLineBorder(border, 2));
}
}
最佳答案
这是您的第一个问题(也可能是您的第二个问题)
public void paintComponent(Graphics g)
{
g.setColor(color);
setBorder(BorderFactory.createLineBorder(border, 2));
}
首先,您必须调用 super.paintComponent
或对其操作负责。这将清除并准备Graphics
上下文以供进一步绘制。
其次,您绝对不应该在 paintXxx
方法中修改任何 UI 组件,这可能会导致其失效或重新绘制。这样做会结束你烧毁CPU的无限循环...
在构造函数中设置边框或根据程序需要更改它,不要在 paint
方法中执行此操作...
更新了更多示例
当您需要更改边框时,只需在要更改的标题实例上调用 setBorder
即可...
public Tile(Color _color, Color _border)
{
color = _color;
border = _border;
setBorder(BorderFactory.createLineBorder(border, 2));
}
或
Title tile = new Tile(Color.RED, Color.BLUE);
//...
title.setBorder(BorderFactory.createLineBorder(Color.GREEN, 2));
查看How to use borders欲了解更多信息...
关于java - PaintComponent 中使用 BorderFactory 的图形工件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14869426/