Dataset.java
package base_project;
import ....
public class Dataset extends javax.swing.JFrame {
public Dataset() {
initComponents();
addRowToJTable();
}
static ArrayList<a> ar = new ArrayList<a>();
public void Read()
{
}
public void addRowToJTable()
{
DefaultTableModel model = (DefaultTableModel) jTableDataset.getModel();
Read();
String Data[][]=new String[ar.size()][12];
for (int i=0;i<ar.size();i++)
{ }
}
private void jButtonDSNextActionPerformed(java.awt.event.ActionEvent evt) {
Classification c = new Classification();
c.setVisible(true);
this.setVisible(false);
}
public static void main(String args[]) {
}
这是我的第一个JFrame表单,名为Dataset.java。在这个文件中我使用了Read()方法。此文件包含一个按钮,该按钮通向名为分类的下一个JFrame。 Classification.java的代码如下:
Classification.java
package base_project;
import ....
public class Classification extends javax.swing.JFrame {
public Classification() {
initComponents();
addRowToJTable();
}
static ArrayList<a> ar = new ArrayList<a>();
static ArrayList<q> aq = new ArrayList<q>();
static ArrayList<s> as = new ArrayList<s>();
public static void Read()
{}
public static void Set_Q()
{}
public static void Set_s()
{}
public void addRowToJTable()
{
DefaultTableModel modelQID = (DefaultTableModel) jTableQID.getModel();
DefaultTableModel modelSA = (DefaultTableModel) jTableSA.getModel();
Read();
Set_Q();
Set_s();
String DataQ[][]=new String[aq.size()][6];
for (int i=0;i<aq.size();i++)
{
}
String DataS[][]=new String[as.size()][6];
for (int i=0;i<as.size();i++)
{
}
}
public static void main(String args[]) {
}
这很好。但问题是我必须再次在此Classification.java中编写整个 Read()方法。因此,每当我想使用该方法时,我必须再次在每个新的JFrame中写入它,这是我不想要的。那么我该怎么做才能避免这种情况呢?
我不是java专家所以请耐心等待。我试过浏览java文档和在这个网站上但似乎找不到解决我问题的方法。
提前感谢。
答案 0 :(得分:0)
以下是一些有点令人困惑的事情,如下所示:
首先,应该只有一个公共的静态void main(String args []){}方法,因为这是程序的开始,只能有一个。
其次,当一个类扩展另一个类时,它共享超类中的所有方法。这就是你去的时候所做的事情&#34; Classification扩展了JFrame&#34;和&#34;数据集扩展了JFrame&#34;现在这两个类在技术上都有相同的方法,加上你在每个类中添加的内容。 因此,关键的OOP原则之一是,如果两个类共享完全相同的代码,则将该代码放在超类中。在这种情况下,两个类都扩展了JFrame,但是您无法编辑JFrame,因为它是现有Java API的一部分。因此,要使read()方法在两个文件之间通用,您应该创建一个包装器,如(AbstractReadFrame.java):
public abstract class AbstractReadFrame extends JFrame {
// AbstractReadFrame shares all methods within JFrame
public void read() {
// code for reading, this is shared between all classes which extends AbstractReadFrame
}
// other common code
}
public class Classification extends AbstractReadFrame {
// shares all methods within AbstractReadRame and JFrame
public void addRowToJTable() {
DefaultTableModel modelQID = (DefaultTableModel) jTableQID.getModel();
DefaultTableModel modelSA = (DefaultTableModel) jTableSA.getModel();
Read();// calls read() in AbstractReadFrame
Set_Q();
Set_s();
String DataQ[][] = new String[aq.size()][6];
for (int i = 0; i < aq.size(); i++) {
}
String DataS[][] = new String[as.size()][6];
for (int i = 0; i < as.size(); i++) {
}
}
// other code
}
public class Dataset extends AbstractReadFrame {
// shares all methods within AbstractReadRame and JFrame
public void addRowToJTable() {
DefaultTableModel model = (DefaultTableModel) jTableDataset.getModel();
Read(); // calls read() in AbstractReadFrame
String Data[][] = new String[ar.size()][12];
for (int i = 0; i < ar.size(); i++) {
}
}
// other code
}
但是,在classification.java中,你声明read()是静态的,这意味着它不会像我上面提到的那样工作。我建议阅读有关Java继承的内容(例如https://www.tutorialspoint.com/java/java_inheritance.htm) 因为这可以帮助你构建程序。
通过让超类保存所有公共代码,您只需编写一次并随时运行它。