从另一个类引用JTable

问题描述 投票:0回答:2

这里是Java新手。我正在使用NetBeans 11.2。我正在制作一个GUI awt应用程序,我有一个作为JFrame的主类,我需要在它上面引用JTable或另一个类的模型。

为了不使本文过多地编写代码,我从教程on the Oracle site中创建了一个小项目。基本上,一个名为“ CelciusConverterProject”的项目,一个名为“ CelciusconverterGUI”的JFrame作为包“ learn”中的主类。然后,我将jTable1放到框架上,并向CelciusconverterGUI添加了用于名为“ getMdl()”的表模型的吸气剂:

package learn;

import javax.swing.table.DefaultTableModel;

public class CelsiusConverterGUI extends javax.swing.JFrame {

[...]

          /* Create and display the form */
          java.awt.EventQueue.invokeLater(new Runnable() {
               public void run() {
                    new CelsiusConverterGUI().setVisible(true);
               }
          });
     }

     // Variables declaration - do not modify                     
     private javax.swing.JScrollPane jScrollPane1;
     private javax.swing.JTable jTable1;
     // End of variables declaration                   

     public DefaultTableModel getMdl() {
          return (DefaultTableModel) this.jTable1.getModel();
     }

}

到目前为止没有错误,导航器窗格将getMdl显示为公共方法。

现在,我创建了一个名为“ Testing”的新类,但是我无法弄清楚如何从实例化的运行JFrame调用getMdl():

package learn;

import javax.swing.table.DefaultTableModel;

public class Testing {

     tmdl = (DefaultTableModel) <...>

}

都不

 tmdl = new (DefaultTableModel) learn.CelsiusConverterGUI.

也不

 tmdl = (DefaultTableModel) learn.CelsiusConverterGUI.

正在代码完成窗口中向我显示我的吸气剂。

可能完全是一个笨拙的问题,但是很抱歉,我什至无法向任何提出相同问题的人谷歌搜索。

java jtable
2个回答
0
投票

您说您正在“ ...正在制作Java awt应用...”,但是您正在使用Swing类。 AWT是Java UI库,而Swing是另一个Java UI库,仍然使用某些AWT组件。但是我认为说您正在编写Java Swing应用程序更有用和更准确。

您的getMdl()方法返回一个DefaultTableModel-是否需要返回特定的内容?尤其是在刚入门时,如果可以使用现有库而无需进行过多转换,则将变得更加简单。 JTable.getModel()方法返回TableModel,这是一个接口(https://docs.oracle.com/javase/7/docs/api/javax/swing/table/TableModel.html),该接口保证返回的任何对象都将实现该接口中的所有方法。因此,除非需要调用不在DefaultTableModel中且不在TableModel中的方法,否则可以消除对DefaultTableModel的转换(在几个地方都有(DefaultTableModel)

[代码转换很可能会被这种转换弄糊涂-实际上,如果您试图将CelsiusConverterGUI转换为DefaultTableModel,则不会显示getMdl()方法,因为该方法不存在在DefaultTableModel中。我知道您可能正在尝试将getMdl()的返回值强制转换为DefaultTableModel,但是代码完成逻辑可能无法意识到这一点。

因此,我的建议是让getMdl()返回TableModel,并消除对DefaultTableModel的所有投射。我认为您的代码完成后将在您的“ CelsiusConverterGUI”类中向您显示getMdl()

另外一件事:Java约定要求在事物名称中拼出单词;大多数Java程序员都会使用并期望使用getModel()而不是getMdl()


0
投票

我添加了另一个答案,因为我们现在对该问题有了更好的定义。

您想获得对您实例化的CelsuisConverterGUI对象的引用;为此,您需要将类的实例化结果分配给变量,然后以某种方式获取该引用。下面是一个我什至没有编译的示例,但是应该很接近-它有一个静态变量,该变量保留对主类的(唯一)引用,并在首次使用实例的getter时实例化该类:] >

public class CelsiusConverterGUI extends JFrame
{
  private static CelsiusConverterGUI mainFrame = null;
  public static getMainFrame() 
  { 
    if (mainFrame == null)
    {
      java.awt.EventQueue.invokeAndWait(new Runnable() { mainFrame = new CelsiusConverter(); }
    }
    return mainFrame; 
  }

  public static void main(String ... arguments)
  {
    java.awt.EventQueue.invokeLater(new Runnable()
    {
      mainFrame = getMainFrame();
      mainFrame.setVisible(true);
    }
  }

  // ...
}

public class Testing
{
  CelsiusConverterGUI mainFrame = CelsiusConverterGUI.getMainFrame();
  // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.