Java 两个jframe之间的swing信息交换模式
他们是如何设计的,即JFileChooserJava 两个jframe之间的swing信息交换模式,java,swing,design-patterns,jframe,Java,Swing,Design Patterns,Jframe,他们是如何设计的,即JFileChooser JFileChooser chooser = new JFileChooser(); int returnVal = chooser.showOpenDialog(this); if(returnVal == JFileChooser.APPROVE_OPTION) { System.out.println("You chose to open this file: " + chooser.getSelectedF
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。我正在为此目的使用。当我按OK/Save按钮关闭frame2时,我希望在frame1中显示html文本
字符串
。并相应地设置行内容。但是frame2可以是一个模态对话框 从通读开始
然后读一读
JFileChooser
是一个组件,它有一个同样显示对话框的方法。您的需求可能会有所不同,但这不是一个坏模式,因为它不会查看您的组件,您需要始终在对话框中显示
已更新
您可以使用JOptionPane
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;
}
}
});
}
}
或者您可以创建一个更自定义的解决方案
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示例
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;
}
}
});
}
}
从通读开始 然后读一读
JFileChooser
是一个组件,它有一个同样显示对话框的方法。您的需求可能会有所不同,但这不是一个坏模式,因为它不会查看您的组件,您需要始终在对话框中显示
已更新
您可以使用JOptionPane
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;
}
}
});
}
}
或者您可以创建一个更自定义的解决方案
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示例
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;
}
}
});
}
}
您可以创建保存结果的特殊类。比如:
public class Result {
private String result;
public void setResult(String result) { ... }
public String getResult() { ... }
}
在第一帧中创建该类的实例,并将其传递给第二帧。在关闭第二帧时设置结果,然后第一帧可以获得它 您可以创建保存结果的特殊类。比如:
public class Result {
private String result;
public void setResult(String result) { ... }
public String getResult() { ... }
}
在第一帧中创建该类的实例,并将其传递给第二帧。在关闭第二帧时设置结果,然后第一帧可以获得它 将其设置为多个对话框,而不是框架,然后阅读有关中介模式的内容:
您的基本问题是您有一个组件层次结构,一个分支上的组件想要与另一个遥远分支上的组件通信。您需要某种中介对象来在这些遥远的分支之间进行通信。将其设置为多个对话框而不是框架,然后阅读中介模式:
您的基本问题是您有一个组件层次结构,一个分支上的组件想要与另一个遥远分支上的组件通信。您需要某种中介对象来在这些遥远的分支之间进行通信。看一看:您可以发送事件,组件可以响应事件,而不是组件之间的紧密耦合(每个组件必须知道每个其他组件)。看一看:而不是组件之间的紧密耦合(每个组件必须知道每个其他组件)也可以考虑在非模态对话框中观察到观察者模式。我想拥有j对话框。但是我仍然需要一个模式来处理OK、取消或其他事件,并在我的Frime1类中获取文本或其他更多的对象。从创建组件开始,也许使用<代码> JPANT/<代码>,添加YO。请提供一个获取文本的方法。创建一个创建对话框的方法,用注释来投票。帮助我们,留下评论,这样我们就可以讨论解决问题的方法。JoptPANE不是我的选择。我在我的问题中添加了更多的问题描述。也考虑了观察者模式。在无模式对话框中,如图所示。我希望使用JDialog。但我仍然需要一个模式来处理OK、Cancel或其他事件,并在Frame1类中获取文本或其他更多对象。从创建组件开始,可以使用
JPanel
,将文本字段添加到该组件中。提供获取文本的getter方法。创建一个方法来创建对话框我喜欢没有评论的否决票。帮我们,留下评论,这样我们就可以讨论解决问题的方法。OptionPane对我来说不是一个选项。我在问题中添加了更多关于这个问题的描述。我理解。但是JFileChooser方法对我来说似乎更干净、更容易。我理解。但是JFileChooser方法似乎是这对我来说更干净更容易。