将数据从jframe加载到新打开的jframe

时间:2016-10-22 17:23:29

标签: java eclipse user-interface jframe swingx

我在这里有点新鲜。我一直在弄清楚我的代码出了什么问题。我有两个JFrame,一个是我的主框架,另一个是"查看细节"单击主框架中的选定数据时框架。 这是我的主要课程:

public class MainClass{
    private JFrame frame;
    private JButton btnNewButton;
    private String testData;
    private DetailClass detail;

    public JFrame getFrame() {
    return frame;
    }

    public String getTest() {
    return testData;
    }

    public void setTest(String test) {
    this.testData = test;
    }

    public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                main window = new main();
                window.frame.setVisible(true);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}
public MainClass() {
    initialize();
}
private void initialize() {
        //some codes label, button, etc.
        btnNewButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            setTest("Data retrieved from main");
            detail.getFrame().setVisible(true);
        }
    });
 detail = new DetailClass();
 detail.setMainClass(this);
}
}

这是我的DetailClass,我想显示我从main获得的数据。     公共类DetailClass(){     私人MainClass主;     私有JFrame框架;

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                DetailClass window = new DetailClass ();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}
public DetailClass() {
    initialize();
}
public void initialize(){
//some codes for frame

//this is where I test if the detail class receives the data
System.out.println(main.getTest());

}
public void setMainClass(MainClass m){
    this.main = m;
}
}

那就是它,main.getTest()似乎没有在intialize()中工作但是我试图在每次单击第2帧中的按钮时将它放在鼠标事件中并且它工作正常。它似乎只有在框架已经可见/激活/完成渲染时才有效,但它在初始化时无法工作,我需要它在第2帧中预加载数据。我希望你们可以帮助我。 :)

1 个答案:

答案 0 :(得分:2)

如果没有有效的Minimal, Complete, and Verifiable example,我们只能猜出您可能做错了什么,但我猜测other()方法,即显示主要文字的方法,仅在创建第二个JFrame时,在文本更改之前调用一次。这里的解决方案如注释中所述 - 通过方法或构造函数参数将信息从一个类传递到另一个类,并在需要时传递此信息 ,而不仅仅是程序启动。

同样如评论中所述,第二个对话框窗口应该是JDialog,而不是JFrame(应用程序窗口)。

例如:

import java.awt.Dialog.ModalityType;
import java.awt.Dimension;
import java.awt.Window;
import java.awt.event.ActionEvent;
import javax.swing.*;

public class TwoWindows {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }

    private static void createAndShowGui() {
        MainGui mainPanel = new MainGui();
        mainPanel.setPreferredSize(new Dimension(400, 250));
        JFrame frame = new JFrame("Main GUI");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(mainPanel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

class MainGui extends JPanel {
    private SubWindow subWindow = new SubWindow();
    private JDialog dialog;
    private JTextField textField = new JTextField("Text in field", 10);

    public MainGui() {
        add(textField);
        add(new JButton(new ShowDetailAction("Show Detail")));
    }

    private class ShowDetailAction extends AbstractAction {
        public ShowDetailAction(String name) {
            super(name);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            // if dialog not yet created -- create it
            if (dialog == null) {
                Window win = SwingUtilities.getWindowAncestor(MainGui.this);
                dialog = new JDialog(win, "Details Window", ModalityType.MODELESS);
                dialog.add(subWindow);
                dialog.pack();
                dialog.setLocationRelativeTo(win);
            }
            String text = textField.getText();
            subWindow.passText(text);
            dialog.setVisible(true);
        }
    }
}

class SubWindow extends JPanel {
    private JLabel textLabel = new JLabel(" ");

    public SubWindow() {
        setPreferredSize(new Dimension(300, 60));
        add(new JLabel("Details:"));
        add(textLabel);
    }

    public void passText(String text) {
        textLabel.setText(text);
    }

}