2013-05-08 39 views
6

Thông thường, khi tôi tạo một lớp, ví dụ: Customer, tôi cung cấp cho một số trường dữ liệu, ví dụ: public int IdNumber; và một số phương pháp, tức là public String getName(){...}. Nhưng đó là khá nhiều. Tôi không thể vượt qua điều đó và bắt đầu chơi với đồ họa - tôi chỉ có thể thao tác và tổ chức dữ liệu theo như lớp cho phép.JFrame hoạt động như thế nào? Sâu bên trong, làm thế nào nó vẽ thứ?

Tôi không thể hiểu được những gì đang diễn ra bên trong JFrame. Bất cứ ai đã viết lớp JFrame, làm thế nào họ viết một lớp có thể làm cho một hộp xuất hiện trên màn hình? Điều gì đang xảy ra trong nội bộ khiến điều này xảy ra? Có anyway để thi đua nó?

Câu hỏi tương tự cũng áp dụng cho tất cả các lớp Java dựa trên đồ họa. Tôi thực sự tò mò muốn biết nó hoạt động như thế nào, vì nó làm tôi bực bội mỗi lần tôi sử dụng một trong số chúng.

+1

Điều này có thể nguy hiểm gần với "Có thể viết một cuốn sách quá rộng", nhưng tôi muốn bị cuốn hút để biết câu trả lời không phân biệt –

+0

Tôi nghĩ rằng nó sử dụng hệ điều hành cơ bản để hiển thị chúng – Sam

+4

Và bạn không ngạc nhiên về tất cả các lớp mạng chẳng hạn? Đó chính là điều tương tự. VM sử dụng bất kỳ API gốc nào có sẵn trên nền tảng này. – Mat

Trả lời

3

Java bắt đầu bằng awt (Bộ công cụ tạo cửa sổ trừu tượng) và sau đó giới thiệu xoay.

Trong AWT vòng xử lý sự kiện nền tảng được nối vào và các sự kiện được đóng gói trong các lớp java riêng và một hàng đợi/xử lý sự kiện đơn (xử lý song song) xử lý chúng. Swing kế thừa điều này.

Trong AWT mọi thành phần GUI, như nút radio hoặc mục menu, có mã kiểm soát "ngang hàng" gốc, thành phần được cung cấp nền tảng. Có một tập hợp các lớp java và đối tác C của chúng. Đặc biệt thú vị là lớp đồ họa java cho phép vẽ tùy chỉnh các dòng, hình chữ nhật và như vậy. Nó được xem xét dưới Windows với một CDC (Device Context) - có lẽ.

Trong Swing hầu hết các thành phần nền tảng được mô phỏng, nghĩa là, tự tái tạo: bản vẽ, xử lý chuột, v.v. Vì vậy, phần bản địa đơn giản hơn, có thể nói là một CWnd (thành phần Window) với bản vẽ tùy chỉnh.

Đu có thể đạt được chức năng phong phú và nhất quán hơn. Bạn có thể tưởng tượng rằng việc thiết lập màu backgroud trên nút radio AWT có thể không thực hiện được hoặc sử dụng HTML trên nhãn hoặc đầu công cụ. Ngoài ra Swing có thể làm skinning, chủ đề, LookAndFeels. Màn hình Hệ thống là cảm nhận gần giống với các thành phần nền tảng. Đặc biệt các thành phần Swing có nhiều hơn trọng lượng nhẹ, vì không phải mọi thành phần đều có kiểm soát ngang hàng bản địa để được xử lý trong C.

Bây giờ SWT là một sáng kiến ​​sau này của IBM được thực hiện trong nhật thực để tải lại AWT. Không phải là tùy chỉnh như Swing nhưng dự định được nền tảng gần.

Bạn nên quên sử dụng các thành phần AWT và nếu không lập trình cho nhật thực RCP cũng là SWT.

Vì vậy: sự kiện nền tảng toàn cầu như nhấp chuột, yêu cầu repaint được dịch sang sự kiện Java. Có một hệ thống phân cấp container của JFrame, JPanels, JScrollPanes, JComponents. Một sự kiện được cử đến các thành phần xử lý, mà ví dụ paintComponent được gọi là:

@Override 
public void paintComponent(Graphics g) { 
    Graphics2D g2 = (Graphics2D) g; // A later introduced class that can do more. 
    g2.draw... 
} 

Với JavaFX có đến một cầu thủ mới, đó là IMHO chưa hoàn toàn trưởng thành, nhưng có thể sử dụng trong mã phi sản xuất. Nó cho phép hiệu ứng/hình động, quay, biến đổi, ánh sáng. Vì vậy, một kết xuất 2D - 4D, dựa trên nền tảng như dựng hình. Ngoài ra nó là tài sản dựa, do đó, một hộp kiểm sẽ không nhất thiết phải được ràng buộc với một boolean, nhưng một tài sản boolean quan sát và thông báo thay đổi. Tôi vẫn cần một số kinh nghiệm thực tế, để hình thành một kiến ​​trúc tối ưu với nó.

3

Nếu bạn tò mò về cách java được triển khai, bạn nên xem mã nguồn. http://openjdk.java.net/projects/jdk7/ sẽ là một sự khởi đầu.

Tất nhiên điều này sẽ chỉ cung cấp cho bạn thông tin chi tiết về triển khai cụ thể đó và không có nghĩa là java của bạn được triển khai theo cùng một cách.

+0

Tôi không có JFrame ở đây .... – CodyBugstein

+0

Tôi chưa tìm chính xác nơi bạn có thể tìm thấy nó, nhưng http://openjdk.java.net/groups/swing/Swing và AWT là ở đó, và đó cũng là một mô tả ngắn về nó. – Devolus

2

Làm cách nào để hộp xuất hiện trên màn hình? Chức năng này được cung cấp bởi hệ điều hành cho JVM (bởi Hệ thống Cửa sổ X trên Linux).

Ở cấp Java, JFrame kế thừa từ java.awt.Window, trong đó có "các đồng nghiệp gốc" được cung cấp bởi số windowing system gốc.

Nếu bạn thực sự muốn hiểu nó, tốt hơn nếu bạn cố gắng tạo một số cửa sổ chỉ bằng C.

+0

Tôi có thể lấy thêm thông tin về phần cuối cùng ở đâu? – CodyBugstein

+0

Điều này khác nhau trên mỗi hệ điều hành. Trên Linux "xlib" là thư viện cơ bản nhất (các thư viện khác được xây dựng trên đó). Trên Windows, "Win32 API" (hoặc "Win64 API") là thư viện cơ bản. – lbalazscs

+0

Tương tự, OS X sử dụng [Quartz] (https://en.wikipedia.org/wiki/Quartz_%28graphics_layer%29) – trashgod