Java 在JComponent中存储形状
我不确定如何使用一个shape类型的arraylist存储多个不同的形状。这是主要的Java 在JComponent中存储形状,java,swing,arraylist,Java,Swing,Arraylist,我不确定如何使用一个shape类型的arraylist存储多个不同的形状。这是主要的 public class A1 { public static boolean rDraw = false; public static boolean eDraw = false; public static boolean lDraw = false; public static void main(String[] args) { JFrame frame = new JFrame();
public class A1 {
public static boolean rDraw = false;
public static boolean eDraw = false;
public static boolean lDraw = false;
public static void main(String[] args) {
JFrame frame = new JFrame();
JButton rect = new JButton("Rectangle");
rect.addActionListener(new ActionListener (){
public void actionPerformed(ActionEvent e){
if(e.getSource()==rect){
rDraw = true;
eDraw = false;
lDraw = false;
}
}
});
JButton ellipse = new JButton("Ellipse");
ellipse.addActionListener(new ActionListener (){
public void actionPerformed(ActionEvent e){
if(e.getSource()==ellipse){
rDraw = false;
eDraw = true;
lDraw = false;
}
}
});
JButton edge = new JButton("Edge");
edge.addActionListener(new ActionListener (){
public void actionPerformed(ActionEvent e){
if(e.getSource() == edge){
rDraw = false;
eDraw = false;
lDraw = true;
}
}
});
JButton label = new JButton("Label");
JTextField labelField = new JTextField(20);
JPanel panel = new JPanel();
panel.add(rect);
panel.add(ellipse);
panel.add(edge);
panel.add(label);
panel.add(labelField);
frame.add(panel,BorderLayout.NORTH);
JComponent canvas = new Canvas();
frame.add(canvas,BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 600);
frame.setTitle("Graph Draw");
frame.setVisible(true);
}
}
在我的画布上,我不确定如何使用drawShape?以及在paintComponent中放置什么来存储形状
public class Canvas extends JComponent {
private Point p,p2;
private Rectangle r;
private Ellipse2D ep;
private Line2D l;
ArrayList<Shape> shapes = new ArrayList<Shape>();
public Canvas(){
class MyMouseListener implements MouseListener{
@Override
public void mouseClicked(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
if(A1.rDraw == true && A1.eDraw == false && A1.lDraw == false){
p = e.getPoint();
r = new Rectangle(p.x, p.y, p.x - p.x, p.y - p.y);
}
else if (A1.rDraw == false && A1.eDraw == true && A1.lDraw == false){
p = e.getPoint();
ep = new Ellipse2D.Double(p.x, p.y, p.x - p.x, p.y - p.y);
}
else if (A1.rDraw == false && A1.eDraw == false && A1.lDraw == true){
p = e.getPoint();
l = new Line2D.Double(p.x, p.y, p.x - p.x, p.y - p.y);
}
}
@Override
public void mouseReleased(MouseEvent e) {
if(A1.rDraw == true && A1.eDraw == false && A1.lDraw == false){
if (r.width != 0 || r.height != 0)
{
addRectangle(r);
}
r = null;
}
else if (A1.rDraw == false && A1.eDraw == true && A1.lDraw == false){
if (ep.getWidth() != 0 || ep.getHeight() != 0){
addEllipse(ep);
}
ep = null;
}
else if (A1.rDraw == false && A1.eDraw == false && A1.lDraw == true){
if (l.getP1() != null || l.getP2() != null){
addLine(l);
}
l = null;
}
}
}
class MyMouseMotionListener implements MouseMotionListener{
@Override
public void mouseDragged(MouseEvent e) {
if(A1.rDraw == true && A1.eDraw == false && A1.lDraw == false){
int x = Math.min(p.x, e.getX());
int y = Math.min(p.y, e.getY());
int width = Math.abs(p.x - e.getX());
int height = Math.abs(p.y - e.getY());
r.setBounds(x, y, width, height);
repaint();
}
else if (A1.rDraw == false && A1.eDraw == true && A1.lDraw == false){
int x = Math.min(p.x, e.getX());
int y = Math.min(p.y, e.getY());
int width = Math.abs(p.x - e.getX());
int height = Math.abs(p.y - e.getY());
ep.setFrame(x, y, width, height);
repaint();
}
else if (A1.rDraw == false && A1.eDraw == false && A1.lDraw == true){
p2 = e.getPoint();
l.setLine(p, p2);
repaint();
}
}
@Override
public void mouseMoved(MouseEvent arg0) {
// TODO Auto-generated method stub
}
}
MouseListener mListener = new MyMouseListener();
addMouseListener(mListener);
MouseMotionListener mmListener = new MyMouseMotionListener();
addMouseMotionListener(mmListener);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
for (Shape shape:shapes){
}
if(A1.rDraw == true && A1.eDraw == false && A1.lDraw == false){
g2d.draw(r);
}
else if (A1.rDraw == false && A1.eDraw == true && A1.lDraw == false){
g2d.draw(ep);
}
else if (A1.rDraw == false && A1.eDraw == false && A1.lDraw == true){
g2d.draw(l);
}
}
public void addRectangle(Rectangle rect){
if(r != null){
Rectangle cR = new Rectangle(rect);
shapes.add(cR);
repaint();
}
}
public void addEllipse(Ellipse2D ellipse){
if (ep != null){
Ellipse2D cEp = new Ellipse2D.Double(ellipse.getX(),ellipse.getY(),ellipse.getWidth(),ellipse.getHeight());
shapes.add(cEp);
repaint();
}
}
public void addLine(Line2D line){
if(l != null){
Line2D cL = new Line2D.Double(line.getP1(), line.getP2());
shapes.add(cL);
repaint();
}
}
}
公共类画布扩展JComponent{
专用点p,p2;
私有矩形r;
私人Ellipse2D ep;
私人专线;
ArrayList形状=新的ArrayList();
公共画布(){
类MyMouseListener实现MouseListener{
@凌驾
公共无效鼠标单击(鼠标事件arg0){
//TODO自动生成的方法存根
}
@凌驾
公共无效鼠标事件(鼠标事件arg0){
//TODO自动生成的方法存根
}
@凌驾
public void mouseexitted(MouseEvent arg0){
//TODO自动生成的方法存根
}
@凌驾
公共无效鼠标按下(MouseEvent e){
if(A1.rDraw==true&&A1.eDraw==false&&A1.lDraw==false){
p=e.getPoint();
r=新矩形(p.x,p.y,p.x-p.x,p.y-p.y);
}
else if(A1.rDraw==false&&A1.eDraw==true&&A1.lDraw==false){
p=e.getPoint();
ep=新的椭圆2倍(p.x,p.y,p.x-p.x,p.y-p.y);
}
else if(A1.rDraw==false&&A1.eDraw==false&&A1.lDraw==true){
p=e.getPoint();
l=新线2D.双(p.x,p.y,p.x-p.x,p.y-p.y);
}
}
@凌驾
公共无效MouseEvent(MouseEvent e){
if(A1.rDraw==true&&A1.eDraw==false&&A1.lDraw==false){
如果(r.宽度!=0 | | r.高度!=0)
{
添加矩形(r);
}
r=null;
}
else if(A1.rDraw==false&&A1.eDraw==true&&A1.lDraw==false){
如果(ep.getWidth()!=0 | | ep.getHeight()!=0){
加法器(ep);
}
ep=零;
}
else if(A1.rDraw==false&&A1.eDraw==false&&A1.lDraw==true){
if(l.getP1()!=null | | l.getP2()!=null){
addLine(l);
}
l=零;
}
}
}
类MyMouseMotionListener实现MouseMotionListener{
@凌驾
公共无效鼠标标记(鼠标事件e){
if(A1.rDraw==true&&A1.eDraw==false&&A1.lDraw==false){
intx=Math.min(p.x,e.getX());
inty=Math.min(p.y,e.getY());
int width=Math.abs(p.x-e.getX());
int height=Math.abs(p.y-e.getY());
r、 立根(x、y、宽度、高度);
重新油漆();
}
else if(A1.rDraw==false&&A1.eDraw==true&&A1.lDraw==false){
intx=Math.min(p.x,e.getX());
inty=Math.min(p.y,e.getY());
int width=Math.abs(p.x-e.getX());
int height=Math.abs(p.y-e.getY());
ep.设置框(x、y、宽度、高度);
重新油漆();
}
else if(A1.rDraw==false&&A1.eDraw==false&&A1.lDraw==true){
p2=e.getPoint();
l、 设定线(p,p2);
重新油漆();
}
}
@凌驾
public void mouseMoved(MouseEvent arg0){
//TODO自动生成的方法存根
}
}
MouseListener mListener=新的MyMouseListener();
addMouseListener(mListener);
MouseMotionListener mmListener=新的MyMouseMotionListener();
addMouseMotionListener(mmListener);
}
公共组件(图形g){
超级组件(g);
Graphics2D g2d=(Graphics2D)g;
用于(形状:形状){
}
if(A1.rDraw==true&&A1.eDraw==false&&A1.lDraw==false){
g2d.绘图(r);
}
else if(A1.rDraw==false&&A1.eDraw==true&&A1.lDraw==false){
g2d.draw(ep);
}
else if(A1.rDraw==false&&A1.eDraw==false&&A1.lDraw==true){
g2d.图纸(l);
}
}
公共void addRectangle(矩形rect){
如果(r!=null){
矩形cR=新矩形(rect);
形状。添加(cR);
重新油漆();
}
}
公共无效加法器(椭圆E2D椭圆){
如果(ep!=null){
Ellipse2D cEp=新的Ellipse2D.Double(椭圆.getX(),椭圆.getY(),椭圆.getWidth(),椭圆.getHeight());
形状。添加(cEp);
重新油漆();
}
}
公共无效添加线(Line2D线){
如果(l!=null){
Line2D cL=newline2d.Double(line.getP1(),line.getP2());
形状。添加(cL);
重新油漆();
}
}
}
您的paintComponent方法似乎做得太多太少:太少的原因是它没有绘制形状,太多的原因是它试图使用静态布尔字段来做它不应该做的事情
“…以及在paintComponent中放置什么来存储形状。”
这不应该是paintComponent方法的一部分。此方法仅用于在零部件上绘制项目。它不应用于程序逻辑。存储形状的代码应该在鼠标侦听器类型代码中,而不是在paintComponent中
我认为您在paintComponent中所需要的只是:
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
for (Shape shape : shapes) {
g2d.draw(shape); // !! added
}
}
作为两个旁注:
- A1类中有太多的静态代码,包括静态字段,大部分都应该是实例代码,主方法中的大部分代码应该被删除并放入构造函数中。主要方法应该非常小
- 您需要将Canvas类重命名为不同的名称,因为这可能会与核心Java类Java.awt.Canvas产生名称冲突,并且如果将来将该类移动到另一个包中,可能会混淆其他类甚至编译器
- 你可以合并你的任务