2012-05-16 53 views
2

我不知道是否有可能:java的模態框架

  1. 做一個JDialog(可模態)與最大化按鈕(就是可以進行自定義,但是這將最大限度地提高幀?)
  2. 或使jframe(其中有默認最大化按鈕)模式?

有很多關於此的話題,但我沒有找到乾淨的解決方案。只有技巧與setEnabled()等。

謝謝大家提前!

+0

總是存在的JInternalFrame,但我不認爲你可以使它成爲模態,它不完全像一個JFrame –

回答

4
  • AFAIK不可能的,因爲頂層容器從本地OS來了,

  • 再用鼠標雙擊JFrame中的工具欄調整容器填滿整個屏幕尺寸,第二雙擊還原lastz已知尺寸

  • 這不可能與JDialog

  • 任何鼠標(XXX)監聽器確實從工具欄不響應mouse_events從本地OS來,僅從是填充的rootPane

代碼示例

import java.awt.event.MouseEvent; 
import javax.swing.JFrame; 
import javax.swing.JButton; 
import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Toolkit; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import java.awt.event.MouseAdapter; 
import javax.swing.JDialog; 
import javax.swing.Timer; 
//http://stackoverflow.com/questions/8670297/make-java-swing-modal-dialog-behave-like-mac-osx-dialogs 
public class ModalDialogDemoFrame extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private ModalDialogDemoFrame modalDialogDemo; 

    public ModalDialogDemoFrame() { 
     modalDialogDemo = this; 
     setBounds(100, 100, 400, 400); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JButton buttonDialog = new JButton("Open Dialog"); 
     buttonDialog.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent arg0) { 
       // Create a Modal Dialog with this Frame as Parent. 
       ModalDialog modalDialog = new ModalDialog(modalDialogDemo, true); 
       modalDialog.setVisible(true); 
      } 
     }); 
     getContentPane().add(buttonDialog, BorderLayout.CENTER); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      public void run() { 
       try { 
        ModalDialogDemoFrame window = new ModalDialogDemoFrame(); 
        window.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 
} 
//http://stackoverflow.com/questions/4577424/distinguish-between-a-single-click-and-a-double-click-in-java/4577475#4577475 
class ClickListener extends MouseAdapter implements ActionListener { 

    private final static int clickInterval = (Integer) Toolkit.getDefaultToolkit().getDesktopProperty("awt.multiClickInterval"); 
    private MouseEvent lastEvent; 
    private Timer timer; 

    public ClickListener() { 
     this(clickInterval); 
    } 

    public ClickListener(int delay) { 
     timer = new Timer(delay, this); 
    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     if (e.getClickCount() > 2) { 
      return; 
     } 
     lastEvent = e; 
     if (timer.isRunning()) { 
      timer.stop(); 
      doubleClick(lastEvent); 
     } else { 
      timer.restart(); 
     } 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     timer.stop(); 
     singleClick(lastEvent); 
    } 

    public void singleClick(MouseEvent e) { 
    } 

    public void doubleClick(MouseEvent e) { 
    } 
} 

class ModalDialog extends JDialog { 

    private static final long serialVersionUID = 1L; 

    public ModalDialog(JFrame parent, boolean modal) { 
     Dimension dimensionParentFrame = parent.getSize(); 
     setSize(new Dimension((parent == null) ? 300 : dimensionParentFrame.width/2, 75)); 
     Dimension dimensionDialog = getSize(); 
     int x = parent.getX() + ((dimensionParentFrame.width - dimensionDialog.width)/2); 
     setLocation(x, parent.getY() + parent.getInsets().top); 
     //setUndecorated(true); 
     setModal(modal); 
     setModalityType(ModalityType.APPLICATION_MODAL); 
     setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
     JButton buttonClose = new JButton("Close"); 
     buttonClose.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       dispose(); 
      } 
     }); 
     add(buttonClose, BorderLayout.CENTER); // comment for listening 
     addMouseListener(new ClickListener() { 

      @Override 
      public void singleClick(MouseEvent e) { 
       System.out.println("single"); 
      } 

      @Override 
      public void doubleClick(MouseEvent e) { 
       System.out.println("double"); 
      } 
     }); 
    } 
}