Java - 名为paintComponent将在运行时读取但未实现

时间:2017-04-05 04:16:10

标签: java swing grid jpanel

基本上我试图在JPanel网格矩阵中添加一个圆圈(这是我的主要问题所在)。 运行下面的代码时,一旦调用新的OvalComponent类将圆圈添加到网格中的(1,1)位置,就会读取该类,但只是跳过绘制组件函数。

package Exercises;

import javax.swing.*;
import java.awt.*;
import java.io.FileNotFoundException;

/**
 * Created by user on 4/1/2017.
 */
public class Mazes extends JPanel {

public static void main(String[] args) throws FileNotFoundException {
    Mazes maze = new Mazes();
}

public Mazes() throws FileNotFoundException{
    Boolean[][] maze = Exercise4.readMaze();
    int row = maze.length;

    JFrame f = new JFrame("Maze");
    f.setLayout(new GridLayout(row, row));

    JPanel[][] grid = new JPanel[row][row];
    for (int i = 0; i < row; i++)        {
        for (int j = 0; j < row; j++)                {
            grid[i][j] = new JPanel();
            grid[i][j].setOpaque(true);
            if ((i==1&&j==1) || (i==row-1 && j==row-1))
                grid[i][j].add(new OvalComponent());

            if (maze[i][j].equals(false)){
                grid[i][j].setBackground(Color.BLACK);}
            else grid[i][j].setBackground(Color.WHITE);
            f.add(grid[i][j]);
        }
    }

    //f.add(new JButton("Reset"), BorderLayout.SOUTH);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.pack();
    f.setVisible(true);
}
class OvalComponent extends JComponent {
   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      g.setColor(Color.BLUE);
      g.fillOval(4, 4, 10, 10);
 }
}

1 个答案:

答案 0 :(得分:2)

OvalComponent没有可定义的大小(默认为0x0),因此在添加组件时,它已添加了0x0的大小并且Swing足够聪明要知道它不需要画它。

覆盖组件的getPreferredSize方法并返回适当的大小

@Override
public Dimension getPreferredSize() {
    return new Dimension(18, 18);
}

作为例子