2014-12-02 52 views
-1
public ButtonGrid(int width, int length){ //constructor 
      frame.setTitle("MPC"); 
      frame.setLayout(new GridLayout(width,length)); //set layout 
      grid=new JButton[width-1][length]; //allocate the size of grid 
      for(int y=0; y<length; y++){ 
        for(int x=0; x<width-1; x++){ 
          grid[x][y]=new JButton("("+x+","+y+")"); //creates new button  
          frame.add(grid[x][y]); //adds button to grid 
          grid[x][y].addActionListener(this); 
          grid[x][y].addKeyListener(this); 
          //grid[x][y].setMnemonic(KeyEvent.VK_0); 
          grid[x][y].setPreferredSize(new Dimension(75,75)); 
        } 
      } 

      for(int i =0; i<boxList.length; i++) 
       box.addItem(boxList[i]); 
      box.addActionListener(this); 
      frame.add(box); 
      frame.add(met_speed); 
      frame.add(Play); 
      Play.addActionListener(this); 


      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.pack(); //sets appropriate size for frame 
      frame.setVisible(true); //makes frame visible 



    } 
    public void newWindow(){ 
     JFrame frame1 = new JFrame(); 

     frame1.setLayout(new GridBagLayout()); 
     GridBagConstraints gbc = new GridBagConstraints(); 
     JTextField[] btn = new JTextField[12]; 
     JLabel[] lbl = new JLabel[12]; 
     JLabel name = new JLabel("Preset Name"); 
     JTextField name1 = new JTextField(); 
     name1.setPreferredSize(new Dimension(100,25)); 


     gbc.gridx = 0; 
     gbc.gridy = 0; 
     frame1.add(name, gbc); 
     gbc.gridx++; 
     frame1.add(name1, gbc); 

     gbc.gridx = 0; 
     gbc.gridy = 1; 
     for(int i = 0; i<12; i++){ 
      lbl[i] = new JLabel("Button" + (i+1)); 
      frame1.add(lbl[i], gbc); 
      gbc.gridy++; 
     } 

     gbc.gridx = 1; 
     gbc.gridy = 1; 
     for(int i = 0; i<12; i++){ 
      btn[i] = new JTextField(); 
      btn[i].setPreferredSize(new Dimension(75,25)); 
      frame1.add(btn[i], gbc); 
      gbc.gridy++; 
     } 


     gbc.gridx = 0; 
     gbc.gridy = 14; 
     JButton save = new JButton("Save"); 
     frame1.add(save, gbc); 

     frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame1.pack(); //sets appropriate size for frame 
     frame1.setVisible(true); //makes frame visible 

    } 

第一個功能ButtonGrid在main中被調用並且包含真正的程序。按下按鈕之後,newWindow()被稱爲彈出窗口。到目前爲止,它工作正常,但是當我關閉frame1時,它會關閉frame並結束程序。不用退出程序關閉java彈出框架

我這樣做是否正確,或者是否有我需要添加的東西?

+1

你'frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)'這意味着完全相同 – khelwood 2014-12-02 00:57:34

+2

看看[使用多個JFrames,好/壞實踐?](http://stackoverflow.com/q/9554636/418556),爲什麼你應該避免顯示多個幀... – MadProgrammer 2014-12-02 00:58:49

+0

'grid [x ] [y] .setPreferredSize(new Dimension(75,75));'請參閱[我應該避免使用Java Swing中的set(Preferred | Maximum | Minimum)Size方法嗎?](http://stackoverflow.com/q/7229226/418556)(是) – 2014-12-02 01:11:27

回答

2

你可以試試這個:; 「當我關閉`frame1`退出程序」

frame1.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//<-- destroy only this frame 
+0

加1,另請參閱[本答案](http://stackoverflow.com/a/7143398/418556)演示。但最終,請參閱已經提到的.. [使用多個JFrames,好/壞實踐?](http://stackoverflow.com/q/9554636/418556) – 2014-12-02 01:10:28

+0

現在我要使用這個,但將考慮@MadProgrammer的帖子。謝謝 – user3562657 2014-12-02 01:24:08

+0

@ user3562657:你爲什麼用這個而不是JDialog?你真的想在用戶的工具欄上創建新的不必要的圖標嗎?你真的想要確定哪個窗口保持在另一個窗口上嗎?再次,這不是最好的解決方案,也不應該被接受。 – 2014-12-02 01:47:06

5

最佳解決方案:不要「彈出」JFrame。因爲關閉它不會關閉您的程序,所以請使用JDialog,而這正是它們的作用。是的,您可以將JFrame的defaultCloseOperation更改爲DO_NOTHING_ON_CLOSE,但您仍然可以使用主程序窗口進行無意的操作。最好使用正確的工具JDialog。還需要注意的是,一個JDialog可以接受當前放置在「彈出式」JFrame中的任何複雜的GUI。

例如:

import java.awt.Dialog.ModalityType; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class TwoWindows { 
    public static final int PREF_W = 600; 
    public static final int PREF_H = 400; 

    private static void createAndShowGui() { 
     final JFrame frame = new JFrame("Main Application"); 
     JPanel buttonPanel = new JPanel(new GridLayout(1, 0, 5, 0)); 

     buttonPanel.add(new JButton(new AbstractAction("New JFrame") { 
     { 
      putValue(MNEMONIC_KEY, KeyEvent.VK_F); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      JFrame frame2 = new JFrame("Frame 2"); 
      frame2.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
      setupAndDisplay(frame2); 
     } 
     })); 
     buttonPanel.add(new JButton(new AbstractAction("New Modeless JDialog") { 
     { 
      putValue(MNEMONIC_KEY, KeyEvent.VK_D); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      JDialog dialog = new JDialog(frame, "Modeless Dialog", ModalityType.MODELESS); 
      setupAndDisplay(dialog); 
     } 
    })); 

     buttonPanel.add(new JButton(new AbstractAction("New Modal JDialog") { 
     { 
      putValue(MNEMONIC_KEY, KeyEvent.VK_M); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      JDialog dialog = new JDialog(frame, "Modal Dialog", ModalityType.APPLICATION_MODAL); 
      setupAndDisplay(dialog); 
     } 
    })); 

     JPanel mainPanel = new JPanel() { 
     @Override 
     public Dimension getPreferredSize() { 
      if (isPreferredSizeSet()) { 
       return super.getPreferredSize(); 
      } 
      return new Dimension(PREF_W, PREF_H); 
     } 
     }; 

     mainPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
     mainPanel.add(buttonPanel); 

     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    private static void setupAndDisplay(Window window) { 
     window.add(Box.createRigidArea(new Dimension(200, 100))); 
     window.pack(); 
     window.setLocationByPlatform(true); 
     window.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

請運行此要注意兩種類型的頂級窗口:之間的行爲差​​別

  • 當創建一個第二的JFrame,第二和unncessary圖標是在工具欄上創建的,因爲操作系統認爲你正在創建一個全新的應用程序,而不是單個應用程序中的第二個窗口。 JDialog不這樣做。
  • 第二個JFrame可以在JDialog的主JFrame窗口後面,因爲它是主應用程序的子窗口始終爲仍保留在主窗口的頂部。
  • 如果在對話框可見時關閉主窗口,則整個應用程序會相應地關閉,但第二個JFrame不會如此,這意味着這會讓您留下一個沒有主應用程序支持的窗口。
  • 該JDialog可以選擇以模態方式顯示,這意味着底層窗口從用戶交互鎖定,直到對話框不再可見。該選項不適用於JFrame。