java - PaintComponent 中使用 BorderFactory 的图形工件

标签 java swing graphics jpanel visual-artifacts

我有一些正在编写(实际上是重写)的拼字游戏的代码,到目前为止它分为 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/

相关文章:

java - 队列或 REST API 是处理用户请求的更好方法吗?

java - jTable isCellEditable 覆盖不起作用

java - 使 JList 滚动到其元素的末尾

java - 点不对齐

java - 绘制图像的一部分(Java)

java - 当配置文件不活动时包括 bean 定义

java - 关于如何让我的温度转换器工作有什么想法吗?

java - 使用抛出 java.io.IOException 并获取 System.in.read();通过整数访问案例

java - 如何在作为 BufferedImage() 的 JFrame 中添加 JPanel

java - JFrame 和图形的深度 (Java)