2017-10-13 48 views
1

这是我的代码来画多条......无法立刻

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

public class LineDrawing { 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       createWindow(); 
      } 
     }); 
    } 

    private static void createWindow() { 
     JFrame mainFrame = new JFrame(); 

     mainFrame.add(new myPanel()); 
     mainFrame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
     mainFrame.setBackground(Color.white); 
     mainFrame.setLocationRelativeTo(null); 
     mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainFrame.setVisible(true); 
    } 
} 

class myPanel extends JPanel { 
    int startX; 
    int startY; 
    int endX; 
    int endY; 

    public myPanel() { 

     addMouseListener(new MouseAdapter() { 
      @Override 
      public void mousePressed(MouseEvent e) { 
       startX = e.getX(); 
       startY = e.getY(); 
       repaint(startX, startY, endX, endY); 
      } 

      @Override 
      public void mouseReleased(MouseEvent e) { 
       endX = e.getX(); 
       endY = e.getY(); 
       repaint(startX, startY, endX, endY); 
      } 

      @Override 
      public void mouseClicked(MouseEvent e) { 
       startX = e.getX(); 
       endX = startX; 
       startY = e.getY(); 
       endY = startY; 
       repaint(startX, startY, endX, endY); 
      } 
     }); 

     addMouseMotionListener(new MouseMotionAdapter() { 
      @Override 
      public void mouseDragged(MouseEvent e) { 
       endX = e.getX(); 
       endY = e.getY(); 
       repaint(startX, startY, endX, endY); 
      } 
     }); 
    } 

    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.black); 
     g.drawLine(startX, startY, endX, endY); 
     repaint(); 
    } 
} 

我想画多条,同时保持前那些仍然存在的在屏幕上(框架)... 但是,当我再次点击前行被擦或删除了......

我试图设计一个图表分析的应用程序(它会告诉输入图形是否同构或不...

我的问题是,我无法绘制多条线,但只有一条线......

+0

请参阅[自定义绘画方法](https://tips4java.wordpress.com/2009/05/08/custom-painting-approaches/),了解执行此操作的两种常用方法。 – camickr

回答

2

我的问题是,我不能画多条,但只有一条线......

它绘制1行只因为你只在你的paintComponent吸引了1行。 请注意,图纸将不是是累计。

protected void paintComponent(Graphics g) 
{ 
    super.paintComponent(g); 
    g.setColor(Color.black); 
    g.drawLine(startX,startY,endX,endY); //this will draw only one line.. 
    repaint();       //do not do this! 
} 

要绘制多条线(如图),您需要一个数据结构来保存每个绘图的数据。然后你可以迭代它并从那里画多条线。

因此,而不是只保持一套阴谋(startX, startY, endX, endY)。此外

@Override 
protected void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    for(Plot p : plots) 
     p.draw(g);  //Each plot will draw itself 
} 

,:您可以为绘图创建一个类:

public class Plot 
{ 
    private int startX; 
    private int startY; 
    private int endX; 
    private int endY; 

    public Plot(int startX, int startY, int endX, int endY){ 
     this.startX = startX; 
     this.startY = startY; 
     this.endX = endX ; 
     this.endY = endY ; 
    } 

    public void draw(Grpahics g){ 
     g.setColor(Color.black); 
     g.drawLine(startX,startY,endX,endY);   
    } 
} 
在显示面板

然后,保持情节的列表:

class MyPanel extends JPanel 
{ 
    private ArrayList<Plot> plots; 

    public MyPanel(){ 
     plots = new ArrayList<Plot>(); 
    } 

    public void addPlot(int x1, int y1, int x2, int y2){ 
     plots.add(new Plot(x1, y1, x2, y2)) 
    } 

    //Invoke addPlot() in your mouseListener after you get startXY & endXY 
    //Invoke repaint() after addPlot() 
    //Don't have to do this: "repaint(startX,startY,endX,endY);" 
} 

于是最后,在你的paintComponent()您不应该在paintComponent()内拨打repaint()。当您需要刷新屏幕时,您可以在paintComponent()以外将其拨打。