2011-12-01 43 views
0

我一直在試圖調試幾個小時。該程序應該是一個繪圖座標的繪圖器,但是我不能得到任何東西來顯示,甚至沒有隨機的線條,但是如果我在那裏放置一個打印語句,它就可以工作。這是paintComponent方法的問題。當我在g.drawLine之前輸出print語句時,它會打印出來,但是即使我把一個隨機線放在座標(1,3),(2,4)上,它也不會畫出任何線條。paintComponent方法沒有在面板上顯示任何東西

import java.awt.*; 
import java.util.*; 
import javax.swing.*; 
public abstract class XYGrapher 
{ 
    abstract public Coordinate xyStart(); 
    abstract public double xRange(); 
    abstract public double yRange(); 
    abstract public Coordinate getPoint(int pointNum); 
    public class Paint extends JPanel 
    { 
     public void paintGraph(Graphics g, int xPixel1, int yPixel1, int xPixel2, int yPixel2) 
     { 
      super.paintComponent(g); 
      g.setColor(Color.black); 
      g.drawLine(xPixel1, yPixel1, xPixel2, yPixel2); 
     } 
     public void paintXAxis(Graphics g, int xPixel, int pixelsWide, int pixelsHigh) 
     { 
      super.paintComponent(g); 
      g.setColor(Color.green); 
      g.drawLine(xPixel, 0, xPixel, pixelsHigh); 
     } 
     public void paintYAxis(Graphics g, int yPixel, int pixelsWide, int pixelsHigh) 
     { 
      super.paintComponent(g); 
      g.setColor(Color.green); 
      g.drawLine(0, yPixel, pixelsWide, yPixel); 
     } 
    } 
    public void drawGraph(int xPixelStart, int yPixelStart, int pixelsWide, int pixelsHigh) 
    { 
     JFrame frame = new JFrame(); 
     Paint panel = new Paint(); 
     panel.setPreferredSize(new Dimension(pixelsWide, pixelsHigh)); 
     panel.setMinimumSize(new Dimension(pixelsWide, pixelsHigh)); 
     panel.setMaximumSize(new Dimension(pixelsWide, pixelsHigh)); 
     frame.setLocation(frame.getToolkit().getScreenSize().width/2 - pixelsWide/2, frame.getToolkit().getScreenSize().height/2 - pixelsHigh/2); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setResizable(false); 
     frame.add(panel); 
     frame.pack(); 
     frame.setVisible(true); 

     double xRange = xRange(); 
     double yRange = yRange(); 
     Coordinate xyStart = xyStart(); 

     int xPixel = xPixelStart - (int) (xyStart.getX() * (pixelsWide/xRange)); 
     int yPixel = yPixelStart + (int) ((xyStart.getY() + yRange) * (pixelsHigh/yRange)); 

     System.out.println(xPixel + " " + yPixel); 

     if(yPixel > 0 && (yPixel < pixelsHigh)) 
     { 
      System.out.println("y"); 
      panel.paintYAxis(panel.getGraphics(), yPixel, pixelsWide, pixelsHigh); 
     } 
     if(xPixel > 0 && (xPixel < pixelsHigh)) 
     { 
      System.out.println("x"); 
      panel.paintXAxis(panel.getGraphics(), xPixel, pixelsWide, pixelsHigh); 
     } 

     for(int i = 0; i>=0; i++) 
     { 
      Coordinate point1 = getPoint(i); 
      Coordinate point2 = getPoint(i+1); 
      if(point2 == null) 
      { 
       break; 
      } 
      else 
      { 
       if(point1.drawFrom() && point2.drawTo()) 
       { 
        int xPixel1 = (int) (xPixelStart + (point1.getX() - xyStart.getX()) * (pixelsWide/xRange)); 
        int yPixel1 = (int) (yPixelStart + (xyStart.getY() + yRange-point1.getY()) * (pixelsHigh/yRange)); 
        int xPixel2 = (int) (xPixelStart + (point2.getX() - xyStart.getX()) * (pixelsWide/xRange)); 
        int yPixel2 = (int) (yPixelStart + (xyStart.getY() + yRange - point2.getY()) * (pixelsHigh/yRange)); 

        panel.paintGraph(panel.getGraphics(), xPixel1, yPixel1, xPixel2, yPixel2); 
       } 
      } 
     } 
     frame.pack(); 
    } 
} 

這是我如何測試它應該是一個正方形,但沒有顯示出來。

public class GrapherTester extends XYGrapher 
{ 
    public Coordinate xyStart() 
    { 
     return new Coordinate(-2,2); 
    } 
    public double xRange() 
    { 
     return 4; 
    } 
    public double yRange() 
    { 
     return 4; 
    } 
    public Coordinate getPoint(int pointNum) 
    { 
     switch(pointNum) 
     { 
      case 0: return new Coordinate(-1,-1); 
      case 1: return new Coordinate(1,-1); 
      case 2: return new Coordinate(1,1); 
      case 3: return new Coordinate(-1,1); 
      case 4: return new Coordinate(-1,-1); 
     } 
     return null; 
    } 
    public static void main(String[] args) 
    { 
     new GrapherTester().drawGraph(100, 100, 500, 500); 
    } 
} 

協調類,所以如果你們中的任何一個想運行並試用它。這就是你需要的一切。

public class Coordinate 
{ 
    float x; 
    float y; 
    boolean drawTo; 
    boolean drawFrom; 
    Coordinate(double x, double y) 
    { 
     this.x = (float) x; 
     this.y = (float) y; 
     drawFrom = true; 
     drawTo = true; 
    } 
    Coordinate(double x, double y, boolean drawFrom, boolean drawTo) 
    { 
     this.x = (float) x; 
     this.y = (float) y; 
     this.drawFrom = drawFrom; 
     this.drawTo = drawTo; 
    } 
    public double getX() 
    { 
     return x; 
    } 
    public double getY() 
    { 
     return y; 
    } 
    public boolean drawTo() 
    { 
     return drawTo; 
    } 
    public boolean drawFrom() 
    { 
     return drawFrom; 
    } 
} 
+0

爲了更快得到更好的幫助,請發佈[SSCCE](http://sscce.org/)。 –

+0

對不起。剛開始使用這個,新的。我提供了一切你需要現在運行它。請幫忙。 –

+0

凹凸。請幫忙! –

回答

5

方法paintGraph(...),paintXAxis(...)和paintYAxis(...)不應該調用的paintComponent()。

相反,代碼應該是相反的方式。那就是你應該重寫paintComponent()方法,它將會調用這3個方法。您傳遞給每個方法的參數也應該是Paint類的屬性。所以你可能還需要添加一些setter方法來爲所有屬性賦值。

另外,不要忘記重寫Paint類的getPreferredSize()方法,以便佈局管理器可以正確地佈置組件。

我建議你首先閱讀關於Custom Painting的Swing教程的部分,以獲得更詳細的解釋和工作示例。

+0

是的,它得到了它的工作謝謝 –

3

類不覆蓋paintComponent(Graphics)


還有其他一些奇怪的方面的代碼所示,從..

frame.setLocation(frame.getToolkit().getScreenSize().width/2 - pixelsWide/2, frame.getToolkit().getScreenSize().height/2 - pixelsHigh/2); 

是什麼翻譯成任何人類的語言中,「畫面中心」?如果是這樣,可以使用更簡單的實現:

frame.setLocationRelativeTo(null); 

但更好的是,我們現在有..

frame.setLocationByPlatform(true); 

爲一個簡單的例子見here

+0

由於某些原因,您提供的用於居中窗口的代碼不起作用。這很奇怪。它應該帶到中間還是其他地方。在我的規格說它帶來中間。對不起,沒有學到很多圖形,剛開始(在高中)。 –

+1

@Captain:調用'setLocationRelativeTo()'_after_'pack()'和_before_'setVisible()'。 – trashgod

+0

*「出於某種原因,您提供的用於居中窗口的代碼不起作用。「*注意,其中一個旨在將窗口居中,而另一個則使其看起來不像是飛濺(即不居中);)我沒有再看過代碼,但似乎您還需要實現 –