2012-08-22 28 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);