2011-04-10 68 views
2

爲什麼我不能反悔?你知道如何解決它嗎?我想用DDA算法畫線。 請幫忙。來自靜態環境的非靜態方法

import java.awt.*; 
import java.awt.event.*; 
import java.lang.String.*; 
import java.util.Scanner; 
import java.io.IOException; 
import javax.swing.*; 

class Test extends JPanel { 

    private void JPanel1MouseClicked(MouseEvent evt){ 
     int x = evt.getX(); 
     int y = evt.getY(); 
     System.out.println("X to: " + x + " Y to: " + y); 

    } 

    public void sprawdz(double xx1, double xx2, double yy1, double yy2){ 

    } 

    public static void main(String[] args) { 
     String x1; 
     String x2; 
     String y1; 
     String y2; 

     Scanner sc = new Scanner(System.in); 
     System.out.print("Podaj pierwsza wspolrzedna pierwszego punktu: "); 
     x1 = sc.nextLine(); 
     System.out.print("Podaj druga wspolrzedna pierwszego punktu: "); 
     x2 = sc.nextLine(); 
     System.out.print("Podaj pierwsza wspolrzedna drugiego punktu: "); 
     y1 = sc.nextLine(); 
     System.out.print("Podaj druga wspolrzedna drugiego punktu: "); 
     y2 = sc.nextLine(); 






      //DDA2 nowy = new DDA2(x1, x2, y1, y2); 
      Test nowy = new Test(); 
      DDA2.licz(x1, x2, y1, y2); 




     JFrame ramka = new JFrame(); 
     ramka.setSize(300,300); 
     ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     ramka.getContentPane().add(new Test()); 
     ramka.setVisible(true); 

     // JPanel jp = new JPanel(); 
     // jp.setBackground(Color.WHITE); 
     // jp.setSize(100,100); 
     // jp.setLayout(new BorderLayout()); 
     // jp.setVisible(true); 


    } 


    class DDA2 { 
     double dxx1 = Double.parseDouble(xx1); 
     double dxx2 = Double.parseDouble(xx2); 
     double dyy1 = Double.parseDouble(yy1); 
     double dyy2 = Double.parseDouble(yy2); 
     double dx = x2 - x1; 
     double dy = y2 - y1; 
     public void licz(String xx1, String xx2, String yy1, String yy2){ 

      if (Math.abs(dx) >= Math.abs(dy)) 
       { 
        double m = Math.abs(dx); 
        System.out.println("DX" + m); 
       } 
       else 
       { 


        // ALGORYTYM PRZYROSTOWY 
        double m = Math.abs(dy); 
        //System.out.println("DY" + m); 
        double x = dxx1; 
        double y = dyy1; 
        for (int i=1; i <= m; i++) 
        { 
        x = x + dx/m; 
        y = y + dy/m; 

        } 
       } 

     System.out.println("Wspolrzednie punktu pierwszego to: " + "(" + dxx1 + "; " + dxx2 +")"); 
     System.out.println("Wspolrzednie punktu drugiego to: " + "(" + dyy1 + "; " + dyy2 + ")"); 
     } 



    } 

    // public void paintComponent(Graphics g){ 
     // super.paintComponent(g); 
     // g.setColor(Color.RED); 
     // g.fillRect((int) x, (int) y, 1, 1); 
    // } 
} 
+3

歡迎的StackOverflow!我已經修復了您的代碼格式。當你問你的問題時,右邊有這個方便的**如何格式**框。值得一讀,就像問題區域上方** [?] **那樣[鏈接的頁面](http://stackoverflow.com/editing-help)。 – 2011-04-10 07:30:49

回答

2

製作licz方法static。你在沒有實例的情況下調用它。此外 - 您有取決於方法參數的實例變量 - 這不是直接可能的。將它們也移動到方法體中。

一般來說,你有兩個選擇:

  • 擁有一切static - 如果你不要求你具有某種狀態的對象,並且每次調用上某些給定參數的一次性操作,那麼這是正確的路要走。我認爲這是你的情況。

  • 有一個實例。使用您希望在整個調用中重用的給定參數集來構建它。然後聲明方法是非靜態的,並決定哪些變量應該屬於實例。

0

的方法DDA2.licz(),因爲它使用了不是靜態的也類DDA2的領域不聲明爲靜態。因此,它只能應用於DDA2的實例,但不能應用於靜態環境(即,類似於DDA2 d = new DDA2(); d.licz(...);的工作可以工作,但不能工作於DDA2.licz(...);)。

0

您需要實例化DDA2並在該類的新實例上調用licz。您幾乎將正確的代碼註釋掉了。

更換DDA2.licz(x1, x2, y1, y2)

DDA2 nowy = new DDA2(); 
nowy.licz(x1, x2, y1, y2); 

編輯:錯過DDA2的破一起定義。 @ Bozho的答案是正確的。

0

在這種情況下,DAA2是一個內部類。 所以你不能讓它的方法是靜態的。 您應該使DDA2類爲靜態,然後使licz方法爲靜態。

移動DAA2類出測試類和使用這種方式:

DAA2 daa2 = new DAA2(); 
daa2.licz(x1, x2, y1, y2);