2009-06-21 46 views
23

Câu hỏi rất đơn giản nhưng tôi không thể làm được. Tôi có 3 lớp:truy cập biến từ một lớp khác

DrawCircle lớp

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

class DrawCircle extends JPanel 
{ 
    private int w, h, di, diBig, diSmall, maxRad, xSq, ySq, xPoint, yPoint; 
    public DrawFrame d; 

    public DrawCircle() 
    { 
     w = 400; 
     h = 400; 
     diBig = 300; 
     diSmall = 10; 
     maxRad = (diBig/2) - diSmall; 
     xSq = 50; 
     ySq = 50; 
     xPoint = 200; 
     yPoint = 200; 
    } 

    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     g.setColor(Color.blue); 
     g.drawOval(xSq, ySq, diBig, diBig); 

     for(int y=ySq; y<ySq+diBig; y=y+diSmall*2) 
     { 
      for(int x=xSq; x<w-xSq; x=x+diSmall) 
      { 
       if(Math.sqrt(Math.pow(yPoint-y,2) + Math.pow(xPoint-x, 2))<= maxRad) 
        { 
         g.drawOval(x, y, diSmall, diSmall); 
        }    
      } 
     } 

     for(int y=ySq+10; y<ySq+diBig; y=y+diSmall*2) 
     { 
      for(int x=xSq+5; x<w-xSq; x=x+diSmall) 
      { 
       if(Math.sqrt(Math.pow(yPoint-y,2) + Math.pow(xPoint-x, 2))<= maxRad) 
       { 
        g.drawOval(x, y, diSmall, diSmall); 
       } 
      } 
     } 
    } 
} 

DrawFrame lớp

public class DrawFrame extends JFrame 
{ 
    public DrawFrame() 
    { 
     int width = 400; 
     int height = 400; 

     setTitle("Frame"); 
     setSize(width, height); 

     addWindowListener(new WindowAdapter() 
     { 
      public void windowClosing(WindowEvent e) 
      { 
       System.exit(0); 
      } 
     }); 

     Container contentPane = getContentPane(); 
     contentPane.add(new DrawCircle()); 
    } 
} 

CircMain lớp

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

public class CircMain 
{ 
    public static void main(String[] args) 
    { 
     JFrame frame = new DrawFrame(); 
     frame.show(); 
    } 
} 

Một lớp tạo ra một khung, một lớp khác vẽ một vòng tròn và lấp đầy nó với các vòng tròn nhỏ hơn. Trong DrawFrame Tôi đặt chiều rộng và chiều cao. Trong DrawCircle Tôi cần truy cập chiều rộng và chiều cao của DrawFrame. Làm thế nào để tôi làm điều này?

Tôi đã thử tạo một đối tượng và thử sử dụng .getWidth.getHeight nhưng không thể làm cho nó hoạt động. Tôi cần mã cụ thể ở đây vì tôi đã thử rất nhiều thứ nhưng không thể làm cho nó hoạt động được. Tôi có khai báo chiều rộng và chiều cao sai trong DrawFrame không? Đang tạo đối tượng theo cách sai trong DrawCircle?

Ngoài ra, các biến tôi sử dụng trong DrawCircle, tôi có nên sử dụng chúng trong hàm tạo hay không?

+0

Bạn đã cố gắng tạo một đối tượng của lớp học nào? – Tom

Trả lời

37

Bạn có thể làm cho các biến các lĩnh vực công cộng:

public int width; 
    public int height; 

    DrawFrame() { 
    this.width = 400; 
    this.height = 400; 
    } 

Sau đó bạn có thể truy cập các biến như sau:

DrawFrame frame = new DrawFrame(); 
int theWidth = frame.width; 
int theHeight = frame.height; 

Một giải pháp tốt hơn, tuy nhiên, sẽ làm cho các biến lĩnh vực tin thêm hai phương thức truy cập vào lớp của bạn, giữ cho dữ liệu trong lớp DrawFrame được đóng gói:

private int width; 
private int height; 

DrawFrame() { 
    this.width = 400; 
    this.height = 400; 
} 

    public int getWidth() { 
    return this.width; 
    } 

    public int getHeight() { 
    return this.height; 
    } 

Sau đó, bạn có thể lấy chiều rộng/chiều cao như vậy:

DrawFrame frame = new DrawFrame(); 
    int theWidth = frame.getWidth(); 
    int theHeight = frame.getHeight(); 

Tôi đặc biệt khuyên bạn nên sử dụng phương pháp sau.

+2

i thứ hai gợi ý mạnh mẽ về phương pháp thứ hai (cũng như nhiều người khác, tôi đoán vậy. Xem: http://stackoverflow.com/questions/393001/do-any-other-developers-get-yelled-at-for-making -every-thing-public-closed) – akf

+0

Xin chào, Cảm ơn sự giúp đỡ của bạn. Tôi đã thử một cái gì đó như thế này trước đó. Tôi theo mã của bạn và vẫn không thể làm cho nó hoạt động được. Phải có một vấn đề ở một nơi khác. Bạn có đề nghị nào không. Mã trong OP hoạt động. Lớp chính của tôi trông giống như sau: nhập java.awt. *; nhập java.awt.event. *; nhập javax.swing. *; public class CircMain { \t public static void main (String [] args) { \t \t \t khung JFrame = new DrawFrame(); \t \t khung.chỉ(); \t} } Đây có phải là nguyên nhân gây ra sự cố không? –

+0

Vấn đề chính xác là gì? – Peter

1

Tôi đã cố gắng tạo một đối tượng và thử sử dụng sử dụng .getWidth và .getHeight nhưng không thể làm cho nó hoạt động.

Đó là vì bạn không đặt trường chiều rộng và chiều cao trong JFrame, nhưng bạn đang đặt chúng trên các biến cục bộ. Fields HEIGHT và WIDTH được inhereted từ ImageObserver

Fields inherited from interface java.awt.image.ImageObserver 
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH 

Xem http://java.sun.com/javase/6/docs/api/javax/swing/JFrame.html

Nếu chiều rộng và chiều cao đại diện cho nhà nước của khung, sau đó bạn có thể refactorize họ lĩnh vực, và viết thu khí cho họ.

Sau đó, bạn có thể tạo một Constructor tiếp nhận cả hai giá trị là tham số

public class DrawFrame extends JFrame { 
private int width; 
private int height; 

DrawFrame(int _width, int _height){ 

    this.width = _width; 
    this.height = _height; 

    //other stuff here 
} 
public int getWidth(){} 
public int getHeight(){} 

//other methods 
} 

Nếu widht và chiều cao sẽ là không đổi (sau khi tạo ra) sau đó bạn nên sử dụng thức modifier. Bằng cách này, một khi chúng được gán một giá trị, chúng không thể được sửa đổi.

Ngoài ra, các biến tôi sử dụng trong DrawCircle, tôi có nên đặt chúng trong công cụ xây dựng hay không?

Cách viết ngay bây giờ, sẽ chỉ cho phép bạn tạo một loại hình tròn. Nếu bạn không tạo các vòng tròn khác nhau, bạn nên quá tải hàm tạo với một đối số).

Ví dụ, nếu bạn muốn thay đổi các thuộc tính xPoint và yPoint, bạn có thể có một constructor

public DrawCircle(int _xpoint, int _ypoint){ 
    //build circle here. 
} 

EDIT:

Where does _width and _height come from? 

Đó là những luận cứ để xây dựng. Bạn đặt giá trị cho chúng khi bạn gọi phương thức Constructor.

Trong DrawFrame Tôi đặt chiều rộng và chiều cao. Trong DrawCircle tôi cần truy cập vào chiều rộng và chiều cao của DrawFrame . Làm thế nào để Tôi làm điều này?

DrawFrame(){ 
    int width = 400; 
    int height =400; 

    /* 
    * call DrawCircle constructor 
    */ 
    content.pane(new DrawCircle(width,height)); 

    // other stuff 

} 

Bây giờ khi các nhà xây dựng DrawCircle thực thi, nó sẽ nhận được các giá trị bạn sử dụng trong DrawFrame như tính _width và _height tương ứng.

EDIT:

Cố gắng làm

DrawFrame frame = new DrawFrame();//constructor contains code on previous edit. 
frame.setPreferredSize(new Dimension(400,400)); 

http://java.sun.com/docs/books/tutorial/uiswing/components/frame.html

+0

Thatnks cho sự giúp đỡ của bạn, và xin lỗi vì không nhận được nó. Tôi không thể có được nó để làm việc. Thật không may tôi không tốt hơn mà tôi đã 5 giờ trước. _width và _height xuất phát từ đâu? Tôi sắp xếp các bit của nhiều cách khác nhau để làm, nhưng không có một cách cụ thể để làm điều đó. –

+0

Ok, xem chỉnh sửa của tôi. Tôi nghĩ điều đó! – Tom

+0

Nhưng những gì vượt qua chúng vào constructor? Tôi giả định từ chính của mình: chính void tĩnh chính (String [] args) { JFrame frame = new DrawFrame (400,400); frame.show(); } Tôi đã thử cách này và nó không hoạt động. Về cơ bản, tôi vẫn đang ở nơi lúc 9 giờ sáng nay. Tôi nghi ngờ những thứ bạn đang nói với tôi không làm việc với các mã khác tôi có. Cảm ơn sự giúp đỡ của bạn, tôi sẽ để lại việc học java cho đến một ngày khác. –

0

nếu những gì bạn cần là chiều rộng và chiều cao của khung trong vòng tròn, tại sao không vượt qua được chiều rộng DrawFrame và chiều cao vào Công cụ xây dựng DrawCircle:

public DrawCircle(int w, int h){ 
    this.w = w; 
    this.h = h; 
    diBig = 300; 
    diSmall = 10; 
    maxRad = (diBig/2) - diSmall; 
    xSq = 50; 
    ySq = 50; 
    xPoint = 200; 
    yPoint = 200; 
} 

bạn cũng có thể thêm một vài phương pháp mới để DrawCircle:

public void setWidth(int w) 
    this.w = w; 

public void setHeight(int h) 
    this.h = h; 

hoặc thậm chí:

public void setDimension(Dimension d) { 
    w=d.width; 
    h=d.height; 
} 

nếu bạn đi xuống con đường này, bạn sẽ cần phải cập nhật DrawFrame để thực hiện một var địa phương của DrawCircle trên đó để gọi những phương pháp này.

chỉnh sửa:

khi thay đổi các nhà xây dựng DrawCircle như đã mô tả ở đầu bài viết của tôi, không quên để thêm chiều rộng và chiều cao để cuộc gọi đến các nhà xây dựng trong DrawFrame:

public class DrawFrame extends JFrame { 
public DrawFrame() { 
    int width = 400; 
    int height = 400; 

    setTitle("Frame"); 
    setSize(width, height); 

    addWindowListener(new WindowAdapter() 
    { 
      public void windowClosing(WindowEvent e) 
      { 
        System.exit(0); 
      } 
    }); 

    Container contentPane = getContentPane(); 
    //pass in the width and height to the DrawCircle contstructor 
    contentPane.add(new DrawCircle(width, height)); 
} 
} 
+0

Tôi nhận được lỗi nói "constructor DrawCircle là không xác định" –

+0

johnrambo, trình biên dịch của bạn có thể phàn nàn vì bạn đã thay đổi các tham số cho hàm dựng nhưng bạn đã không thay đổi cuộc gọi trong DrawFrame mà vẫn tham chiếu đến hàm tạo no-arg. vui lòng xem bản chỉnh sửa của tôi. – akf

0

Tôi hy vọng tôi hiểu vấn đề một cách chính xác, nhưng có vẻ như bạn không có một tham chiếu trở lại đối tượng DrawFrame của bạn từ DrawCircle.

Hãy thử cách này:

Thay đổi chữ ký hàm tạo của bạn cho DrawCircle để lấy đối tượng DrawFrame. Bên trong hàm tạo, đặt biến lớp "d" thành đối tượng DrawFrame mà bạn vừa nhập. Bây giờ, thêm phương thức getWidth/getHeight vào DrawFrame như được đề cập trong các câu trả lời trước. Xem liệu điều đó có cho phép bạn có được những gì bạn đang tìm kiếm hay không.

constructor DrawCircle của bạn nên được thay đổi một cái gì đó như:

public DrawCircle(DrawFrame frame) 
{ 
    d = frame; 
    w = 400; 
    h = 400; 
    diBig = 300; 
    diSmall = 10; 
    maxRad = (diBig/2) - diSmall; 
    xSq = 50; 
    ySq = 50; 
    xPoint = 200; 
    yPoint = 200; 
} 

Dòng cuối cùng của mã trong DrawFrame nên giống như thế:

contentPane.add(new DrawCircle(this)); 

Sau đó, hãy thử sử dụng d.getheight(), d.getWidth() và vv trong DrawCircle. Điều này giả định bạn vẫn có những phương thức có sẵn trên DrawFrame để truy cập chúng, tất nhiên.

+0

Xin chào, đã thử. Không thể làm cho nó hoạt động. Tôi đã thử rất nhiều thứ khác nhau, có thể là lỗi từ một nơi khác. Tôi nghĩ bạn hiểu vấn đề của tôi, nhưng hãy để tôi làm rõ: Tôi đặt chiều rộng và chiều cao trong DrawFrame Trong DrawCircle tôi cần có khả năng truy cập các giá trị chiều rộng và chiều cao. Trong mã của tôi ở trên (mà làm việc) tôi đang đặt lại bằng tay trong constructor hơn là nhận được nó từ DrawFrame. Tôi chỉ cần thiết lập chiều rộng và chiều cao một lần duy nhất. –

+0

Tôi thấy, tôi sao chép constructor của bạn cho DrawCircle chính xác và chỉ cần thêm tham số và dòng đầu tiên. Theo lời nhận xét của bạn, có vẻ như cũng cần phải thêm: "w = d.getWidth(); h = d.getHeight();" thay cho "w = 400; h = 400;" –

3

Tôi gặp vấn đề tương tự. Để sửa đổi các biến từ các lớp khác nhau, tôi đã làm cho chúng mở rộng lớp mà chúng đã sửa đổi. Tôi cũng làm cho các biến của lớp siêu tĩnh để chúng có thể được thay đổi bởi bất kỳ thứ gì thừa kế chúng. Tôi cũng làm cho chúng được bảo vệ để linh hoạt hơn.

Nguồn: Trải nghiệm không tốt. Bài học hay.

0

filename = url.java

public class url { 

    public static final String BASEURL = "http://192.168.1.122/"; 

} 

nếu u muốn gọi biến chỉ cần sử dụng này:

url.BASEURL + "mã của bạn ở đây";

Các vấn đề liên quan