2011-01-11 37 views
6

Làm cách nào để tạo cửa sổ (chẳng hạn như java.awt.Frame, javax.swing.JFrame, java.awt.Dialog, javax.swing.JDialog, v.v.) đặt cạnh của màn hình, như thanh công cụ, thanh tác vụ, Trillian hoặc Microsoft OneNote có thể? Tôi chỉ muốn sử dụng các thư viện JDK chuẩn nếu có thể.Đặt cạnh của màn hình bằng Java

+0

'JSplitPane' có hoạt động không? http://download.oracle.com/javase/tutorial/uiswing/components/splitpane.html – trashgod

+0

Bạn có muốn tạo cửa sổ hoạt động như thanh công cụ trên màn hình nền không? – AlexR

+0

@trashgod: 'javax.swing.JSplitPane' sẽ không thực hiện; nó là một thành phần chỉ hoạt động trong một cửa sổ – Supuhstar

Trả lời

2

Hành vi này là rất cụ thể cho các hệ điều hành Windows, và như vậy không có cách nào để làm điều này trong tiêu chuẩn JDK hoặc với AWT/Swing, vì chúng cần phải làm việc nhất quán trên một số hệ điều hành khác nhau.

Tương đương gần nhất với những gì bạn muốn là có ranh giới của màn hình hiện tại và di chuyển/thay đổi kích thước cửa sổ của bạn để vừa với một bên, mặc dù điều này sẽ có tác dụng trên màn hình hoặc các cửa sổ khác.

Điều gần nhất bạn có thể sẽ nhận được những gì bạn muốn là sử dụng JNIWrapper and WinPack để thay đổi hành vi cửa sổ gốc. Tài liệu của họ không hiển thị bất cứ điều gì về thanh công cụ máy tính để bàn, mặc dù. Bạn có lẽ sẽ phải sử dụng JNI của họ để truy cập trực tiếp vào các hàm COM cụ thể và sau đó tìm hiểu cách thực hiện nó trong C++, nhưng nếu bạn không biết C++, điều đó có lẽ nằm ngoài phạm vi dự án của bạn.

Phụ Lục:

Nếu bạn muốn tận dụng các tính năng bản địa cho hệ điều hành và quản lý máy tính để bàn cụ thể, bạn sẽ cần phải kết nối với một thư viện mẹ đẻ C++ để móc vào Gnome, KDE, Mac OS vv Tìm kiếm 'Java JNI' và hệ thống cửa sổ bạn muốn tích hợp với để tìm các gói bạn có thể sử dụng. Ví dụ, đối với Gnome, xem here.

Nếu bạn muốn hỗ trợ nhiều hệ điều hành, hãy đảm bảo bạn tạo một giao diện chung để bạn có thể thực hiện các kết nối với JNIs tương ứng tùy thuộc vào mạng nào đang hoạt động và cho phép dự phòng nếu không có sẵn.

PS. Nếu bạn muốn thông báo bật lên trong ứng dụng của mình, Mac OS và các phiên bản Linux khác nhau hỗ trợ Growl để có thể giúp bạn tiết kiệm thời gian.

+0

Tôi sợ rằng u.u Tại sao các HĐH khác không có khả năng của Windows? : c – Supuhstar

+0

Vâng, để bắt đầu, nếu tất cả các hệ điều hành có tất cả các tính năng tương tự, sẽ không có sự lựa chọn nào cho người tiêu dùng.Ngoài ra, chúng ta cần nhớ rằng Java không chỉ được thiết kế cho PC, mà còn chạy trên điện thoại di động, hệ thống bảo mật và các thiết bị nhúng khác có thể có khả năng hiển thị rất hạn chế hoặc không có gì cả. Sun/Oracle không thể viết mã gốc để hỗ trợ tất cả các cấu hình phần cứng và phần mềm có thể. Đó là nơi bạn phải tìm một JNI làm những gì bạn muốn, hoặc viết một bản thân. Tôi đoán bạn sẽ phải đi cho các giải pháp đơn giản - di chuyển và thay đổi kích thước cửa sổ ứng dụng của bạn. – BoffinbraiN

+0

Chờ ... Nhưng OS X có thể dự trữ đầu cho thanh menu và các mặt khác cho dock, Gnome và Unity có thể làm tương tự ... tại sao hệ điều hành này cụ thể? – Supuhstar

2

Bạn có thể sử dụng Toolkit.getDefaultToolkit(). GetScreenInsets() Từ nguồn JMenu

Toolkit toolkit = Toolkit.getDefaultToolkit(); 
    GraphicsConfiguration gc = getGraphicsConfiguration(); 
    Rectangle screenBounds = new Rectangle(toolkit.getScreenSize()); 
    GraphicsEnvironment ge = 
     GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    GraphicsDevice[] gd = ge.getScreenDevices(); 
    for(int i = 0; i < gd.length; i++) { 
     if(gd[i].getType() == GraphicsDevice.TYPE_RASTER_SCREEN) { 
      GraphicsConfiguration dgc = 
       gd[i].getDefaultConfiguration(); 
      if(dgc.getBounds().contains(position)) { 
       gc = dgc; 
       break; 
      } 
     } 
    } 


    if (gc != null) { 
     screenBounds = gc.getBounds(); 
     // take screen insets (e.g. taskbar) into account 
     Insets screenInsets = toolkit.getScreenInsets(gc); 

     screenBounds.width -= 
        Math.abs(screenInsets.left + screenInsets.right); 
     screenBounds.height -= 
        Math.abs(screenInsets.top + screenInsets.bottom); 
     position.x -= Math.abs(screenInsets.left); 
     position.y -= Math.abs(screenInsets.top); 
    } 
+0

vị trí là gì? – Supuhstar

+0

cũng, chạy phương pháp này dường như không làm bất cứ điều gì – Supuhstar

+0

Vui lòng trả lời. – Supuhstar

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