Java中的引用父UI元素
我是Java新手,有一个问题一直困扰着我。我创建了一个包含Swing UI的类,其中包含一个名为“jTextAreaConsole”的jTextArea: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
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
保存对GUI(MyProjext
)的引用,以便调用其方法。在我的第1点中,我建议采用另一种方式:让GUI保存对MainForm
的引用。根据设计的不同,它仍然是一个更好的选择MyProjext
的MyProjext
现在是clickAction
,正如我在第2点中所建议的那样。同样,这是一种盲目的设计选择static
- 我使代码更具可读性,因为GUI生成器代码没有那么友好。我建议您在学习完OO的基础知识(不仅与Java相关)后,学习如何编写GUI,而不是使用构建器