Java中的引用父UI元素

Java中的引用父UI元素,java,swing,inheritance,Java,Swing,Inheritance,我是Java新手,有一个问题一直困扰着我。我创建了一个包含Swing UI的类,其中包含一个名为“jTextAreaConsole”的jTextArea: public class converterUI extends javax.swing.JFrame { 此类导入另一个名为“dbConverter”的类: package my.converterui; import dbToExcel.dbConverter; dbConverter是一个简单的类,有一个方法: public cla

我是Java新手,有一个问题一直困扰着我。我创建了一个包含Swing UI的类,其中包含一个名为“jTextAreaConsole”的jTextArea:

public class converterUI extends javax.swing.JFrame {
此类导入另一个名为“dbConverter”的类:

package my.converterui;
import dbToExcel.dbConverter;
dbConverter是一个简单的类,有一个方法:

public class dbConverter extends common{

public static void convert(String sourceDB, String sourceQry, String destination, String objectName){
    dbConverter converter = new dbConverter();
    Connection con = converter.getConnection(sourceDB);
    String sql = sourceQry;
    ResultSet result = converter.runQuery1(con,sql);
    converter.writeOut(result, objectName, destination);
    closeConnection(con);
}
public static void main(String[] args) {
}
}
runQuery和writeOut方法在该类扩展的“common”类中有详细说明。我要做的是在公共类引用jTextAreaConsole对象中向其追加文本。我已经尝试过使用super.jtextraceconsole.append(str)了,它可以运行,但没有任何作用

编辑:此处的基本示例:

package myproject;

public class MyProject extends mainForm{

    public static void main(String[] args) {
        mainForm.main(null);
    }

    public void clickAction(){
        passText();
    }
}


package myproject;
class mainForm extends javax.swing.JFrame {

    public void passText(){
        jTextArea1.append("This is a test");
    }

    public mainForm() {
        initComponents();
    }



    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jTextArea1 = new javax.swing.JTextArea();
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jTextArea1.setColumns(20);
        jTextArea1.setRows(5);
        jScrollPane1.setViewportView(jTextArea1);

        jButton1.setText("Click me");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(40, 40, 40)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 318, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(42, Short.MAX_VALUE))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jButton1)
                .addGap(162, 162, 162))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(46, 46, 46)
                .addComponent(jButton1)
                .addGap(27, 27, 27)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 179, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(25, Short.MAX_VALUE))
        );

        pack();
    }                       

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         

    }                                        

      public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new mainForm().setVisible(true);
            }
        });
    }


    private javax.swing.JButton jButton1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextArea jTextArea1;

}

谢谢,

根据您的设计,您有两种选择:

  • 创建
    MyProject
    的一个实例,我们称之为
    mp
    。然后在您的
    actionPerformed
    (或者您的
    jButton1ActionPerformed
    ,仍然不确定为什么需要它)中调用
    mp.clickAction()
  • 使
    clickAction
    静态,然后调用
    MyProject.clickAction()
  • MyProject
    扩展了
    mainForm
    (应重命名为
    mainForm
    )这一事实已经告诉我,您的设计可能有问题

    编辑:

    在这里,我为您编写了代码。如果您以后需要扩展它,并且因为设计不好而不容易实现,请不要感到惊讶

    import java.awt.EventQueue;
    
    import javax.swing.GroupLayout;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.WindowConstants;
    
    import static javax.swing.GroupLayout.*;
    import static javax.swing.GroupLayout.Alignment.*;
    
    public class MyProject {
    
        private static MainForm gui = new MainForm();
    
        public static void main(String[] args) {
    
            EventQueue.invokeLater(() -> gui.setVisible(true));
        }
    
        public static void clickAction() {
    
            gui.passText();
        }
    }
    
    class MainForm extends JFrame {
    
        private JTextArea jTextArea1 = new JTextArea();
    
        public MainForm() {
    
            initComponents();
        }
    
        private void initComponents() {
    
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    
            JScrollPane jScrollPane1 = new JScrollPane();
            JButton jButton1 = new JButton();
    
            jTextArea1.setColumns(20);
            jTextArea1.setRows(5);
            jScrollPane1.setViewportView(jTextArea1);
    
            jButton1.setText("Click me");
            jButton1.addActionListener(e -> MyProject.clickAction());
    
            //@formatter:off
            GroupLayout layout = new GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addGap(40, 40, 40)
                    .addComponent(jScrollPane1, PREFERRED_SIZE, 318, PREFERRED_SIZE)
                    .addContainerGap(42, Short.MAX_VALUE))
                .addGroup(TRAILING, layout.createSequentialGroup()
                    .addContainerGap(DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jButton1)
                    .addGap(162, 162, 162))
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addGap(46, 46, 46)
                    .addComponent(jButton1)
                    .addGap(27, 27, 27)
                    .addComponent(jScrollPane1, PREFERRED_SIZE, 179, PREFERRED_SIZE)
                    .addContainerGap(25, Short.MAX_VALUE))
            );
            //@formatter:on
    
            pack();
        }
    
        public void passText() {
    
            jTextArea1.append("This is a test");
        }
    }
    
    我所做的:

    • MyProjext
      不再是
      MainForm
      的子类,因为这样做没有意义
    • 该程序现在只有一个main,因为它应该只有一个main。我选择了
      MyProjext
      作为入口点
    • MyProjext
      保存对GUI(
      MainForm
      )的引用,以便调用其方法。在我的第1点中,我建议采用另一种方式:让GUI保存对
      MyProjext
      的引用。根据设计的不同,它仍然是一个更好的选择
    • MyProjext
      clickAction
      现在是
      static
      ,正如我在第2点中所建议的那样。同样,这是一种盲目的设计选择
    • 我使代码更具可读性,因为GUI生成器代码没有那么友好。我建议您在学习完OO的基础知识(不仅与Java相关)后,学习如何编写GUI,而不是使用构建器

    文本区域在哪个类中声明?看起来您混淆了引用和继承。我建议你过去。如果你想解决这个特定的问题,请发一个帖子。请确保将您的代码复制粘贴到新项目中,并确保在将其发布到此处之前进行编译和运行。我认为我的问题在于导入类而不是扩展以继承它。问题是我不能扩展多个类,因为目前UI类已经扩展了swing框架。你的话毫无意义——你没有扩展“swing框架”。在任何情况下,多重继承都不是您的问题,只要存在可见性,就由IDE为您完成导入。我仍然建议您完成教程并发布一个。用代码编辑您的问题。确保它不包含不必要的部分。这两种方法都不起作用。1) 给我一个空指针异常。2) 给我一个“passText()不能在静态上下文中引用”异常。@user1320453(1)您初始化引用了吗?(2) 这个错误毫无意义。1)我做了我的项目mp;2) 完整错误为“无法从静态上下文引用非静态方法passText()”@user1320453 1),然后初始化它。2) 同样的问题,要么使该方法成为静态的,要么保持对该对象的引用。你必须从一开始就做教程,没有办法绕过它。您不了解最基本的OO概念和语法。你不应该在这个阶段编写程序,你应该学习基础知识。谢谢。我没有意识到Java是如此脆弱。