2012-02-24 89 views
6

我試圖讓JInternalFrame在啓動時被最大化。我已經完成了對此的網絡搜索,並嘗試了各種代碼建議,但它們似乎無法在我的機器上正常運行,該機器在Windows 7上運行Java 6.在Java中最大化JInternalFrame

我簡化了下面的代碼,更容易隔離解決方案。

任何人都可以告訴我如何更改下面的代碼,使內部框架在創建時自動最大化?

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 

import javax.swing.JDesktopPane; 
import javax.swing.JFrame; 
import javax.swing.JInternalFrame; 
import javax.swing.JLayeredPane; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.KeyStroke; 

public class MaximizeInternalFrame extends JFrame implements ActionListener{ 
private static final long serialVersionUID = 1L; 
JLayeredPane desktop; 
JInternalFrame internalFrame; 

public MaximizeInternalFrame() { 
    super("Test To Maximize Internal Frame"); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

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

    this.setPreferredSize(screenMinus50); 
    desktop = new JDesktopPane(); 
    setJMenuBar(createMenuBar()); 
    this.add(desktop, BorderLayout.CENTER); 
    this.pack(); 
    this.setSize(screenMinus50); 
    this.setLocationRelativeTo(null); 
} 
protected JMenuBar createMenuBar() { 
    JMenuBar menuBar = new JMenuBar(); 
    //Set up the File menu. 
    JMenu FileMenu = new JMenu("File"); 
    FileMenu.setMnemonic(KeyEvent.VK_F); 
    menuBar.add(FileMenu); 
    //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(new OpenListener()); 
    FileMenu.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); 
    FileMenu.add(menuItem); 

    return menuBar; 
    } 
class OpenListener implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     // create internal frame 
     internalFrame = new JInternalFrame("this internal frame needs to be maximized", true, true, true, true); 
     desktop.add(internalFrame); 
     internalFrame.setSize(internalFrame.getMaximumSize()); 
     internalFrame.pack(); 
     internalFrame.setVisible(true); 
    } 
} 
public static void main(String args[]) { 
    MaximizeInternalFrame myParentFrame = new MaximizeInternalFrame(); 
    myParentFrame.setVisible(true); 
} 
public void actionPerformed(ActionEvent e) {if ("quit".equals(e.getActionCommand())){System.exit(0);}} 
} 
+0

['InternalFrameCount'(http://stackoverflow.com/a/9422246/230513)是例。 – trashgod 2012-02-24 21:34:35

+1

請了解java命名約定並堅持使用它們 – kleopatra 2012-02-25 10:17:58

回答

13

添加以下internalFrame.setVisible(true)後:

try { 
    internalFrame.setMaximum(true); 
} catch (PropertyVetoException e) { 
    // Vetoed by internalFrame 
    // ... possibly add some handling for this case 
} 

您還可以刪除internalFrame.setSize(internalFrame.getMaximumSize());

+6

僅供參考:在JInternalFrame已添加到父容器後,必須調用setMaximum()*。事先調用它會引發異常。常識(畢竟,如果尚未給予父母的話,你如何告訴窗口填充其父項),但容易被忽視。這不是我*做到的。 ;) – 2012-06-22 15:56:35