当自定义绘制代码在另一个类中时,不执行自定义绘制

时间:2014-03-02 02:43:59

标签: java swing custom-painting

我正在尝试编写一些自定义绘画代码。具体来说,我希望有一堆扩展的JPanels绘制我的GUI的不同方面,但每个扩展面板都包含如何绘制的说明。

我已经创建了代码,但由于某种原因,无论我做什么,扩展的JPanel都没有在我的JFrame中的主JPanel上绘制。以下是我main class和我extended JPanels之一的要点。我错过了什么?

突围

//Java imports
import javax.swing.JFrame;
import java.awt.Dimension;
import javax.swing.JPanel;
//Personal imports
import Ball;

public class Breakout {

    public static void main (String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {//start the GUI in a new thread
            public void run(){
                showGUI();
            }
        });
    }

    private static void showGUI() {
        JFrame frame = new JFrame("Breakout");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Dimension d = new Dimension(640,480);
        frame.setMinimumSize(d);
        frame.setResizable(false);
        JPanel p = new JPanel();
        p.add(new Ball(200,200,50,255,0,0));
        frame.add(p);
        frame.setVisible(true);
    }

}

import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Graphics;

public class Ball extends JPanel {

    public int x;
    public int y;
    public int radius;
    public Color colour;

    public Ball(int x, int y, int radius, int r, int g, int b) {
        super();
        this.x = x;
        this.y = y;
        this.radius = radius;
        colour = new Color(r,g,b);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        //define constants
        int topLeftX = x+radius;
        int topLeftY = y+radius;
        int diameter = radius *2;
        //draw outline
        g.setColor(Color.BLACK);
        g.drawOval(topLeftX, topLeftY, diameter, diameter);
        //fill it in
        g.setColor(colour);
        g.fillOval(topLeftX, topLeftY, diameter, diameter);
    }
}

2 个答案:

答案 0 :(得分:3)

以这种方式使用JPanel将导致您无法解决问题。

你遇到的两个主要问题是......

  1. JPanel已经对大小和位置有所了解,添加另一个x / y坐标只会令人困惑,并可能导致您绘制组件可视空间
  2. JPanel的默认首选大小为0x0。这意味着当您使用JPanel添加另一个FlowLayout时,面板的大小为0x0,因此不会绘制任何内容。
  3. 相反,请创建一个interface,其中包含一个名为paint的方法,并使用Graphics2D个对象。

    对于要绘制的每个形状,创建一个实现此interface的新类,并使用它的paint方法根据需要绘制对象。

    创建自定义组件,从JPanel延伸并维护这些形状的List。在paintComponent中,使用for-loop绘制List中的每个形状。

    然后应将此自定义组件添加到您的框架中......

答案 1 :(得分:0)

在主要课程的showGUI方法中,您有以下代码:

JPanel p = new JPanel();
p.add(new Ball(200,200,50,255,0,0));
frame.add(p);

此代码创建一个新的JPanel,然后将另一个 JPanel添加到其中。这是不正确的,因为将另一个JPanel添加到您刚刚创建的非常好的JPanel中是没有意义的。相反,只需这样做:

frame.getContentPane().add(new Ball(200, 200, 50, 255,0,0));

或者如果您愿意:

Ball ball = new Ball(200, 200, 50, 255,0,0);
frame.getContentPane().add(ball);