2012-08-22 61 views
6

我正面臨着JInternalFrame實現的問題。我製作了JInternalFrame未修飾,因此JInternalFrame的標題欄和邊框被刪除。在以下情況下會發生此問題。當通過遠程桌面共享查看時,未修飾的JInternalFrame變爲裝飾

  1. 在Windows 7機器上執行該程序。

    • 此時JInternalFrame仍未修飾。
  2. 訪問Windows 7機器使用遠程桌面共享從 另一臺機器。

    • 現在標題欄和內部框架的邊框變得可見。

出現此問題,僅在Windows 7的機器,而不是在Windows XP中。您可以使用來自其他Windows 7計算機或Windows XP計算機的遠程桌面共享來訪問Windows 7計算機。

另外,如果您先使用遠程桌面共享訪問本機,然後執行該程序,則JInternalFrame仍未裝飾。

重現步驟

步驟1:在Windows 7計算機上執行應用程序。

步驟2:使用另一臺Windows 7或Windows XP計算機上的遠程桌面共享來訪問Windows 7計算機。

第3步:檢查應用

結果的GUI: - 標題欄和邊框未修飾JInternalFrame變得可見。

如果有人遇到過這個問題,或者有人有解決方案,請分享您的想法。

下面給出使用它可以重現此問題的示例代碼。

/* 
* Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved. 
* 
* Redistribution and use in source and binary forms, with or without 
* modification, are permitted provided that the following conditions 
* are met: 
* 
* - Redistributions of source code must retain the above copyright 
*  notice, this list of conditions and the following disclaimer. 
* 
* - Redistributions in binary form must reproduce the above copyright 
*  notice, this list of conditions and the following disclaimer in the 
*  documentation and/or other materials provided with the distribution. 
* 
* - Neither the name of Oracle or the names of its 
*  contributors may be used to endorse or promote products derived 
*  from this software without specific prior written permission. 
* 
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
*/ 

import javax.swing.JInternalFrame; 
import javax.swing.JDesktopPane; 
import javax.swing.JMenu; 
import javax.swing.JMenuItem; 
import javax.swing.JMenuBar; 
import javax.swing.JFrame; 
import javax.swing.KeyStroke; 
import javax.swing.plaf.basic.BasicInternalFrameTitlePane; 
import javax.swing.plaf.basic.BasicInternalFrameUI; 

import java.awt.event.*; 
import java.awt.*; 

/* 
* InternalFrameDemo.java requires: 
* MyInternalFrame.java 
*/ 
public class InternalFrameDemo extends JFrame 
           implements ActionListener { 
    JDesktopPane desktop; 

    public InternalFrameDemo() { 
     super("InternalFrameDemo"); 

     //Make the big window be indented 50 pixels from each edge 
     //of the screen. 
     int inset = 50; 
     Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
     setBounds(inset, inset, 
        screenSize.width - inset*2, 
        screenSize.height - inset*2); 

     //Set up the GUI. 
     desktop = new JDesktopPane(); //a specialized layered pane 
     createFrame(); //create first "window" 
     setContentPane(desktop); 
     setJMenuBar(createMenuBar()); 

     //Make dragging a little faster but perhaps uglier. 
     desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE); 
    } 

    protected JMenuBar createMenuBar() { 
     JMenuBar menuBar = new JMenuBar(); 

     //Set up the lone menu. 
     JMenu menu = new JMenu("Document"); 
     menu.setMnemonic(KeyEvent.VK_D); 
     menuBar.add(menu); 

     //Set up the first menu item. 
     JMenuItem menuItem = new JMenuItem("New"); 
     menuItem.setMnemonic(KeyEvent.VK_N); 
     menuItem.setAccelerator(KeyStroke.getKeyStroke(
       KeyEvent.VK_N, ActionEvent.ALT_MASK)); 
     menuItem.setActionCommand("new"); 
     menuItem.addActionListener(this); 
     menu.add(menuItem); 

     //Set up the second menu item. 
     menuItem = new JMenuItem("Quit"); 
     menuItem.setMnemonic(KeyEvent.VK_Q); 
     menuItem.setAccelerator(KeyStroke.getKeyStroke(
       KeyEvent.VK_Q, ActionEvent.ALT_MASK)); 
     menuItem.setActionCommand("quit"); 
     menuItem.addActionListener(this); 
     menu.add(menuItem); 

     return menuBar; 
    } 

    //React to menu selections. 
    public void actionPerformed(ActionEvent e) { 
     if ("new".equals(e.getActionCommand())) { //new 
      createFrame(); 
     } else { //quit 
      quit(); 
     } 
    } 

    //Create a new internal frame. 
    protected void createFrame() { 
     MyInternalFrame frame = new MyInternalFrame(); 
     frame.setVisible(true); //necessary as of 1.3 
     desktop.add(frame); 
     try { 
      frame.setSelected(true); 
     } catch (java.beans.PropertyVetoException e) {} 
    } 

    //Quit the application. 
    protected void quit() { 
     System.exit(0); 
    } 

    /** 
    * Create the GUI and show it. For thread safety, 
    * this method should be invoked from the 
    * event-dispatching thread. 
    */ 
    private static void createAndShowGUI() { 
     //Make sure we have nice window decorations. 
     JFrame.setDefaultLookAndFeelDecorated(true); 

     //Create and set up the window. 
     InternalFrameDemo frame = new InternalFrameDemo(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     //Display the window. 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     //Schedule a job for the event-dispatching thread: 
     //creating and showing this application's GUI. 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 

/* Used by InternalFrameDemo.java. */ 
@SuppressWarnings("serial") 
class MyInternalFrame extends JInternalFrame { 
    static int openFrameCount = 0; 
    static final int xOffset = 30, yOffset = 30; 

    public MyInternalFrame() { 
     super("Document #" + (++openFrameCount), 
       true, //resizable 
       true, //closable 
       true, //maximizable 
       true);//iconifiable 

     //...Create the GUI and put it in the window... 

     //...Then set the window size or call pack... 
     setSize(300,300); 
     // Undecorating the internal frame 
     BasicInternalFrameTitlePane titlePane = 
      (BasicInternalFrameTitlePane) ((BasicInternalFrameUI) this.getUI()). 
      getNorthPane(); 
     this.remove(titlePane); 
     this.setBorder(null); 
     //Set the window's location. 
     setLocation(xOffset*openFrameCount, yOffset*openFrameCount); 
    } 
} 
+0

的問題是,你必須使用一個內部框架?如果沒有裝飾,你可以簡單地使用'JPanel'嗎? – MadProgrammer

+0

我必須使用JInternalFrame本身。該應用程序支持兩種模式。在一種模式下,將只有一個未修飾的內部框架。在另一種模式中,可以有多個內部框架,這些內部框架被裝飾。 –

+3

https://forums.oracle.com/forums/thread.jspa?threadID=2430018&tstart=0 –

回答

3

對於InternalFrame實例,您需要將未裝飾的屬性設置爲共享而不是.setUndecorated(true)。

,或者嘗試

JInternalFrame frame = new JInternalFrame("frame", false, false, false, false); 
frame.putClientProperty("JInternalFrame.isPalette", Boolean.TRUE); 
frame.getRootPane().setWindowDecorationStyle(JRootPane.NONE);