2013-06-25 36 views
2

他们如何设计JFileChooser?两个JFrame之间的挥杆信息交换模式

JFileChooser chooser = new JFileChooser(); 
int returnVal = chooser.showOpenDialog(this); 
if(returnVal == JFileChooser.APPROVE_OPTION) { 
    System.out.println("You chose to open this file: " + 
       chooser.getSelectedFile().getName()); 

我该如何设计这样一个信息交流的框架。例如,我有Frame1和Frame2。 Frame1打开Frame2。 Frame2有一个JTextArea,我将在其中设置一些文本并对其进行编辑。在按下frame2中的OK按钮后,它关闭,我想让Frame1中的变量中的文本。

或者说如果我想做一个字体选择器对话框。

JOptionPane不适合我。在frame2中,我将有一个HTML编辑器。在frame1中,我有JTable。点击表格中的一行将打开带有HTML编辑器的frame2。我正在使用SHEF来达到这个目的。当我按下OK/Save按钮关闭frame2时,我需要frame1中的html文本String。并相应地设置行内容。但是frame2可以是一个模态对话框。

回答

4

开始由具有通过The Use of Multiple JFrames: Good or Bad Practice?

读取然后具有How to make dialogs读取。

JFileChooser是一个组件,它也有一个显示对话框的方法。您的需求可能会有所不同,但它不看你的组件到开始需要在对话框

更新

你可以使用一个JOptionPane

一直显示它不是一个坏的模式enter image description here

import java.awt.EventQueue; 
import javax.swing.JOptionPane; 
import javax.swing.JTextField; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TestOptionPane12 { 

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

    public TestOptionPane12() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JTextField field = new JTextField(); 
       int option = JOptionPane.showConfirmDialog(null, field, "Fill it out", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); 
       switch (option) { 
        case JOptionPane.OK_OPTION: 
         System.out.println("You entered " + field.getText()); 
         break; 
       } 

      } 

     }); 
    } 

} 

或者你可以创建更多的自定义解决方案......

enter image description here

import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.EventQueue; 
import java.awt.GridBagLayout; 
import java.awt.Window; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TestOptionPane12 { 

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

    public TestOptionPane12() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException ex) { 
       } catch (InstantiationException ex) { 
       } catch (IllegalAccessException ex) { 
       } catch (UnsupportedLookAndFeelException ex) { 
       } 

       FieldsPane pane = new FieldsPane(); 
       switch (pane.showDialog(null)) { 
        case JOptionPane.OK_OPTION: 
         String text = pane.getText(); 
         System.out.println("You entered: " + text); 
         break; 
       }     
      } 
     });  
    } 

    protected class FieldsPane extends JPanel { 

     private JTextField field; 
     private int state = JOptionPane.CANCEL_OPTION; 

     public FieldsPane() { 
      setLayout(new GridBagLayout()); 
      field = new JTextField(10); 
      add(field); 
     } 

     public String getText() { 
      return field.getText(); 
     } 

     public int showDialog(Component parent) { 

      JButton btnOkay = new JButton("Ok"); 
      JButton btnCancel = new JButton("Cancel"); 
      JPanel buttons = new JPanel(); 
      buttons.add(btnOkay); 
      buttons.add(btnCancel); 

      btnOkay.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        state = JOptionPane.OK_OPTION; 
        Window win = SwingUtilities.getWindowAncestor((Component)e.getSource()); 
        win.dispose(); 
       } 
      }); 
      btnCancel.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        state = JOptionPane.CANCEL_OPTION; 
        Window win = SwingUtilities.getWindowAncestor((Component)e.getSource()); 
        win.dispose(); 
       } 
      }); 

      JDialog dialog = new JDialog(parent == null ? (Window)null : SwingUtilities.getWindowAncestor(parent), "Fill it out"); 
      dialog.setModal(true); 
      dialog.add(this); 
      dialog.add(buttons, BorderLayout.SOUTH); 
      dialog.pack(); 
      dialog.setLocationRelativeTo(null); 
      dialog.setVisible(true); 

      return state;    
     }   
    }  
} 

更新,其中的JOptionPane和JEditorPane的例子

enter image description here

import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.GridBagLayout; 
import java.awt.Window; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JEditorPane; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TestOptionPane12 { 

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

    public TestOptionPane12() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JEditorPane editorPane = new JEditorPane("text/html", null); 
       JScrollPane scrollPane = new JScrollPane(editorPane); 
       scrollPane.setPreferredSize(new Dimension(200, 200)); 
       int option = JOptionPane.showConfirmDialog(null, scrollPane, "Fill it out", JOptionPane.OK_CANCEL_OPTION, -1); 
       switch (option) { 
        case JOptionPane.OK_OPTION: 
         System.out.println("You entered " + editorPane.getText()); 
         break; 
       } 

      } 

     }); 
    } 
} 
+1

同时考虑在无模式对话框中观察者模式,见[这里](http://stackoverflow.com/a/11832979/230513)。 – trashgod

+0

我想要有JDialog。但仍然需要一个模式来处理OK,Cancel或其他事件,并获取我的Frame1类中的文本或其他更多对象。 – karim

+0

从创建组件开始,可能使用'JPanel',将textfield添加到它。提供一个getter方法来获取文本。创建一个方法来创建一个对话框 – MadProgrammer

0

您可以创建专班,将持有的结果。例如:

public class Result { 
    private String result; 

    public void setResult(String result) { ... } 

    public String getResult() { ... } 
} 

在第一帧中创建此类的实例并将其传递给第二帧。一旦关闭第二帧设置结果,然后第一帧就可以得到它。

+0

我明白了。但JFileChooser方法对我来说似乎更简洁和容易。 – karim

0

让它多对话代替框架,然后读了有关调解模式:

http://blue-walrus.com/2013/06/mediator-pattern-in-swing/

你的基本问题是,你有分量的层次结构和组件上的一个分支想要与另一个遥远的分支上的组件进行通信。您需要某种中介对象来在这些遥远的分支之间进行通信。

0

看看"Event Driven Programming":不是组件之间的紧密耦合(每个组件必须知道每个其他组件),您可以发送事件并且组件可以响应它们。