2012-05-08 27 views
65

Bằng cách phù hợp, ý tôi là:Khung GUI phù hợp cho Scala?

  • trưởng thành và sử dụng rộng rãi
  • bộ phụ tùng giàu mà ám cũng
  • ngữ Scala
  • Got a builder WYSIWYG-ish nhưng GUI linh hoạt
  • tài liệu API độc lập (Nếu một trình bao bọc, nó không nên khiến tôi tham khảo dự án phụ huynh bằng một ngôn ngữ khác)

Không theo thứ tự cụ thể.

Bộ công cụ GUI nào đáp ứng các điều kiện nào?

+1

Không nhìn vào khung công tác dựa trên Java không hữu ích. Có Scala Swing, mà một phần kết thúc tốt đẹp Swing và đi kèm với Scala. Có lẽ các dự án nhỏ hơn đang cố gắng xây dựng các trình bao bọc Scala xung quanh các thứ như JavaFX 2.0 hoặc SWT. Tôi nghĩ rằng các khung công tác Java khác (thậm chí) sẽ không đáp ứng các yêu cầu của bạn. – ziggystar

+0

Tôi không nghĩ rằng một trình xây dựng GUI cho Scala tồn tại. Bạn có thể cắt và dán mã Java do NetBeans tạo ra thành IntelliJ để dịch tự động sang Scala, nhưng nếu bạn muốn thay đổi bố cục, bạn sẽ chỉ sử dụng Java Swing để không thành ngữ, nhưng không may không có thay thế hiện tại. –

+1

Tôi sẽ đề nghị bạn là những gì tôi làm ngày nay cho GUI. Phát triển GUI của bạn trong HTML (5) và JavaScript (AngularJS là tốt đẹp) và sau đó bạn có thể phát triển một máy chủ rất nhỏ trong ứng dụng của bạn để trưng ra một số dịch vụ giống như REST cho GUI của bạn. Bạn có thể mở trang ứng dụng (localhost: your-server-port) trong trình duyệt mặc định của hệ thống hoặc bạn có thể nhúng một thành phần trình duyệt trong một JFrame. Lý giải của tôi đằng sau giải pháp này là HTML là nền tảng độc lập nhất và thư viện GUI phong phú nhất trên trái đất. Ngay cả Oracle đã chính thức tuyên bố rằng Swing sẽ không được duy trì rất lâu. – ehsun7b

Trả lời

-17

Tôi muốn sử dụng .Net đã trưởng thành và được sử dụng rộng rãi.

Nhưng ...

Tôi cho rằng bạn cần sử dụng Scala. Đối với điều đó tôi muốn gắn bó với Java vì nó có hỗ trợ công cụ tốt hơn như trong IDEA hoặc NetBeans. Tất nhiên bạn có thể trộn Java và Scala. Vì vậy, GUI của bạn có thể được thực hiện bằng Java gọi Scala backend. Ngoài ra hãy nhìn vào JGoodies họ có rất nhiều công cụ tốt đẹp để xây dựng giao diện người dùng trong Swing. Tại thời điểm này không có hỗ trợ công cụ cho các ứng dụng GUI của Scala (và đối với GUI không phải là nó vẫn nằm phía sau Java).

+0

JGoodies Binding là một cách thực sự tốt để mô tả chức năng một giao diện người dùng. Khái niệm ValueModel của nó rất giống với Ống kính. Tôi muốn ai đó sẽ viết một wrapper scala hoặc thực hiện. –

+1

Bạn có thể gọi .Net từ Java không? – vy32

+0

Okey ... nhưng bằng cách này đây là câu trả lời cho câu hỏi? –

35

Scala có thư viện Swing riêng. Điều này sẽ sử dụng thư viện Swing tiêu chuẩn dưới mui xe nhưng nó có một số bổ sung tốt đẹp và đáng chú ý nhất, bởi vì nó làm cho Scala, nó có thể được sử dụng theo cách nhiều súc tích hơn thư viện Swing tiêu chuẩn:

import swing._ 

object HelloWorld extends SimpleSwingApplication { 
    def top = new MainFrame { 
    title = "Hello, World!" 
    contents = new Button { 
     text = "Click Me!" 
    } 
    } 
} 

Xem làm thế nào tốt đẹp và dễ dàng là để thiết lập các thuộc tính widget?

Ngoại trừ cú pháp đẹp hơn và các bổ sung nhỏ (như lớp SimpleSwingApplication), tôi nghĩ những ưu điểm và nhược điểm là khá giống với Swing vani.

Đây là số Overview of Scala Swing.

+0

Không giống như nhiều vết lõm? Bất cứ điều gì để tránh hiệu ứng boomerang? –

16

Tôi sử dụng Java Swing. Dưới đây là cách nó ngăn xếp dựa trên yêu cầu của bạn:

  • trưởng thành và được sử dụng rộng rãi: có, một tấn.

  • bộ tiện ích phong phú và hiển thị tốt: điều này có thể gây tranh cãi. Khi bạn xem xét khả năng dễ dàng bổ sung Java Swing với các thư viện bổ sung (ví dụ SwingX), nó ít nhất cũng tốt hơn Scala Swing trong vấn đề này, mặc dù có lẽ không phải cũng như một số bộ công cụ Java khác (mặc dù tôi không thể nói với những người đó) .

  • thành ngữ Scala: không tệ như bạn nghĩ. Một vài chức năng helper làm cho nó tốt hơn:

    implicit class And[A](a: A) { 
        def and(f: A => Unit): A = { 
        f(a); a 
        } 
    } 
    

    Vì vậy mà bạn có thể làm

    val button = (new JButton("Press me!") 
        and (_ setForeground Color.red) 
        and (_ setFont new Font(null, Font.PLAIN, 12))) 
    
    val win = (new JFrame("Hello!") 
        and (_ add button) 
        and (_ pack()) 
        and (_ setDefaultCloseOperation JFrame.EXIT_ON_CLOSE) 
        and (_ setVisible(true))) 
    

    Bây giờ như đối với các sự kiện và nhà nước, đây vẫn là, theo ý kiến ​​của tôi, một lợi thế cạnh thô trong tất cả gui khuôn khổ - người nghe có vấn đề của họ, luồng sự kiện có vấn đề của họ.Tôi đã thành công chung trong việc tăng cường các sự kiện của Swing với reactive-coreredo-signals (của riêng tôi, không có giấy tờ) để giúp dễ dàng hơn trong việc tổ chức tiểu bang.

    Bạn có thể cải thiện tính cách rườm rà xác định người nghe với nhiều hơn một vài chức năng helper như

    def actionListener(f: => Unit) = new ActionListener { 
        def actionPerformed(e: ActionEvent) { f } 
        } 
    

    def later(thing: => Unit) { 
        SwingUtilities.invokeLater(new Runnable { 
         def run() { 
         thing 
         } 
        }) 
        } 
    

    Cá nhân, tôi muốn Scala Swing đã lấy tuyến đường này. Viết trình bao bọc cho các lớp Java hiện có là thời gian lập trình O (n), và không đưa bạn bất kỳ thứ gì cho các lớp mà các tác giả không chọn để viết trình bao bọc. Tạo đường cú pháp chung sẽ đưa bạn nhanh hơn nhiều.

  • Có trình tạo GUI WYSIWYG-ish nhưng linh hoạt: Tôi sử dụng biểu mẫu IntelliJ IDEA, để tạo lớp trừu tượng và sau đó phân lớp bằng lớp Scala. Chi phí tổ chức chỉ là 1 tệp phụ và tôi không viết mã Java.

  • Tài liệu API độc lập: Có.

20

ScalaFX là một wrapper trưởng thành xung quanh JavaFX 2. Đó là một cách hời hợt tương tự như Scala Swing trong một số liên quan, nhưng có một số tính năng mà làm cho nó nổi bật:

  • nối đến thư viện đồ họa tự nhiên - Điều này có nghĩa là truy cập vào tăng tốc phần cứng và các tính năng khác, nhưng yêu cầu thời gian chạy JavaFX phải được cài đặt trên hệ thống. Nó được bao gồm trong hầu hết các bản phân phối chính của Java 8. Điều này cũng có nghĩa là nó hiển thị rất tốt trên các hệ thống mà nó tương thích.

  • Thuộc tính ràng buộc - Đây là tính năng sát thủ dành cho tôi. Giả sử tôi có ba phần tử: A, BC. AB có thể thay đổi kích thước và C được cho là có chiều cao là tổng chiều cao của AB mọi lúc. Trong Swing, điều này sẽ liên quan đến việc viết một bộ trình nghe sự kiện tùy chỉnh để thực hiện công việc này. Các ràng buộc ScalaFX cho phép bạn thể hiện điều này đơn giản bằng cách sử dụng toán tử bind property: C.height <== A.height + B.height. Điều này, trong số các tính năng khác, làm cho một cảm giác rất Scala-idiomatic.

  • Trình tạo cảnh JavaFX (trong bản beta dưới dạng văn bản) là trình soạn thảo GUI WYSIWYG (tôi chưa thử nó).

  • Tài liệu là điểm yếu của nó. Là một trình bao bọc, nó thường đề cập đến tài liệu JavaFX.

5

Bây giờ đã trôi qua, đáng lưu ý rằng ScalaJS cũng là một tùy chọn để xem xét.

Against yêu cầu của bạn:

  • trưởng thành và sử dụng rộng rãi - HTML/CSS/JS là, ScalaJS không phải là (nhưng nó đáng ngạc nhiên tốt xem xét). Vì vậy, bạn có thể chạy vào các hang động cụ thể của ScalaJS, nhưng công nghệ cơ bản là rất mạnh mẽ.
  • bộ tiện ích phong phú hiển thị tốt - Có.
  • Scala thành ngữ - Không: bạn sẽ sử dụng rất nhiều jquery, chủ yếu sẽ được nhập động. ScalaTags thực hiện rất nhiều việc làm cho nó tốt hơn.
  • Có trình tạo GUI WYSIWYG-ish nhưng linh hoạt - Có, nhiều.
  • tài liệu API độc lập (nếu trình bao bọc, nó không nên khiến tôi tham khảo dự án gốc bằng ngôn ngữ khác) - Có.

Nhược điểm là phải mất GUI của bạn khỏi JVM và vào trình duyệt, do đó bạn không thể sử dụng tất cả các thư viện Java đó.

+2

Nếu bạn chọn để đi theo hướng này (bạn nên, scala.js là * awesome *!), Có một hướng dẫn thực sự tốt đẹp ở đây: http://lihaoyi.github.io/hands-on-scala-js/ . Các thư viện của lihaoyi cũng là đá rắn - scalatags, autowire, upickle, utest - bạn nên kiểm tra xem chúng ra. – kornfridge

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