2015-06-21 25 views
-1

我正在顯示一個JOptionPane假設A上的按鈕單擊從JFrame,並再次顯示另一個JOptionPane假設B上的按鈕單擊從JOptionPane A,並且我有一個按鈕JOptionPane B suppoce button1上Button1的Click事件中,我使用的代碼JOptionPane.getRootFrame().dispose()用於關閉JOptionPane B,但它關閉A和B,請幫助我如何可以關閉僅有B而不是A.無法正確關閉JOptionPane鏈接順序

這裏是我的示例代碼 我想第二個JOptionPane必須打開

import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 

public class SampleCode extends JFrame { 

public SampleCode() { 
    setSize(new Dimension(500, 500)); 
    setLocation(450, 150); 
    but1 = new JButton("Click me"); 
    add(but1); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    setVisible(true); 

    but1.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      but1Function(); 

     } 
    }); 
} 

public static void main(String args[]) { 
    new SampleCode(); 
} 

void but1Function() { 
    JPanel panel1 = new JPanel(); 
    JButton but2 = new JButton("Open new dialog"); 
    panel1.add(but2); 

    but2.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      JPanel pan2 = new JPanel(); 
      JButton but3 = new JButton("click me to close"); 
      pan2.add(but3); 
      but3.addActionListener(new ActionListener() { 

       @Override 
       public void actionPerformed(ActionEvent e) { 
        JOptionPane.getRootFrame().dispose(); 

       } 
      }); 

      JOptionPane.showMessageDialog(null, pan2); 

     } 
    }); 

    JOptionPane jp = new JOptionPane(panel1, JOptionPane.CLOSED_OPTION, 
      JOptionPane.DEFAULT_OPTION, null, new Object[] {}, null); 

    JDialog dialog = jp.createDialog(null, "This one must be remain open"); 
    dialog.setLocation(500, 200); 
    dialog.setSize(new Dimension(345, 200)); 
    dialog.setVisible(true); 
} 

JButton but1; 

}

+4

你可以發佈示例代碼,顯示你在做什麼?這有助於理解你的問題。 –

+0

這裏是我的示例代碼 –

+0

我想中間JOptionPane必須保持打開當我們點擊按鈕'點我關閉'的最後一個joptionpane –

回答

1

靜態方法「getRootFrame()」返回您的根框架,它是唯一的框架,它對於您的組件(A和B)都是相同的。你需要做的 - 你必須在你的根框架中放入兩幀(稱它們爲frameA和frameB),並將paneA放到frameA和paneB到frameB中。不用調用這個靜態方法,而是調用已經擁有的參考frameB上的frameB.dispose()。

2

您不想獲取根框架也不處理它​​。你想獲得顯示JOptionPane的窗口,該窗口應該是一個模態的JDialog。因此,如果要以編程方式處置JOPtionPane,請使用SwingUtilities.getWindowAncestor(someComponentInJOptionPane),並在該窗口上調用dispose()

import java.awt.Component; 
import java.awt.Window; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 

import javax.swing.AbstractAction; 
import javax.swing.JButton; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 


public class OptionPaneFun { 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     @SuppressWarnings("serial") 
     public void run() { 
      final JPanel panel1 = new JPanel(); 
      panel1.add(new JButton(new AbstractAction("Show new option pane") { 
       { 
        putValue(MNEMONIC_KEY, KeyEvent.VK_S); 
       } 
       @Override 
       public void actionPerformed(ActionEvent e1) { 
        final JPanel panel2= new JPanel(); 
        panel2.add(new JButton(new AbstractAction("Dispose of this option pane") { 
        { 
         putValue(MNEMONIC_KEY, KeyEvent.VK_D); 
        } 
        @Override 
        public void actionPerformed(ActionEvent e2) { 
         Component comp = (Component) e2.getSource(); 
         Window win = SwingUtilities.getWindowAncestor(comp); 
         if (win != null) { 
          win.dispose(); 
         } 
        } 
        })); 
        JOptionPane.showMessageDialog(panel1, panel2); 

       } 
      })); 
      JOptionPane.showMessageDialog(null, panel1); 
     } 
     }); 

    } 
} 
-1

嘗試添加

panel.validiate(); 處理命令後。我曾經遇到過同樣的問題,當我使用這個技巧時,它幫了很大忙。

基本上,當你添加這個命令時,它告訴幀來驗證或者實際做到這一點。

閱讀oracle文檔以獲取更多信息。