1

私が書いている (実際には書き直した) スクラブル ゲームのコードがいくつかあり、これまでのところ 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));
  }
}
4

1 に答える 1

1

これはあなたの最初の問題です(そしておそらくあなたの2番目の問題です)

public void paintComponent(Graphics g)
{
    g.setColor(color);
    setBorder(BorderFactory.createLineBorder(border, 2));
}

まず、super.paintComponentその行動に電話するか、責任を負わなければなりません。Graphicsこれにより、コンテキストがクリアされ、さらにペイントする準備が整います。

paintXxx第 2 に、無効化または再描画の原因となる可能性のあるメソッド内から 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));

詳細については、境界線の使用方法を確認してください...

于 2013-02-14T07:54:38.127 に答える