2009-07-16 37 views
8

Để trả lời một số previous question về cách đạt được hiệu ứng nhất định với Swing, tôi được chuyển đến JDesktopPane và JInternalFrame. Thật không may, scala.swing dường như không có bất kỳ wrapper cho cả hai lớp, vì vậy tôi còn lại với mở rộng nó.Làm cách nào để mở rộng scala.swing?

Tôi phải biết và làm gì để tạo các trình bao bọc có thể sử dụng tối thiểu cho các lớp này, được sử dụng với và bởi scala.swing và các bước bổ sung để thực hiện hầu hết trong số chúng là gì?

Edit:

Theo đề nghị của một ai đó, hãy để tôi giải thích tác dụng tôi dự định để đạt được. Các chương trình cược xổ số (cá nhân) của chương trình của tôi. Vì vậy, tôi có một số vé khác nhau, mỗi vé có thể có một số cược khác nhau và có giá trị khác nhau. Ý tưởng hiển thị mỗi vé trong một "không gian" riêng biệt và JInternalFrames dường như chỉ là những gì tôi muốn và cho phép mọi người tạo vé mới, tải chúng từ tệp, lưu chúng vào tệp và thường kiểm tra hoặc chỉnh sửa thông tin trong mỗi. Bên cạnh đó, cần phải có khoảng trống để hiển thị kết quả xổ số và tôi dự định phát triển chương trình để có thể kiểm soát các phiên cược tập thể - người đã đóng góp bao nhiêu và cách chia chiến thắng. Tôi chưa xem xét giao diện cho điều đó.

Xin lưu ý rằng:

  • tôi có thể không phải là "chỉ cần sử dụng" các lớp Java, và vẫn tận dụng tối đa các tính năng xoay Scala. Các câu trả lời trong câu hỏi trước đã cho tôi biết làm thế nào để làm những gì tôi muốn với các lớp Java, và đó không phải là những gì tôi yêu cầu ở đây.

  • Đọc mã nguồn của các lớp scala.swing hiện có để tìm hiểu cách thực hiện nó là công việc tôi đang cố gắng tránh với câu hỏi này.

Trả lời

0

Bạn có thể nhập tất cả thư viện java trực tiếp vào mã scala của mình.

Hãy thử phần hướng dẫn scala: "tương tác với Java".

Java in scala

0

Bạn đang cố gắng sử dụng loại tính năng scala nào? Điều đó có thể giúp đỡ trong việc đưa ra một câu trả lời. I E. - bạn đang cố gắng làm gì với nó, có khả năng trong Java? Sau đó, chúng ta có thể cố gắng tìm ra một cách tốt hơn để làm điều đó với Scala và/hoặc tạo một trình bao bọc cho các lớp mà sẽ làm cho những gì bạn đang cố làm thậm chí còn dễ dàng hơn.

+0

Đủ công bằng. Tôi sẽ thêm vào câu hỏi của tôi. –

+0

Cảm ơn bạn đã thêm thông tin, nhưng tôi có nghĩa là ở cấp độ kỹ thuật hơn - tức là lập trình, bạn muốn làm gì với lớp Swing? –

3

Bạn có thể xem xét cơ chế "chuyển đổi tiềm ẩn" của Scala.Bạn có thể làm một cái gì đó như thế này:

implicit def enrichJInternalFrame(ji : JInternalFrame) = 
       new RichJInternalFrame(ji) 

Bây giờ bạn định nghĩa một RichJInternalFrame lớp() mà phải mất một JInternalFrame, và có bất cứ phương pháp bạn muốn mở rộng JInternalFrame với, ví dụ:

class RichJInternalFrame(wrapped : JInternalFrame) { 
    def showThis = { 
    wrapped.show() 
    } 
} 

này tạo ra một phương thức mới showThis mà chỉ các cuộc gọi hiển thị trên JInternalFrame. Bây giờ bạn có thể gọi phương thức này trên JInternalFrame:

val jif = new JInternalFrame() 
println(jif.showThis); 

Scala sẽ tự động chuyển đổi jif thành RichJInternalFrame và cho phép bạn gọi phương thức này trên đó.

+1

Có lẽ tôi nên rõ ràng hơn trong phần mô tả câu hỏi của tôi. Như câu hỏi chính nó nói, tôi muốn mở rộng scala.swing. Làm cách nào để mở rộng * scala.swing *? Một câu trả lời thậm chí không đề cập đến một đặc điểm, lớp hoặc phương pháp scala.swing không thể trả lời câu hỏi! –

0

Trong JRuby, bạn có thể kết hợp một (hoặc nhiều) đặc điểm vào JDesktopPane hoặc JInternalFrame thay vì mở rộng chúng. Bằng cách này bạn sẽ không phải quấn các lớp nhưng chỉ sử dụng các đối tượng hiện có. Theo tôi biết, điều này là không thể với những đặc điểm Scala.

May mắn thay, có một giải pháp, gần như linh hoạt như của Ruby: lexically open classes. Bài viết trên blog này đưa ra một giới thiệu tuyệt vời, IMHO.

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