【问题标题】:Reference Parent UI element in Java参考 Java 中的父 UI 元素
【发布时间】:2016-05-02 19:34:07
【问题描述】:

我是 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.jTextAreaConsole.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;

}

谢谢,

【问题讨论】:

  • 文本区域在什么类中声明?
  • 看起来您将引用与继承混淆了。我建议你去the basic tutorial。如果您想解决此特定问题,请发帖 MCVE。请务必将您的代码复制粘贴到新项目,并确保在将其发布到此处之前编译并运行。
  • 我认为我的问题在于导入类而不是扩展继承它。问题是我不能扩展多个类,因为目前 UI 类已经扩展了 swing 框架。
  • 你的句子没有意义——你没有扩展“swing framework”。在任何情况下,多重继承都不是您的问题,只要存在可见性,IDE 就会为您完成导入。我仍然建议您完成教程并发布minimal reproducible example
  • 使用代码编辑您的问题。确保它不包含不必要的部分。

标签: java swing inheritance


【解决方案1】:

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

  1. 创建MyProject 的实例,我们称之为mp。然后在您的actionPerformed(或您的jButton1ActionPerformed,仍然不确定为什么需要它)中调用mp.clickAction()
  2. 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 的子类,因为它没有任何意义。
  • 该程序现在只有 1 个main,因为它应该只有 1 个 main。我选择MyProjext 作为入口点。
  • MyProjext 持有对 GUI (MainForm) 的引用,因此它可以调用其方法。在我的第 1 点中,我提出了相反的建议:让 GUI 持有对 MyProjext 的引用。根据设计,它仍然可能是更好的选择。
  • MyProjextclickAction 现在是 static,正如我在第 2 点中所建议的那样。同样,这是一个盲目的设计选择。
  • 我使代码更具可读性,因为 GUI 构建器代码不那么友好。我建议在您学习完 OO 的基础知识(不仅与 Java 相关)之后,您应该学习如何编写 GUI 而不是使用构建器。

【讨论】:

  • 两者都不起作用。 1)给我一个空指针异常。 2) 给我一个“在静态上下文中不能引用 passText()”异常。
  • @user1320453 (1) 你初始化了引用吗? (2) 错误没有意义。
  • 1) 我做了 MyProject mp; 2) 完全错误是“不能从静态上下文引用非静态方法 passText()”
  • @user1320453 1) 然后初始化它。 2)同样的问题,要么将该方法设为静态,要么持有对该对象的引用。你必须从头开始做教程,没有办法。您不了解最基本的 OO 概念和语法。在这个阶段你不应该编写程序,你应该学习基础知识。
  • 谢谢。我没有意识到 Java 如此脆弱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-25
  • 1970-01-01
  • 1970-01-01
  • 2016-10-12
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
相关资源
最近更新 更多