我正在尝试编写一些自定义绘画代码。具体来说,我希望有一堆扩展的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);
}
}
答案 0 :(得分:3)
以这种方式使用JPanel
将导致您无法解决问题。
你遇到的两个主要问题是......
JPanel
已经对大小和位置有所了解,添加另一个x / y坐标只会令人困惑,并可能导致您绘制组件可视空间JPanel
的默认首选大小为0x0。这意味着当您使用JPanel
添加另一个FlowLayout
时,面板的大小为0x0,因此不会绘制任何内容。相反,请创建一个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);