2013-10-10 45 views
-3

我正在编写简单的项目来绘制线条并保存喜欢的图像,但是当我运行时,它会显示我无法修复的错误。请帮帮我。绘制并保存图像

这里是我的代码

package image; 
import java.awt.BorderLayout; 
import java.awt.Button; 
import java.awt.Color; 
import java.awt.Point; 
import java.awt.Graphics; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 


public class paint extends JFrame{ 
private Point points[] = new Point[10000]; 
private Point pointends[] = new Point[10000]; 
private int pointCount = 0; 
private JButton save_btn; 
public paint() 
{ 
    panel paint2 = new panel(); 
    add(paint2,BorderLayout.CENTER); 
} 
private class panel extends JPanel 
{ 

    public panel() 
    { 
     setBackground(Color.WHITE); 
     save_btn = new JButton(); 
     save_btn.setText("123"); 
     this.add(save_btn); 
    /* save btnhandler = new save(); 
     save_btn.addActionListener(btnhandler);*/ 
     MouseHandler handler = new MouseHandler(); 
     this.addMouseMotionListener(handler); 

     this.addMouseListener(handler); 
    } 
    @Override 
    protected void paintComponent(Graphics g) 
    { 
     // TODO Auto-generated method stub 
     super.paintComponent(g); 
     for(int i = 0;i <pointCount;i++) 
     { 
      g.setColor(Color.RED); 
      g.drawLine(points[i].x, points[i].y, pointends[i].x, pointends[i].y); 
     }   
    } 
} 

private class MouseHandler extends MouseAdapter 
{ 
    @Override 
    public void mouseDragged(MouseEvent e) 
    { 
     // TODO Auto-generated method stub 
      pointends[ pointCount-1] = e.getPoint(); 
      repaint(); 


    } 
    @Override 
    public void mousePressed(MouseEvent e) { 
     // TODO Auto-generated method stub 
     super.mousePressed(e); 
//find point 
        if(pointCount < points.length) 
     { 
      points[ pointCount ] = e.getPoint();//find point 
      pointends[ pointCount ] = e.getPoint(); 
      pointCount++; 
      repaint(); 
     } 
    } 
    @Override 
    public void mouseReleased(MouseEvent e) { 
     // TODO Auto-generated method stub 
     super.mouseReleased(e); 
     /*pointends[pointCount]=e.getPoint(); 
     repaint(); 
     pointCount++; 
    */ 
    } 

} 

} 

和类的保存事件

package image; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.nio.Buffer; 

import javax.imageio.ImageIO; 
import javax.swing.JOptionPane; 

public class save implements ActionListener{ 

private paint paint1 = new paint(); 
@Override 
public void actionPerformed(ActionEvent e) { 
    // TODO Auto-generated method stub 
    String str = JOptionPane.showInputDialog(null, "Enter file name: "); 
      // 
    BufferedImage bufImage = new BufferedImage(paint1.getWidth(), paint1.getHeight(),BufferedImage.TYPE_INT_RGB); 
    try { 
     ImageIO.write(bufImage, "jpg", new File(str + ".jpg")); 
    } catch (IOException ox) { 
     // TODO: handle exception 
     ox.printStackTrace(); 
    } 
} 

}//end class 
+0

对不起语法错误:(但不关心它, –

+0

_it显示错误_这些错误是什么 –

+0

什么是错误 – Joni

回答

1

的问题是,你paint的JFrame创建您的save ActionListener的实例,和你的save的ActionListener创建一个你的JFrame的实例。因此,你遇到了一个无限循环的构造函数。

而不是创建一个新的paint对象,而是在构造函数中传递当前的对象save。现在

private paint paint1 = null; 
public save(paint panel) { 
    this.paint1 = panel; 
} 

,在你panel构造函数,传递到当前实例的引用到的ActionListener:

save btnhandler = new save(my_paint);  // see Update below 
save_btn.addActionListener(btnhandler); 

这应该可以解决您的眼前的问题。不过,我建议您稍微重新构建您的代码,并且还应该尝试遵循Java编码约定,例如,使用CamelCase名称作为类,并使用正确的缩进。这会让其他人(和你自己)更容易阅读和管理你的代码。

更新:我刚刚意识到你的对象结构更复杂一点......你paint的JFrame创建panel的JPanel,它创建了一个save的ActionListener,这又创建了一个paint的JFrame。基本参数和解决方案保持不变,但不是使用new save(this),而是必须传递对包含JPanel的JFrame的引用,或者更改ActionListener中字段的类型。

或者,您可以制作paint JFrame的JPanel和ActionListener内部类。通过这种方式,您可以直接从ActionListener中访问JFrame,而不必传递引用,从而完全避免了这个问题,并为代码提供了更多的结构。

相关问题