2015-05-31 28 views
1

我嘗試做一個非常簡單的事情..在類中Main我畫了2行座標系..並且在類userPaint從x1 y1 x2 y2(已經初始化)中畫出1行。問題是3行(座標系和x1y1x2y2行)不在同一個窗口/框架中。編譯器創建2個窗口...我該如何解決這個問題?一幀中的Java畫線

主要類:

import static javax.swing.JFrame.EXIT_ON_CLOSE; 
import java.awt.*; 
import javax.swing.*; 

public class Main extends JFrame { 

    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 
     g.drawLine(20, 80, 20, 200); 
     g.drawLine(20, 200, 140, 200); 
    } 

    public Main(String title){ 
     super(title); 
     setSize(800, 600); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     Main main = new Main("Graph"); 
     userPaint up = new userPaint(); 
    } 
} 

userPaint類:

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

public class userPaint extends JFrame { 
    int x1, y1, x2, y2; 

    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 
     g.drawLine(x1, y1, x2, y2); 
    } 

    public userPaint(){ 
     //Gives 4 numbers for points to drawline. Assume that the x1,y1,x2,y2 are given by Scanner.. but im gonna initialize 
     x1 = 200; 
     y1 = 200; 
     x2 = 300; 
     y2 = 300; 
     setSize(800, 600); 
     setVisible(true); 
    } 
} 
+0

你想在一個窗口中繪製 - 所以要用一個窗口,並在失敗中汲取2行。你不需要2班 - 一個足夠好,它應該畫所有線。換句話說 - 合併這兩個類到一個,你將有一個窗口。 – Alex

+0

是的,但我想要1行被固定..(主類)和另一行由用戶(x1,y1,x2,y2)給出,所以如果我在1類中做: public void paint (圖形g)super.paint(g); g.drawLine(20,80,20,200); g.drawLine(20,200,140,​​200); g1drawLine(x1,y1,x2,y2); //它從哪裏獲取變量? } – Sotnam96

+1

讓'JFrame'包含一個管理繪畫的'JPanel' - 繪畫應該通過覆蓋'paintComponent'方法 – copeg

回答

4
  1. 不要直接畫到JFrame,而油漆的JPanel您可以添加的的內容窗格JFrame通過JFrameadd方法
  2. (1)中的繪畫應該通過ove排除paintComponent方法(而不是paint方法)。

例如:

public class Painter extends JPanel{ 

    public Painter(){ 

    } 

    @Override 
    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     g.drawLine(20, 80, 20, 200); 
     g.drawLine(20, 200, 140, 200); 
     g.drawLine(x1, y1, x2, y2); 
    } 
} 

... 
JFrame frame = new JFrame("Title"); 
frame.add(new Painter()); 

畫2線座標系

你提到的座標系統,所以你不妨來抵消x1..y2值座標系統的座標系統的座標系,以便畫出的線落在軸的邊界內。作爲一個例子:

 g.drawLine(20, 80, 20, 200);//y-axis 
     g.drawLine(20, 200, 140, 200);//x-axis 
     g.drawLine(x1 + 20, 200 - y1, x2 + 20, 200 - y2);//offset by coordinate system 

上述偏移通過的x軸的位置的x值,和由所述y軸的位置的y值(帶負這樣的情節不被反轉) - 假設這些值已經不被偏移,並且它們的像素位置相對於軸的邊界。

最後一點:類名應該是大寫

+0

來完成,如果我用JPanel來做,那麼編譯器不會理解super(「Title Name」)我如何設置窗口名稱,大小等? – Sotnam96

+0

這是在構建JFrame時完成的。請參閱上面的代碼片段中的小修改 - 1)創建JFrame,設置它的名稱,佈局等... 2)創建Painter類的實例3)將(2)添加到(1) – copeg

+1

FYI:'paintComponent' should被「保護」,沒有必要讓任何人能夠稱呼它 – MadProgrammer