调用另一个 JFrame 中的方法。

huangapple go评论92阅读模式
英文:

Call a method from another JFrame

问题

MainFrame.java

  1. import frames.SelectFrame;
  2. import javax.swing.*;
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5. public class MainFrame extends JFrame {
  6. private JPanel mainPanel;
  7. private JComboBox cbOption;
  8. private JButton btConfirm;
  9. private JLabel lbCredit;
  10. private JFrame createFrame;
  11. public static void main(String[] args) {
  12. JFrame mainFrame = new JFrame("");
  13. mainFrame.setContentPane(new MainFrame().mainPanel);
  14. mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  15. mainFrame.pack();
  16. mainFrame.setVisible(true);
  17. mainFrame.setBounds(500, 500, 400, 400);
  18. }
  19. public MainFrame() {
  20. btConfirm.addActionListener(new ActionListener() {
  21. @Override
  22. public void actionPerformed(ActionEvent e) {
  23. int option = cbOption.getSelectedIndex();
  24. System.out.println(option);
  25. if (option == 0) {
  26. JFrame createFrame = new SelectFrame();
  27. createFrame.setContentPane(new SelectFrame().mainPanel);
  28. createFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  29. createFrame.pack();
  30. createFrame.setVisible(true);
  31. createFrame.setBounds(500, 500, 400, 400);
  32. System.out.println("Frame created!");
  33. } else if (option == 1) {
  34. } else {
  35. }
  36. }
  37. });
  38. }
  39. public final JFrame getCreateFrame() {
  40. return createFrame;
  41. }
  42. }

CreateFrame.java

  1. package frames;
  2. import javax.swing.*;
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5. public class SelectFrame extends JFrame {
  6. public JPanel mainPanel;
  7. private JLabel lbCredit;
  8. private JComboBox cbxCurrency;
  9. private JButton btConfirm;
  10. private JButton btExit;
  11. public SelectFrame() {
  12. btConfirm.addActionListener(new ActionListener() {
  13. @Override
  14. public void actionPerformed(ActionEvent e) {
  15. }
  16. });
  17. btExit.addActionListener(new ActionListener() {
  18. @Override
  19. public void actionPerformed(ActionEvent e) {
  20. }
  21. });
  22. }
  23. }
英文:

I want to get a JFrame (createFrame) from another JFrame (mainFrame). I created a method in the mainFrame which returns the createFrame, so that I can dispose the createFrame when clicking a button in the createFrame. But I cant call this methode (getCreateFrame) from the second JFrame (createFrame).

MainFrame.java

  1. import frames.SelectFrame;
  2. import javax.swing.*;
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5. public class MainFrame extends JFrame{
  6. private JPanel mainPanel;
  7. private JComboBox cbOption;
  8. private JButton btConfirm;
  9. private JLabel lbCredit;
  10. private JFrame createFrame;
  11. public static void main(String[] args) {
  12. JFrame mainFrame = new JFrame("");
  13. mainFrame.setContentPane(new MainFrame().mainPanel);
  14. mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  15. mainFrame.pack();
  16. mainFrame.setVisible(true);
  17. mainFrame.setBounds(500, 500, 400, 400);
  18. }
  19. public MainFrame() {
  20. btConfirm.addActionListener(new ActionListener() {
  21. @Override
  22. public void actionPerformed(ActionEvent e) {
  23. int option = cbOption.getSelectedIndex();
  24. System.out.println(option);
  25. if(option == 0){
  26. JFrame createFrame = new SelectFrame();
  27. createFrame.setContentPane(new SelectFrame().mainPanel);
  28. createFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  29. createFrame.pack();
  30. createFrame.setVisible(true);
  31. createFrame.setBounds(500, 500, 400, 400);
  32. System.out.println("Frame created!");
  33. } else if(option == 1){
  34. } else{
  35. }
  36. }
  37. });
  38. }
  39. public final JFrame getCreateFrame(){
  40. return createFrame;
  41. }
  42. }

CreateFrame.java

  1. package frames;
  2. import javax.swing.*;
  3. import java.awt.*;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. import java.sql.Date;
  7. public class SelectFrame extends JFrame{
  8. public JPanel mainPanel;
  9. private JLabel lbCredit;
  10. private JComboBox cbxCurrency;
  11. private JButton btConfirm;
  12. private JButton btExit;
  13. public SelectFrame() {
  14. btConfirm.addActionListener(new ActionListener() {
  15. @Override
  16. public void actionPerformed(ActionEvent e) {
  17. }
  18. });
  19. btExit.addActionListener(new ActionListener() {
  20. @Override
  21. public void actionPerformed(ActionEvent e) {
  22. }
  23. });
  24. }
  25. }

答案1

得分: 1

回答你的问题,我认为你应该查看编程范围

如果你想在SelectFrame类中访问getCreateFrame()方法,你需要能够以某种方式 达到 MainFrame 类,因为这个类保存了这个方法。

createFrameMainFrame 类的一个私有变量,这意味着它只能在类内部访问。这就是为什么(如你所做的)你需要一个获取方法来检索它。不过,当你调用获取方法时,你想知道要访问哪个对象的 createFrame。问题是,SelectFrame 怎么知道要调用哪个方法?

如果你像这样编辑你的 SelectFrame 类:

  1. public class SelectFrame extends JFrame {
  2. private MainFrame mFrame;
  3. public SelectFrame(MainFrame frame) {
  4. mFrame = frame;
  5. }
  6. }

你现在可以在 SelectFrame 类中从你传递给 SelectFrame 构造函数的 MainFrame 中调用 getCreateFrame()。(mFrame.getCreateFrame();

注意:在 MainFrame 类的构造函数中,你在一个 if 语句中初始化了你的 createFrame,这意味着除非 option == 0,否则它会给你返回 null

  1. if(option == 0) {
  2. JFrame createFrame = new SelectFrame();
  3. }
英文:

To answer your question I believe you should take a look at Programming scope.

If you want to access the getCreateFrame() method in your SelectFrame-class you will need to be able to reach the MainFrame-class somehow since this holds the method.

createFrame is a private variable of the MainFrame-class which means it's only accessible within the class. Which is why (as you have done) you need a get-method to retrieve it. Although, when you call the get-method you want to know which object's createFrame you are trying to access. The question is, how will SelectFrame know which method to call?

If you edit your SelectFrame-class alike this:

  1. public class SelectFrame extends JFrame {
  2. private MainFrame mFrame;
  3. public SelectFrame(MainFrame frame) {
  4. mFrame = frame;
  5. }
  6. }

You can now call the getCreateFrame() from the MainFrame you pass to SelectFrame's constructor within the SelectFrame class. (mFrame.getCreateFrame();)

Note: In the MainFrame-class's constructor you initialize your createFrame in an if-statement which means it will give you null unless option == 0.

  1. if(option == 0) {
  2. JFrame createFrame = new SelectFrame();
  3. }

答案2

得分: 0

你返回的createFrame为空。这是因为你在MainFram构造函数中引入了一个局部实例JFrame createFrame = new SelectFrame();

  1. public final JFrame getCreateFrame(){
  2. return createFrame;
  3. }
英文:

Your returned createFrame is null. This is due to the fact that you have introduced an local instance of JFrame createFrame = new SelectFrame(); in the MainFram constructor

  1. public final JFrame getCreateFrame(){
  2. return createFrame;
  3. }

答案3

得分: 0

在你的构造函数中,你创建了一个局部变量,而不是赋值给你创建的实例变量。

  1. JFrame createFrame = new SelectFrame();

而应该是:

  1. createFrame = new SelectFrame();

不要创建一个新变量,而是赋值给已经存在的变量。

英文:

In your constructor, you are creating a local variable instead of assigning to the instance variable you created.

  1. JFrame createFrame = new SelectFrame();

Should instead have been:

  1. createFrame = new SelectFrame();

Don't create a new variable, assign to the existin one.

huangapple
  • 本文由 发表于 2020年9月9日 15:39:16
  • 转载请务必保留本文链接:https://go.coder-hub.com/63806861.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定