gpt4 book ai didi

java - 鼠标绘图程序Java

转载 作者:行者123 更新时间:2023-11-30 04:44:19 25 4
gpt4 key购买 nike

我一直致力于一个项目,在该项目中我必须实现一系列的几个类,最终形成一个功能性绘图程序。我的问题是,当我运行测试程序时,绘图无法正常工作。为了给您一个基本的想法,我实现了形状 MyLine、MyRectangle、MyOval 的子类,所有这些都位于父类(super class) MyShape 下。这些子类中的每一个都实现自己的 draw 方法,该方法将 Graphics 参数作为参数。然后,我实现了两个类来设计可以使用鼠标绘制这些形状的界面。 DrawPanelDrawFrame 这两个类分别扩展了 JPanelJFrame

我感觉错误出在 DrawPanel 的重写 paintComponent 方法中,或者是 repaint() 方法中叫做。当我运行程序时发生的情况是整个窗口与所有菜单等正确显示,但是当我尝试绘制形状时会发生以下两种情况之一:

  1. 屏幕上没有任何反应。
  2. 如果我快速移动鼠标,我可能会看到一些以正确颜色和形状出现的小涂鸦。

此外,我注意到,如果添加 super.paintComponent(g2) 命令,我会获得正确的白色背景,并且可以看到形状很快被拖出,但它们实际上从未停留在屏幕上.

这是我的 DrawPanel 代码,我很确定这就是发生错误的地方:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.plaf.basic.BasicTabbedPaneUI.MouseHandler;



public class DrawPanel extends JPanel {

private MyShape[] shapes;
private int shapeCount;
private int shapeType;
private MyShape currentShape;
private Color currentColor;
private boolean filledShape;
private JLabel statusLabel;
private Graphics gTest;

DrawPanel(JLabel P){
shapes= new MyShape[100];
shapeCount=0;
statusLabel=P;
currentColor= Color.black;
currentShape=null;
setBackground(Color.white);
shapeType=1;
Mouse handler= new Mouse();
addMouseListener(handler);
addMouseMotionListener(handler);

}

@Override
protected
void paintComponent(Graphics g2){
super.paintComponent(g2);
while(shapeCount>1 && currentShape!=null)
{
currentShape.draw(g2);
shapeCount--;
}
}

//set methods

void setColor(Color c){
currentColor=c;
}
void setFill(boolean f){
filledShape= f;
}

void setShape(int s){
shapeType=s;
}

void clearLastShape(){
if(shapeCount==0)
System.out.print("There are no more shapes to clear");
else
shapeCount--;
repaint();
}

void clearDrawing(){
shapeCount=0;
repaint();
}

class Mouse extends MouseAdapter implements MouseMotionListener{

@Override
public
void mousePressed(MouseEvent e){
if(shapeType==1)
currentShape= new MyLine();
else if(shapeType==2)
currentShape= new MyRectangle();
else
currentShape= new MyOval();
currentShape.setX1(e.getX());
currentShape.setY1(e.getY());
currentShape.setColor(currentColor);
if(shapeType==2 || shapeType==3){
((MyBoundedShape) currentShape).setFill(filledShape);
}
}
@Override public void mouseReleased(MouseEvent e){
currentShape.setX2(e.getX());
currentShape.setY2(e.getY());
shapes[shapeCount]=currentShape;
shapeCount++;
currentShape=null;
repaint();

}
@Override
public void mouseMoved(MouseEvent e){
statusLabel.setText("("+e.getX()+","+e.getY()+")");
}
@Override
public void mouseDragged(MouseEvent e){
mouseMoved(e);
currentShape.setX2(e.getX());
currentShape.setY2(e.getY());
repaint();
}
}
}

感谢任何帮助。

最佳答案

您永远不会遍历数组来绘制数组所保存的形状。您可以更改 shapeCount 变量,但如果您不使用它来获取数组中的形状之一,则该变量本身不会执行任何操作。如果这是您的目标,我建议您尝试这样做。

事实上,您可能不应该更改 PaintComponent 内部的 shapeCount 变量,因为这会清除您的绘图。

关于java - 鼠标绘图程序Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11440521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com