有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (2) 个答案

  1. # 1 楼答案

    1. 您需要学习并坚持Java命名约定:类名应该以大写字母开头。遵循这些约定将使您的代码更容易让其他人(例如我们)理解,从而让其他人更容易帮助您
    2. 当您在jButton1ActionPerformed方法中创建一个新的frmA对象时,您正在这样做,创建一个与显示的另一个对象完全无关的新的frmA对象
    3. 要对显示的方法调用方法,需要对其进行有效的引用,这可以通过构造函数或setter方法参数传入该引用来实现
    4. 无论您做什么,都不要试图通过使任何方法或变量保持静态来解决此问题。从长远来看,这将破坏您的应用程序
    5. 稍后我们将讨论为什么在单个应用程序中显示多个JFrames不是一个好主意

    请注意,您的问题与Swing无关,而与基本Java有关。任何类都可以使用Swing生成多个实例,每个实例都是唯一的,并且完全不同于其他实例。更改一个实例的状态不会对其他任何实例产生影响


    你问我是否可以用它来编写代码,当然,这里有一个例子

    假设您有一个类a,它有一个名为textField的JTextField和一个名为setText(String text)的方法,该方法接受传入的字符串并将其放入textField中:

    // this is in class A
    public void setText(String text) {
      textField.setText(text);
    }
    

    在您的情况下,您有一个类B1,它有一个JButton,试图调用a的方法,但是通过创建一个新的对象来实现,如下所示:

       button.addActionListener(new ActionListener() {
    
         @Override
         public void actionPerformed(ActionEvent arg0) {
            A a = new A();   // creates a new A object
            a.setText("Hello from B1!");  // and calls its method
         }
       });
    

    但是,这同样不起作用,因为上面的代码创建了一个新的a对象,该对象与显示的a不同。关键是将a的引用传递到该类中,然后调用该类的方法,就像我的B2类一样,因此:

    class B2 extends JPanel {
       private JButton button = new JButton("Press ME");
       private A a;  // field to hold a reference to A object
    
       public B2(final A a) {  // constructor parameter to get A refrence
          this.a = a;    // assign reference
          setBorder(BorderFactory.createTitledBorder("B2"));
          add(button);      
          button.addActionListener(new ActionListener() {
    
             @Override
             public void actionPerformed(ActionEvent e) {
                a.setText("Hello from B2!");  // now can use the reference in program
             }
          });
       }
    }
    

    一个可运行的示例程序:

    import java.awt.GridLayout;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class Foo {
       public static void main(String[] args) {
          A a = new A();
          B1 b1 = new B1();
          B2 b2 = new B2(a);
    
          JPanel panel = new JPanel(new GridLayout(0, 1));
          panel.add(a);
          panel.add(b1);
          panel.add(b2);
    
          JOptionPane.showMessageDialog(null, panel);
       }
    }
    
    class A extends JPanel {
       private JTextField textField = new JTextField(10);
    
       public A() {
          add(textField);
          textField.setEditable(false);
          textField.setFocusable(false);
          setBorder(BorderFactory.createTitledBorder("A"));
       }
    
       public void setText(String text) {
          textField.setText(text);
       }
    }
    
    class B1 extends JPanel {
       private JButton button = new JButton("Press ME   this does nothing");
    
       public B1() {
          add(button);
          setBorder(BorderFactory.createTitledBorder("B1"));
          button.addActionListener(new ActionListener() {
    
             @Override
             public void actionPerformed(ActionEvent arg0) {
                A a = new A();
                a.setText("Hello from B1!");
             }
          });
       }
    }
    
    class B2 extends JPanel {
       private JButton button = new JButton("Press ME   this works!!");
       private A a;
    
       public B2(final A a) {
          this.a = a;
          setBorder(BorderFactory.createTitledBorder("B2"));
          add(button);      
          button.addActionListener(new ActionListener() {
    
             @Override
             public void actionPerformed(ActionEvent e) {
                a.setText("Hello from B2!");
             }
          });
       }
    }
    
  2. # 2 楼答案

    为什么要在类中创建一个新的jframe,让它们都将frmA作为参数传递给frmB