我在一个JFrame中有一个方法(例如:Read()),现在我想在新的JFrame中使用相同的方法(例如:JFrame2)。我怎样才能做到这一点?

时间:2018-03-26 13:28:59

标签: java jframe

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文档和在这个网站上但似乎找不到解决我问题的方法。

提前感谢。

1 个答案:

答案 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) 因为这可以帮助你构建程序。

通过让超类保存所有公共代码,您只需编写一次并随时运行它。