2012-01-12 25 views
11

Tôi gặp sự cố khi chạy ứng dụng Java ở chế độ toàn màn hình trên "openSUSE 11.4 (x86_64)". Tôi đang sử dụng Java 1.6.0_26-b03.Java toàn màn hình trên Linux - cách che thanh tác vụ?

Tôi đã cố gắng chạy hai ví dụ về ứng dụng toàn màn hình:

  1. Ví dụ từ Oracle trang web: Display Mode Test.
  2. JDarkRoom.jar (trình soạn thảo văn bản đơn giản) được tải xuống từ Codealchemists.

Trong cả hai trường hợp, tôi có thanh tác vụ Linux hiển thị trên ứng dụng. Nó phải là một cái gì đó với thiết lập hệ thống/cấu hình?

Trả lời

16

Bạn nên có thể truy cập “màn hình thực sự đầy đủ” với GraphicsDevice.setFullScreenWindow (window). Tuy nhiên, do lỗi trong các thời gian chạy Java phổ biến nhất, điều này có thể không hoạt động trên các hệ thống đang chạy một số phiên bản “bị hỏng” nhất định trong chuỗi 1.6 = Java 6. Tôi đã không thử nghiệm kỹ lưỡng, vì vậy nó có thể là các bản vá đã không tuyên truyền cho dân chúng nói chung, được nêu ra.

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7057287

Background/Lý thuyết

OK, vì vậy ở đây đi cho quá nhiều thông tin, và không đủ giúp đỡ ... Dưới đây là một chút tại sao này đã không làm việc đúng ...

Không có máy tính để bàn Linux

Các hệ điều hành dựa trên Linux trên các máy kiểu PC, cũng như các Unices khác (ngoại trừ một phần cho MacOSX), thường sử dụng Hệ thống Cửa sổ X (còn gọi là X11). Trong X, bạn có một máy chủ X (thường là một thứ giống như “trình điều khiển video”) và các máy khách kết nối với nó, thường xuyên hơn không, từ cùng một máy (loopback).

Bố cục và vị trí cửa sổ được kiểm soát bởi một chương trình khách hàng đặc biệt đặc biệt, được gọi là Trình quản lý cửa sổ. Nó có trách nhiệm trang trí cửa sổ (ví dụ: vẽ thanh tiêu đề hoặc xử lý kích thước) và định vị chúng.

Chương trình của bạn sẽ là ứng dụng khách X. Nó có thể yêu cầu - nhưng không phải yêu cầu - vị trí trên màn hình ở một vị trí nhất định hoặc một kích thước nhất định. Quản lý cửa sổ khác nhau là nhiều hơn (hoặc ít hơn) dễ bị cho bạn những gì bạn muốn.

Trừ, hầu hết các máy tính để bàn chơi độc đáo(đôi khi)

Bây giờ, đến nay, hầu hết các máy tính để bàn Linux sử dụng Gnome Desktop, với một vị trí thứ hai mạnh mẽ cho K Desktop, và một vài người khác đang trong sử dụng khá rộng rãi. Điều thú vị là cả hai môi trường máy tính để bàn này (cũng như một số môi trường khác, như XFCE dành cho PC cấp thấp) đều tuân theo các tiêu chuẩn FreeDesktop.org Window Manager Gợi ý.

(Super-over-simplification :) Thông thường, sẽ có các Panels trên một hoặc nhiều cạnh của màn hình.Thông thường, chỉ có một, trên đầu, nhưng có nhiều biến thể khác nhau. Các vùng Bảng điều khiển này không được coi là “một phần của màn hình”, do đó Trình quản lý cửa sổ cho biết ứng dụng của bạn, “không, nằm ngoài khu vực mà bạn được phép phát; màn hình này không phải là 1920 × 1080, nó chỉ là 1890 × 1080. ”Tất nhiên, đó có thể là sự sắp xếp hoàn toàn khác với những gì bạn mong đợi khi viết ứng dụng của mình, và bạn có thể sử dụng netbook của mình với màn hình vật lý 800 × 480 giả vờ chỉ là 780 × 480.

Đối với 99% ứng dụng, điều đó thật tuyệt. Windows không nhận được trong cách của Panels, vì vậy bạn luôn có thể đạt được Panel cho các điều khiển quan trọng, như nhấn Mute hoặc chuyển sang một chương trình khác hoặc một cái gì đó.

Những "gợi ý" này cho phép bạn yêu cầu các cửa sổ cấp cao nhất của bạn được xử lý đặc biệt. Ví dụ, bạn có thể yêu cầu bạn không nhận được thanh tiêu đề - hoặc một thanh tiêu đề kiểu “palette” bị giảm; bạn có thể yêu cầu được bỏ qua trên danh sách cửa sổ hoặc thanh tác vụ hoặc tổng quan hoạt động hoặc bất kỳ giao diện nào khác có thể được sử dụng để hiển thị các cửa sổ đang hoạt động; hoặc, bạn có thể yêu cầu thực sự toàn màn hình và đẩy mọi thứ khác ra khỏi con đường, thậm chí cả bảng.

Các spec là ở đây: http://standards.freedesktop.org/wm-spec/wm-spec-latest.html

Và Fail:

Về cơ bản, đặc điểm kỹ thuật gợi ý quản lý cửa sổ đã không được tuân thủ một cách chính xác bởi Sun/Oracle (hoặc Red Hat, người sao chép tắt Sun/Oracle, hoặc có thể là IBM, bởi vì họ có thể làm như vậy, nhưng tôi không thấy ai phàn nàn về họ)…

Mặc dù, tôi thấy một số hiểu lầm về việc đó có phải là lỗi hay không (cụ thể) với Trình quản lý cửa sổ của K Desktop Environment (KWin), như dường như lỗi này chỉ hiển thị trong K và không phải là trong Gnome, XFCE và bạn bè.

Work-Khoảng

Ngoài vá runtimes Java của bạn (và/hoặc khách hàng của bạn), chỉ việc sửa chữa thực sẽ được sử dụng các thư viện Java nền tảng cụ thể (có lẽ lấy các đối tượng AWT cơ bản sử dụng phản ánh… eww…) và đặt gợi ý cửa sổ thích hợp, chính bạn.

Vâng, đó là tổng ...

1

Tôi đã sử dụng Oracle Java phiên bản 1.6.0_31 và 1.6.0_26 sử dụng toàn màn hình chế độ. Tôi đã gặp một số rắc rối với cửa sổ không hiển thị phía trên thanh tác vụ trên Ubuntu. Tuy nhiên tôi đã có thể làm cho nó hoạt động với mẫu mã nhỏ này.

// Create a window for full-screen mode; add a button to leave full-screen mode 
GraphicsDevice gs = GraphicsEnvironment.getLocalGraphicsEnvironment(). 
        getDefaultScreenDevice(); 
        //or initialize this for a specific display 
Frame frame = new Frame(gs.getDefaultConfiguration()); 
Window win = new Window(frame); 
Canvas c = new Canvas(); 
c.setBackground(Color.RED); 
win.add(c); 
win.show(); //or setVisible(true); 

// Enter full-screen mode 
gs.setFullScreenWindow(win); 
win.validate(); 

Bí quyết làm việc trước tiên là hiển thị cửa sổ, sau đó đặt cửa sổ ở chế độ toàn màn hình. Đặt chế độ toàn màn hình trước khi chế độ hiển thị dẫn đến thanh tác vụ phía trên cửa sổ.

+0

Sẽ hữu ích và đầy đủ hơn để xác định đối tượng 'gs' của bạn. –

1

Không có điều nào ở trên phù hợp với tôi, tôi đang sử dụng XUbuntu, nhưng tôi đã thử sử dụng JWindow thay vì JFrame và nó đã hoạt động! Đó là rất bực bội, hy vọng nó hoạt động cho bạn. Oh tôi nên đề cập đến tôi đã không nhìn vào API được nêu ra và tôi thực sự không quen thuộc với các lớp JWindow vì vậy tôi không chắc chắn chính xác những gì là sự khác biệt giữa một JWindow và một JFrame. Chúc may mắn.

+0

Bạn đã đọc kỹ câu hỏi chưa? Đây không phải là câu trả lời mà tôi đoán .. –

6

Tôi nhận ra câu hỏi này hơi cũ, nhưng tôi tình cờ tìm ra câu trả lời tương tự.

Sau rất nhiều thử nghiệm, tôi đã đưa ra một giải pháp tốt:

GraphicsDevice d = GraphicsEnvironment 
    .getLocalGraphicsEnvironment().getDefaultScreenDevice(); 
if (d.isFullScreenSupported()) { 
    frame.setUndecorated(true); 
    frame.setResizable(false); 
    frame.addFocusListener(new FocusListener() { 

     @Override 
     public void focusGained(FocusEvent arg0) { 
      frame.setAlwaysOnTop(true); 
     } 

     @Override 
     public void focusLost(FocusEvent arg0) { 
      frame.setAlwaysOnTop(false); 
     } 
    }); 
    d.setFullScreenWindow(frame); 
} else { 
    frame.setVisible(true); 
} 

Các người nghe tập trung được vì vậy người dùng có thể Alt-Tab hoặc META-D ra ngoài cửa sổ mà không có nó ngay lập tức buộc lại tiêu điểm.

Tính năng này hoạt động trên hệ thống Linux Mint 15 của tôi với KDE 4. Tôi cũng đang sử dụng NVIDIA X-Server.

Hy vọng điều này sẽ hữu ích! Hãy cho tôi biết nếu nó hoạt động cho các bạn quá!

5

Chỉ cần một độ chính xác về phương pháp bgroenks:
Đó là công việc tốt với java7 và java8 trên Ubuntu 14.10 (Unity).

NHƯNG: Bạn phải đặt frame.setResizable(true); nếu không, nó sẽ không hoạt động.

Hãy cẩn thận: chế độ toàn màn hình chỉ hoạt động với JFrame (không có JDialog hoặc JWindow).

Dưới đây là một số mẫu mã: Nó diễn ra của setVisible(true)

/** 
* @param frame 
* @param doPack 
* @return device.isFullScreenSupported 
*/ 
static public boolean fullScreen(final JFrame frame, boolean doPack) { 

    GraphicsDevice device = frame.getGraphicsConfiguration().getDevice(); 
    boolean result = device.isFullScreenSupported(); 

    if (result) { 
     frame.setUndecorated(true); 
     frame.setResizable(true); 

     frame.addFocusListener(new FocusListener() { 

      @Override 
      public void focusGained(FocusEvent arg0) { 
       frame.setAlwaysOnTop(true); 
      } 

      @Override 
      public void focusLost(FocusEvent arg0) { 
       frame.setAlwaysOnTop(false); 
      } 
     }); 

     if (doPack) 
      frame.pack(); 

     device.setFullScreenWindow(frame); 
    } 
    else { 
     frame.setPreferredSize(frame.getGraphicsConfiguration().getBounds().getSize()); 

     if (doPack) 
      frame.pack(); 

     frame.setResizable(true); 

     frame.setExtendedState(Frame.MAXIMIZED_BOTH); 
     boolean successful = frame.getExtendedState() == Frame.MAXIMIZED_BOTH; 

     frame.setVisible(true); 

     if (!successful) 
      frame.setExtendedState(Frame.MAXIMIZED_BOTH); 
    } 
    return result; 
} 

Kính trọng, Stéphane.

+0

Tôi đã có thể làm cho nó hoạt động mà không cần phải 'setResizable (true)' và không có người nghe tập trung. Vấn đề duy nhất tôi thực sự đã thay đổi chế độ hiển thị, mà tôi đã giải quyết bằng cách sử dụng 'DisplayMode.BIT_DEPTH_MULTI' và' DisplayMode.REFRESH_RATE_UNKNOWN'. Sử dụng Kubuntu 15.10 với Java 8. – ray

+0

Cảm ơn bạn rất nhiều, bạn là vua. –

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