我有一项任务,我必须在同一个面板上绘制6个形状。 我尝试了几件事,但我找不到在同一个面板上绘制形状的方法,但仅限于不同的面板。
我有Shapes的课程:
public abstract class MyShape extends JPanel
public abstract class MyBoundedShape extends MyShape
public class MyOval extends MyBoundedShape
public class MyRectangle extends MyBoundedShape
public class MyLine extends MyShape
在这些类中我没有编写paintComponent方法,但是我已经在一个diffreent类中编写了它,它接收一个Shapes数组作为属性:
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
public class DrawingShapes extends JPanel implements Cloneable{
private ArrayList<MyShape> Shapes;
public DrawingShapes(ArrayList<MyShape> Shapes){
this.Shapes=Shapes;
initilizePaintComponent(); //draws a frame for the paintComponent
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
for (int i = 0; i <Shapes.size(); i++) {
g.setColor(Shapes.get(i).get_color());
if (Shapes.get(i) instanceof MyRectangle){
if (((MyRectangle) Shapes.get(i)).get_isFilled()){
g.fillRect(Shapes.get(i).get_x1(),Shapes.get(i).get_y1(),
Shapes.get(i).get_width(),Shapes.get(i).get_height());
}
else
g.drawRect(Shapes.get(i).get_x1(), Shapes.get(i).get_y1(),
Shapes.get(i).get_width(), Shapes.get(i).get_height());
}
if (Shapes.get(i) instanceof MyOval){
if (((MyRectangle) Shapes.get(i)).get_isFilled()){
g.fillOval(Shapes.get(i).get_x1(),Shapes.get(i).get_y1(),
Shapes.get(i).get_width(),Shapes.get(i).get_height());
}
else
g.drawOval(Shapes.get(i).get_x1(), Shapes.get(i).get_y1(),
Shapes.get(i).get_width(), Shapes.get(i).get_height());
}
else
g.drawLine(Shapes.get(i).get_x1(), Shapes.get(i).get_y1(),
Shapes.get(i).get_width(), Shapes.get(i).get_height());
}
}
public void initilizePaintComponent(){
JFrame frame = new JFrame("Shapes");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400,400);
for (int i = 0; i < Shapes.size(); i++) {
frame.add(Shapes.get(i));
frame.setVisible(true);
}
}
}
我的问题是paintComponent方法不起作用 - 程序不会绘制单个形状。
运行程序后,我得到一个名为&#34; Shape&#34;的空框架。 - 框架可以正常工作,但没有形状。
为什么paintComponent没有工作?
谢谢!
答案 0 :(得分:2)
此:
public void initilizePaintComponent(){
JFrame frame = new JFrame("Shapes");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400,400);
for (int i = 0; i < Shapes.size(); i++) {
frame.add(Shapes.get(i));
frame.setVisible(true);
}
}
忽略JFrame(以及所有顶级窗口)默认使用的布局管理器BorderLayout。虽然您可能会将Shapes.size()
组件添加到JFrame,但只有最后一个组件可见,因为通过以默认方式添加它们,BorderLayout将覆盖所有先前添加的组件,并添加最后添加的组件。
可能的解决方案:
public void draw(Graphics g)
draw(g)
方法。有关此答案的详细信息,请考虑使用您的问题创建和发布有效的MCVE计划。