2009-05-17 23 views
16

Trong ứng dụng Swing của tôi, tôi muốn có khả năng chuyển đổi giữa trang trí và undecorated mà không cần tái tạo toàn bộ khung. Tuy nhiên, API không cho phép tôi gọi setUndecorated() sau khi khung được hiển thị.Làm thế nào để gọi setUndecorated() sau khi khung được hiển thị?

Thậm chí nếu tôi gọi setVisible(false), isDisplayable() vẫn trả về giá trị đúng. API cho biết cách duy nhất để tạo khung không thể hiển thị là tạo lại khung. Tuy nhiên, tôi không muốn tạo lại khung hình chỉ để tắt một số thanh tiêu đề.

Tôi đang tạo một ứng dụng toàn màn hình có thể được chuyển giữa chế độ toàn màn hình và cửa sổ; Bạn có thể chuyển đổi trong khi duy trì trạng thái, v.v.

Làm cách nào để thực hiện việc này sau khi hiển thị khung ?.

Trả lời

16

Bạn không thể. Đó là trải nghiệm của tôi khi tôi cố gắng đạt được điều tương tự.

Tuy nhiên nếu bạn có toàn bộ giao diện người dùng trong một bảng nằm trong khung của mình, bạn có thể tạo khung mới và thêm bảng đó vào khung. Không quá nhiều việc.

Something như thế này:

// to start with 
JPanel myUI = createUIPanel(); 
JFrame frame = new JFrame(); 
frame.add(myUI); 

// .. and later ... 

JFrame newFrame = new JFrame(); 
newFrame.setUndecorated(); 
newFrame.add(myUI); 

Trong Swing một bảng điều khiển (và thực sự bất kỳ trường hợp của một thành phần) chỉ có thể ở một khung tại một thời điểm, vì vậy khi bạn thêm nó vào một khung mới, nó ngay lập tức không còn ở trong khung cũ nữa.

+2

gọi 'dispose()' giải phóng tài nguyên cửa sổ gốc. sau đó bạn có thể chỉnh sửa các thuộc tính như undecorated và như vậy. với 'pack()' bạn tạo lại tài nguyên cửa sổ. sau đó chỉ cần gọi 'setVisible (true)' và mọi thứ hoạt động tốt (vị trí và tất cả các compoenents sẽ không được thay đổi) – Thomas

+1

Như Thomas đã mô tả, điều này là có thể, xem thêm http://stackoverflow.com/questions/27715638/is- có-a-way-to-remove-frame-decoration-without-re-opening-it –

2

Vâng, bạn sẽ cần phiên bản khung hình khác nhau. Bạn có thể di chuyển nội dung của khung hình mà không cần phải tạo lại. Chìa khóa ở đây là làm cho mã của bạn không dựa vào một khung cụ thể. Đây là một thực hành tốt cơ bản trong mọi trường hợp.

+0

Đó là những gì tôi đã xem xét nhưng tôi đang tìm kiếm giải pháp thay thế. – Lucky

20

Bạn đã thử gọi Frame.dispose() và sau đó thay đổi? Đã không thử nó bản thân mình, nhưng nó có thể làm việc.

Nếu không, thì những gì bạn có thể làm là đặt một phần không quan trọng của lớp, chỉ với móc tối thiểu nhất đến bảng hoặc bảng cao nhất, và chỉ di chuyển khung đến khung mới. Tất cả trẻ em sẽ theo.

+0

Nó hoạt động cho tôi. – dimo414

+0

Cái nào, vứt bỏ() hoặc tạo khung mới? – Yishai

+2

Gọi vứt bỏ() hoạt động cho tôi – Annan

12

Có một cái nhìn tại https://tvbrowser.svn.sourceforge.net/svnroot/tvbrowser/trunk/tvbrowser/src/tvbrowser/ui/mainframe/MainFrame.java

Trong Phương pháp switchFullscreenMode():

dispose(); 
... 
setFullScreenWindow(...); 
setUndecorated(true/false); 
setBounds(mXPos, mYPos, mWidth, mHeight); 
... 
setVisible(true); 

Trên thực tế có một thứ nhiều hơn nữa xảy ra để che giấu sidepanels khác nhau mà xuất hiện trở lại nếu chuột chạm bên hông.

Cũng lưu ý rằng bạn phải đặt rõ ràng giới hạn. Window.setExtendedState(MAXIMIZED_BOTH) can thiệp vào vùng lân cận gần đúng của việc vứt bỏ(), vì cả hai đều dựa vào nhiều sự kiện gốc của hệ điều hành, bị mất, nên cửa sổ không thể hiển thị ở phân chia thứ hai đó.

Tôi không khuyên bạn nên dùng màn hình mặc định trực tiếp:

GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); 

và thay vào đó sử dụng màn hình, JFrame của bạn là hiện nay trên:

setBounds(getGraphicsConfiguration().getBounds()); 
getGraphicsConfiguration().getDevice().setFullScreenWindow(this); 

Mặc dù nó hiện như nhau, nó có thể thay đổi trong tương lai.

+0

Điều này làm việc hoàn hảo cho tôi, và là một thay đổi mã đơn giản hơn so với việc tạo khung hình mới reguarly. Nhận xét của bạn về giới hạn và sử dụng màn hình hiện tại của khung hình đặc biệt hữu ích. Tôi cũng nhận được các giới hạn của cửa sổ trước khi chuyển sang chế độ toàn màn hình, cho phép tôi khôi phục lại nó về cùng một vị trí và kích thước khi tôi thoát khỏi chế độ toàn màn hình. – dimo414

8

gọi dispose() phát hành tài nguyên cửa sổ gốc. sau đó bạn có thể chỉnh sửa các thuộc tính như undecorated và như vậy. sau đó chỉ cần gọi setVisible(true) để tái tạo nguồn tài nguyên cửa sổ và mọi thứ hoạt động tốt (vị trí và tất cả compoenents won `t được thay đổi)

dispose(); 
setUndecorated(true/false); 
setVisible(true); 
0

Đây là một mã trong làm thế nào để làm cho ALT +Nhập vào toàn màn hình mà không có chế độ thanh và Giảm thiểu với hiển thị thanh tiêu đề và thanh bắt đầu:

public class myTest extends JFrame{ 
//Your codes... 
    //if "ALT" key on hold and "Enter" key pressed with it 
    if (evt.isAltDown() && evt.getKeyCode() == evt.VK_ENTER) {  
     //if the JFrame has Title bar 
     if (isUndecorated()) { 
      //this will dispose your JFrame 
      dispose(); 
      //here to set it with no Title bar 
      setUndecorated(false); 
      pack(); 
      setLocationRelativeTo(null); 
      //as you dispose your JFrame, you have to remake it Visible.. 
      setVisible(true); 
      } else { 
      dispose(); 
      setUndecorated(true); 
      setExtendedState(MAXIMIZED_BOTH); 
      setVisible(true); 
     } 
    } 
//your codes 
} 
-1

Hãy thử:

dispose(); 
setUndecorated(true); 
setVisible(true); 

Kiểm tra. Hy vọng nó sẽ giúp !!

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