如何在Java绘图程序中绘制线条,矩形和圆圈?

时间:2011-02-09 21:48:57

标签: java swing graphics

我正在为我的一个课程制作一个绘画程序而且我被困住了。这是我的代码的一部分(分为3个Java类)。当我点击“Ligne”按钮时,我希望能够在白色矩形中画一条线。对不起法国评论。


//cree une fenetre    
public class QUESTION  
{  
    public static void main(String[] args)  
    {  
        Paint_GUI test2 = new Paint_GUI();  
    }  
} 

import java.awt.*;  
import javax.swing.*;  

//class contenant le code pour dessiner  
public class Paint_Dessin extends JPanel
{  
   public void paintComponent(Graphics g)  
   {  
      super.paintComponent(g);  
     setBackground(Color.white);  
     g.setColor(Color.black);  
   }  

  public void TracerLigne()  
  {  
     System.out.println("LIGNE");  
  }  
}   

import javax.swing.*;  
import java.awt.event.*;  
import java.awt.*;  

public class Paint_GUI extends JFrame  
{  
    //Panels contenant tout les bouton de mon interface  
    private JPanel panelBtn;  

    //Bar d'outil Btn  
    private JButton BtnTracerLigne;

    //object Paint_Dessin 
    private Paint_Dessin espaceDessin = new Paint_Dessin();


    public Paint_GUI()  
    {  
        final int WINDOW_WIDTH = 650;  
        final int WINDOW_HEIGHT = 450;  

        setSize (WINDOW_WIDTH, WINDOW_HEIGHT);  
        setTitle("Paint v.2.0");  
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
        setLayout(new BorderLayout());  

        // Appeler la methode qui construit la barre de BTN.  
        buildPanelBtn();  
        add(panelBtn, BorderLayout.NORTH);    
        add(espaceDessin, BorderLayout.CENTER);  

        // Afficher la fenetre.  
       setVisible(true);  
 }  

 private void buildPanelBtn()  
 {  
     BtnTracerLigne = new JButton("Ligne");  
     BtnTracerLigne.addActionListener(new LigneListener());  

     // Creer le panel.  
     panelBtn = new JPanel();  
     // Ajouter les composantes au label  
     panelBtn.add(BtnTracerLigne);  
}  
private class LigneListener implements ActionListener  
{  
   public void actionPerformed(ActionEvent e)  
   {    
    espaceDessin.TracerLigne();  
   }  
}  

2 个答案:

答案 0 :(得分:1)

你当前的代码有一个问题,你在LigneListener类的actionPerformed方法中创建一个新的Paint_Dessin,虽然这个对象是从与JFrame中显示的Paint_Dessin对象相同的类创建的,但它是一个完全不同的对象和调用方法将对显示的Paint_Dessin完全没有影响。你需要做的是在Paint_GUI类中声明一个私有的Paint_Dessin变量,一个类字段,在它的声明或Paint_GUI构造函数中初始化这个变量,然后在GUI中显示这个对象,并在这个GUI上调用方法在监听器类中。如,

public class Paint_GUI extends JFrame  
{  
    private JPanel panelBtn;  
    private JButton BtnTracerLigne;  
    private Paint_Dessin espaceDessin = new Paint_Dessin();

    public Paint_GUI()  
    {  
        final int WINDOW_WIDTH = 650;  
        //... code deleted for sake of brevity

        // Paint_Dessin espaceDessin = new Paint_Dessin();  
        add(espaceDessin, BorderLayout.CENTER);  

        // Afficher la fenetre.  
       setVisible(true);  
 }  

 private void buildPanelBtn()  
 {  
     // ....
 }  

private class LigneListener implements ActionListener  
{  
   public void actionPerformed(ActionEvent e)  
   {  
    // Paint_Dessin tracerLigne = new Paint_Dessin();  
    // tracerLigne.TracerLigne();  
    espaceDessin.TracerLigne(); // call the method on the same object!
   }  
}  

答案 1 :(得分:0)

你应该创建另一个类,例如GraphComponent,它扩展JComponent。您还应该考虑实施MouseInputListener。我不会给你解决方案,但这是一个好的开始;)。

无论如何,我看到你是法国人,所以看看site-du-zero,这里有非常好的教程(法语)。

N.B:你不应该把你的名字命名为QUESTION,把问题改为

编辑: 这里有另一个提示:

public class Paint_Dessin extends JComponent implements MouseInputListener{  
    private List<Point> startPoints = new ArrayList<Point>();
    @Override
    public void mouseClicked(MouseEvent e) {
        int x = e.getX();
        int y = e.getY();
        Point p = new Point(x,y);
        startPoints.add(p);
        repaint();
    }
    protected void paintComponent(Graphics g) {
        g.setColor(getForeground());
        Graphics2D g2 = (Graphics2D) g;
        for (Point p : startPoints)
            p.draw(g2);
    }
    public class Point{
        private int x,y;
        public Point(int x, int y){
            this.x = x;
            this.y = y;
        }
        void draw(Graphics2D g2) {
            //do the drawing with the right shape you want 
        }
    }

并查看Shape。您应该从MouseInputListener实现其他方法,例如mouseDragged,....