我有这个简单的应用程序,其中像RECT 10 20 100 150
这样的命令在DrawPanel上绘制一个带有指定参数的矩形(扩展JPanel
)。
此外,在绘制基元后,它将其添加到List<String> cmdList;
,以便在中
DrawPanel的paintComponent(Graphics g)
我遍历列表,处理每个命令,并绘制每个命令。
我遇到的问题是在绘制几个形状后,调整大小(或最大化)面板变空。再次调整大小几次,所有的shpaes都被正确绘制。
这是绘制几个原语后的屏幕截图。
将窗口略微向左拉伸后,基元消失了。
DrawPanel
的代码public class DrawPanel extends JPanel {
private List<String> cmdList;
public final Map<String,Shape> shapes;
public DrawPanel()
{
shapes = new HashMap<String,Shape>();
shapes.put("CIRC", new Circ());
shapes.put("circ", new Circ());
shapes.put("RECT", new Rect());
shapes.put("rect", new Rect());
shapes.put("LINE", new Line());
//... and so on
cmdList = new ArrayList<String>();
}
public void addCmd(String s)
{
cmdList.add(s);
}
public void removeCmd()
{
cmdList.remove(cmdList.size());
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
setBackground(Color.BLACK);
for (int i = 0; i < cmdList.size(); ++i){
StringTokenizer cmdToken = new StringTokenizer(cmdList.get(i));
String cmdShape = cmdToken.nextToken();
int []args = new int[cmdToken.countTokens()];
for(int i1 = 0; cmdToken.hasMoreTokens(); i1++){
args[i1] = Integer.valueOf(cmdToken.nextToken());
}
shapes.get(cmdShape).draw(this, args);
}
}
public void getAndDraw(String cmdShape, int[] args)
{
shapes.get(cmdShape).draw(this, args);
}
public void rect(int x1, int y1, int width, int height)
{
Graphics g = getGraphics();
g.setColor(Color.BLUE);
g.drawRect(x1, y1, width, height);
}
public void circ(int cx, int cy, int radius)
{
Graphics g = getGraphics();
g.setColor(Color.CYAN);
g.drawOval(cx - radius, cy - radius, radius*2, radius*2);
}
}
形状(接口)的部分代码
public interface Shape {
void draw(DrawPanel dp, int[] data);
}
class Rect implements Shape {
public void draw(DrawPanel dp, int[] data) {
dp.rect(data[0], data[1], data[2], data[3]);
}
}
输入每个命令后, MainFrame (扩展JFrame
)中使用的行进行绘制。
drawPanel.getAndDraw(cmdShape, args);
drawPanel.addCmd(cmd);
为什么在窗口调整大小时,绘图面板(有时是绘画和其他时间没有)? 如何获得稳定的输出?
注意:如果我错过了什么,请询问。
答案 0 :(得分:3)
这是因为你应该使用作为paintComponent参数传递的Graphics对象时使用getGraphics()。
哦,顺便说一句,setBackground(Color.BLACK)应该在构造函数中,而不是在paintComponent方法中。