2011-08-22 31 views
114

Trong another thread tôi nói rằng tôi thích để tập trung GUIs của tôi bằng cách làm một cái gì đó như thế này:Làm thế nào để vị trí tốt nhất Swing GUI?

JFrame frame = new JFrame("Foo"); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.getContentPane().add(new HexagonGrid()); 
frame.pack(); 
frame.setLocationRelativeTo(null); 
frame.setVisible(true); 

Nhưng Andrew Thompson đã có một ý kiến ​​khác nhau, để thay vào đó gọi

frame.pack(); 
frame.setLocationByPlatform(true); 

và an tâm về dữ muốn biết tại sao?

+1

Không liên quan: bạn có thể làm cho tôi một đặc ân bằng cách xem [câu hỏi này] (https://stackoverflow.com/questions/46033958/java-switch-camera-front-back). Một trong số ít trường hợp tôi nghĩ rằng nội dung sẽ xứng đáng được giảm xuống/đóng phiếu nhiều hơn .... – GhostCat

Trả lời

152

Để mắt của tôi, một GUI ở giữa màn hình trông như vậy .. "splash-screen'ish". Tôi tiếp tục chờ chúng biến mất và giao diện thực xuất hiện!

Vì Java 1.5, chúng tôi đã có quyền truy cập vào Window.setLocationByPlatform(boolean). mà ..

Đặt xem Cửa sổ này sẽ xuất hiện ở vị trí mặc định cho hệ thống cửa sổ gốc hoặc tại vị trí hiện tại (được trả về bởi getLocation) vào lần hiển thị cửa sổ tiếp theo. Hành vi này giống như cửa sổ gốc được hiển thị mà không cần thiết lập vị trí của nó theo chương trình. Hầu hết các cửa sổ hệ thống cửa sổ xếp tầng nếu vị trí của chúng không được đặt rõ ràng. Vị trí thực tế được xác định khi cửa sổ được hiển thị trên màn hình.

Có xem xét ảnh hưởng của ví dụ này mà đặt 3 GUIs vào vị trí mặc định là lựa chọn bởi các hệ điều hành - trên Windows 7, Linux với Gnome & Mac OS X.

Stacked windows on Windows 7enter image description here Stacked windows on Mac OS X

(3 lô) 3 GUI được sắp xếp gọn gàng. Điều này đại diện cho "con đường ít ngạc nhiên nhất" cho người dùng cuối, vì đó là cách hệ điều hành có thể định vị 3 trường hợp của trình soạn thảo văn bản thuần túy mặc định (hoặc bất kỳ thứ gì khác, cho vấn đề đó). Cảm ơn tôi về thùng rác cho máy tính Linux & Mac. hình ảnh.

Đây là mã đơn giản sử dụng:

import javax.swing.*; 

class WhereToPutTheGui { 

    public static void initGui() { 
     for (int ii=1; ii<4; ii++) { 
      JFrame f = new JFrame("Frame " + ii); 
      f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
      String s = 
       "os.name: " + System.getProperty("os.name") + 
       "\nos.version: " + System.getProperty("os.version"); 
      f.add(new JTextArea(s,3,28)); // suggest a size 
      f.pack(); 
      // Let the OS handle the positioning! 
      f.setLocationByPlatform(true); 
      f.setVisible(true); 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(
         UIManager.getSystemLookAndFeelClassName()); 
       } catch (Exception useDefault) {} 
       initGui(); 
      } 
     }); 
    } 
} 
+1

@AndrewThompson Tại sao biến số lượt truy cập của bạn 'ii' thay vì chỉ' i'? Điều đó có tuân thủ một số quy ước hay nó là một sở thích cá nhân (hoặc có thể là một cái gì đó hoàn toàn khác)? – MirroredFate

+1

@MirroredFate Umm .. Tôi nghĩ rằng tôi sẽ khóa trong tùy chọn 3 ở đó, "một cái gì đó hoàn toàn khác". Đó là những gì tôi đã quen với khi tôi lần đầu tiên được lập trình trong Basic (vâng, một thời gian dài trước đây). Đó là lý do để tiếp tục sử dụng, 'nếu nó không bị phá vỡ, đừng sửa nó'. –

+1

@MirroredFate Bạn có bằng bất kỳ cơ hội nào của hoàng tử persia Fan không? Tôi rất tiếc khi đặt nó ở đây. Tôi chỉ không thể chống lại – Anarach

1

Tôi hoàn toàn đồng ý rằng setLocationByPlatform(true) là cách đẹp nhất để xác định vị trí của một JFrame mới nhưng trên một thiết lập màn hình kép bạn có thể nhận được vào vấn đề này. Trong trường hợp của tôi, JFrame con được sinh ra trên màn hình 'khác'. Ví dụ: Tôi có GUI chính của tôi trên màn hình 2, tôi bắt đầu một JFrame mới với setLocationByPlatform(true) và nó sẽ mở ra trên màn hình 1. Vì vậy, đây là một giải pháp hoàn chỉnh hơn, tôi nghĩ:

 ... 
     // Let the OS try to handle the positioning! 
     f.setLocationByPlatform(true); 
     if(!f.getBounds().intersects(MyApp.getMainFrame().getBounds())) { 

      // non-cascading, but centered on the Main GUI 
      f.setLocationRelativeTo(MyApp.getMainFrame()); 
     } 
     f.setVisible(true); 
Các vấn đề liên quan