Java中的引用父UI元素

时间:2016-01-26 09:20:14

标签: java swing inheritance

我是Java的新手,我遇到了一个问题。我创建了一个带有Swing UI的类,其中包含一个名为'jTextAreaConsole'的jTextArea。:

/MyFolder

此类导入另一个名为“dbConverter”的类:

public class converterUI extends javax.swing.JFrame {

dbConverter是一个带有一个方法的简单类:

package my.converterui;
import dbToExcel.dbConverter;

runQuery和writeOut方法在此类扩展的“common”类中详细说明。我想要做的是在公共类引用jTextAreaConsole对象以向其追加文本。我已经尝试过使用super.jTextAreaConsole.append(str)并运行但没有做任何事情。

编辑:这里的基本示例:

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) {
}
}

谢谢,

1 个答案:

答案 0 :(得分:1)

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

  1. 创建MyProject的实例,我们称之为mp。然后在actionPerformed(或您的jButton1ActionPerformed,仍然不确定为什么需要它),请致电mp.clickAction()
  2. clickAction设为静态,然后调用MyProject.clickAction()
  3. 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的引用。根据设计,它仍然是一个更好的选择。
    • MyProjext的{​​{1}}现在clickAction正如我在我的观点中所建议的那样2.再次,这是一个盲目的设计选择。
    • 我使代码更具可读性,因为GUI构建器代码不那么友好。我建议在你学完OO的基础知识(不仅与Java相关)之后,你将学习如何编写GUI而不是使用构建器。