我如何跨两个类使用JTextField。例如,从一个类获取整数值并将其显示在另一个类的textField中。从jFrame到JFrame
答案 0 :(得分:1)
你的问题是:
我如何跨两个类使用JTextField。例如,从一个类中获取一个整数值,并将其显示在另一个类的textField中。
我建议你以不同的方式思考这个问题。最好考虑一般性问题:
一个对象如何与其他对象共享其数据及其状态?
一个常见且有用的答案是给第一个类,这里是包含JTextField的类,getter方法,如果需要setter方法,允许其他类具有检索JTextField状态的能力(或者如果需要甚至改变它)。例如,您可以为GUI类提供类似的方法:
public String getTextFieldText() {
return textField.getText();
}
然后,您必须确保需要此信息的类具有有效实例到GUI类,即显示 GUI的实例,然后拥有它当需要来自GUI的最新信息时调用此方法。
修改强> 您已编辑了自己的问题并添加了
从jFrame到JFrame
这让我很担心,因为它表明您的程序使用多个JFrame。如果是这样,请重新考虑您的程序设计,因为它需要多个JFrame是不常见的。如果需要显示另一个窗口,通常可以通过显示模态或非模态JDialog来完成。如果它需要改变"观点"这通常使用CardLayout来交换JPanel。
编辑2
有关我所描述的示例,请参阅this answer中的代码。此代码将模式JDialog中的信息传递给启动它的JFrame,并使用我上面提到的技术:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DialogEg {
private static void createAndShowGUI() {
MainPanelGen mainPanelGen = new MainPanelGen();
JFrame frame = new JFrame("DialogEg");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanelGen.getMainPanel());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
class MainPanelGen {
private JPanel mainPanel = new JPanel();
private JTextField field = new JTextField(10);
private JButton btn = new JButton(new BtnActn());
private JDialog dialog;
private DialogPanel dialogPanel = new DialogPanel();
public MainPanelGen() {
mainPanel.add(field);
mainPanel.add(btn);
field.setEditable(false);
field.setFocusable(false);
}
public JPanel getMainPanel() {
return mainPanel;
}
private class BtnActn extends AbstractAction {
BtnActn() {
super("Button");
}
@Override
public void actionPerformed(ActionEvent arg0) {
if (dialog == null) {
Window win = SwingUtilities.getWindowAncestor(mainPanel);
if (win != null) {
dialog = new JDialog(win, "My Dialog",
Dialog.ModalityType.APPLICATION_MODAL);
dialog.getContentPane().add(dialogPanel);
dialog.pack();
dialog.setLocationRelativeTo(null);
}
}
dialog.setVisible(true); // here the modal dialog takes over
System.out.println (dialogPanel.getFieldText());
field.setText(dialogPanel.getFieldText());
}
}
}
class DialogPanel extends JPanel {
private JTextField field = new JTextField(10);
private JButton exitBtn = new JButton(new ExitBtnAxn("Exit"));
public DialogPanel() {
add(field);
add(exitBtn);
}
public String getFieldText() {
return field.getText();
}
private class ExitBtnAxn extends AbstractAction {
public ExitBtnAxn(String name) {
super(name);
}
@Override
public void actionPerformed(ActionEvent arg0) {
Window win = SwingUtilities.getWindowAncestor(DialogPanel.this);
if (win != null) {
win.dispose();
}
}
}
}
模态JDialog中显示的JPanel有一个名为(适当地)field
的JTextField字段:
class DialogPanel extends JPanel {
private JTextField field = new JTextField(10);
并且有一个getter方法允许其他类检查该字段的状态:
public String getFieldText() {
return field.getText();
}
名为MainPanelGen的主GUI类带有一个名为dialogPanel
的DialogPanel类的实例:
class MainPanelGen {
// .... etc
private DialogPanel dialogPanel = new DialogPanel();
在主GUI的ActionListener中,创建了一个模态JDialog" lazily",也就是说,如果JDialog变量为null,则创建对话框,然后将实例分配给此变量。 DailogPanel对象放在模态对话框中并显示:
public void actionPerformed(ActionEvent arg0) {
if (dialog == null) {
Window win = SwingUtilities.getWindowAncestor(mainPanel);
if (win != null) {
dialog = new JDialog(win, "My Dialog",
Dialog.ModalityType.APPLICATION_MODAL);
dialog.getContentPane().add(dialogPanel);
dialog.pack();
dialog.setLocationRelativeTo(null);
}
}
由于对话框是模态的,因此主GUI的代码流在显示对话框时会冻结,并且在对话框不再可见之前不会重新启动。因此,我们知道在对话框上调用setVisible(true)
之后的所有代码都处于暂停动画状态,并且在对话框处理完毕之前不会重新启动。然后,我们在DialogPanel中查询文本字段的文本,并将它们告诉我们:
dialog.setVisible(true); // here the modal dialog takes over
System.out.println (dialogPanel.getFieldText());
field.setText(dialogPanel.getFieldText());
答案 1 :(得分:1)
然后嵌套,所以你有一个类,它在实际显示它的那个中得到整数值E.g:
//Note: this is only a rough representation of the concept
// what I am trying to get across, it wouldn't really
// work like this
class Displayer{
ValueGetter valueGetter;
JTextField textField;
public Displayer(){
valueGetter = new ValueGetter();
}
public void display(){
int value = valueGetter.workOutValue();
textField.setText(value);
}
}
答案 2 :(得分:0)
即使你能做到这一点,你也不应该这样做。相反,有两个JTextField
个共享Integer
值