2012-10-17 43 views
3

在我的應用程序中,我們使用CrossPlatform L & F(金屬),我們希望啓動最大化的主JFrame。執行時,我發現隱藏的窗口工具欄。這不會發生,如果我使用系統L & F.Java Metal Look&Feel在最大化時隱藏Windows工具欄

這是爲什麼?有什麼辦法可以避免這種情況?

代碼摘錄迫使金屬大號& F是:

try { 
     UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); 
     MetalLookAndFeel.setCurrentTheme(new OceanTheme()); 
     UIManager.setLookAndFeel(new MetalLookAndFeel()); 
    } catch (ClassNotFoundException ex) { 
     code to catch this exception; 
    } catch (InstantiationException ex) { 
      code to catch this exception; 
    } catch (IllegalAccessException ex) { 
      code to catch this exception; 
    } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      code to catch this exception; 
    } 

    JFrame.setDefaultLookAndFeelDecorated(Boolean.TRUE); 

和方法,最大限度地提高窗口如下:

private void formWindowOpened(java.awt.event.WindowEvent evt) { 
    setExtendedState(JFrame.MAXIMIZED_BOTH); 
    return; 
}  

提前非常感謝

+0

對不起,它不是Windows工具欄;隱藏的東西是在屏幕底部運行的Windows任務列表 –

+0

也許添加一些屏幕截圖和[SSCCE](http://sscce.org)會讓你的結果快得多 –

回答

2

看來,這是您致電時的已知問題:

JFrame.setDefaultLookAndFeelDecorated(Boolean.TRUE); 

請參閱此鏈接:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4737788

這也顯示了一個解決辦法通過繼承JFrame的,並返回相應的最大邊界。下面是這個解決方法的演示代碼:

import java.awt.Frame; 
import java.awt.Insets; 
import java.awt.Rectangle; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.plaf.metal.MetalLookAndFeel; 
import javax.swing.plaf.metal.OceanTheme; 

public class TestJFrame { 

    private void initUI() { 
     final JFrame frame = new JFrame(TestJFrame.class.getSimpleName()) { 
      private Rectangle maxBounds; 

      @Override 
      public Rectangle getMaximizedBounds() { 
       return maxBounds; 
      } 

      @Override 
      public synchronized void setMaximizedBounds(Rectangle maxBounds) { 
       this.maxBounds = maxBounds; 
       super.setMaximizedBounds(maxBounds); 
      } 

      @Override 
      public synchronized void setExtendedState(int state) { 
       if (maxBounds == null && (state & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH) { 
        Insets screenInsets = getToolkit().getScreenInsets(getGraphicsConfiguration()); 
        Rectangle screenSize = getGraphicsConfiguration().getBounds(); 
        Rectangle maxBounds = new Rectangle(screenInsets.left + screenSize.x, screenInsets.top + screenSize.y, screenSize.x 
          + screenSize.width - screenInsets.right - screenInsets.left, screenSize.y + screenSize.height 
          - screenInsets.bottom - screenInsets.top); 
        super.setMaximizedBounds(maxBounds); 
       } 

       super.setExtendedState(state); 
      } 
     }; 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.addWindowListener(new WindowAdapter() { 
      @Override 
      public void windowOpened(WindowEvent e) { 
       frame.setExtendedState(frame.getExtendedState() | JFrame.MAXIMIZED_BOTH); 
      } 
     }); 
     JLabel label = new JLabel("some label in the middle"); 
     label.setHorizontalAlignment(JLabel.CENTER); 
     frame.add(label); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     try { 
      UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); 
      MetalLookAndFeel.setCurrentTheme(new OceanTheme()); 
      UIManager.setLookAndFeel(new MetalLookAndFeel()); 
     } catch (ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (InstantiationException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (UnsupportedLookAndFeelException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     JFrame.setDefaultLookAndFeelDecorated(Boolean.TRUE); 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new TestJFrame().initUI(); 
      } 
     }); 
    } 

} 

另外,不叫JFrame.setDefaultLookAndFeelDecorated(Boolean.TRUE);

+0

Guillaume,我已經實現了它並正常工作。非常感謝 –