2013-12-12 58 views
0

这应该是一个抽象类,可以扩展为绘制连接JPanel上某些坐标点的线。PaintComponents()永远不会调用

但是,从不调用专门的PaintComponents()方法。我看到了其他答案并试图使用他们的解决方案,例如检查我是否添加了JPanel或者是否有布局。但是,PaintComponent()仍然不会被调用,屏幕上也不会显示任何内容。

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

public abstract class XYGrapher 
{ 
private ArrayList<Coordinate> coordinates; 
int xStart; 
int yStart; 
int width; 
int height; 

public class GraphPanel extends JPanel 
{ 
    @Override 
    public void paintComponents(Graphics g) 
    { 
     super.paintComponents(g); 
     g.setColor(Color.green); 
     g.drawLine(xStart, yStart + height/2, xStart + width, yStart + height/2); 
     g.drawLine(xStart + width/2, yStart, xStart + width/2, yStart + height); 

     g.setColor(Color.black); 
     for(int i = 0; i < coordinates.size() - 1; i++) 
     { 
      Coordinate prev = coordinates.get(i); 
      Coordinate next = coordinates.get(i + 1); 

      if(prev.drawFrom() && next.drawTo()) 
      { 
       g.drawLine((int) prev.getX(), (int) prev.getY(), (int) next.getX(), (int) next.getY()); 
      } 
     } 
    } 
} 

public abstract Coordinate xyStart(); 

public abstract double xRange(); 

public abstract double yRange(); 

public abstract Coordinate getPoint(int pointNum); 

public void drawGraph(int xPixelStart, int yPixelStart, int pixelsWide, int pixelsHigh) 
{ 
    int i = 0; 

    xStart = xPixelStart; 
    yStart = yPixelStart; 
    width = pixelsWide; 
    height = pixelsHigh; 

    double X0 = xyStart().getX(); 
    double Y0 = xyStart().getX(); 

    ArrayList<Coordinate> points = new ArrayList(0); 
    ArrayList<Coordinate> mapped = new ArrayList(0); 

    while(getPoint(i) != null) 
    { 
     points.add(getPoint(i)); 
     i++; 
    } 

    for(int j = 0; j < points.size(); j++) 
    { 
     double X1 = points.get(j).getX(); 
     double Y1 = points.get(j).getY(); 

     boolean df = points.get(j).drawFrom(); 
     boolean dt = points.get(j).drawTo(); 

     int X = (int) (xPixelStart + (X1 - X0) * (pixelsWide/xRange())); 
     int Y = (int) (yPixelStart + (Y0 + yRange() -Y1) * (pixelsHigh/yRange())); 
     mapped.add(new Coordinate(X, Y, df, dt)); 
    } 

    coordinates = mapped; 

    for(int k = 0; k < coordinates.size(); k++) 
    { 
     Coordinate test = coordinates.get(k); 
     Coordinate or = points.get(k); 
     System.out.println(test.getX() + " " + test.getY()); 
     System.out.println(or.getX() + " " + or.getY()); 
    } 

    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLayout(new GridLayout(0,1) 

    JPanel graph = new GraphPanel(); 
    graph.setLayout(new GridLayout(0, 1)); 

    frame.setContentPane(graph); 
    frame.pack(); 
    frame.setVisible(true); 
} 
} 
+0

为了获得更好的支持,请考虑提供一个[SSCCE](http://sscce.org/) – MadProgrammer

回答

2

我认为“paintComponenents()”方法应该是“paintComponent()”。

+0

哦......非常感谢......正在抨击我的头,试图弄清楚发生了什么事情。新手错误。 –

+0

@ZhehaoChen OUCH! :) –

相关问题