从另一个类引用 JTable



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

为了不让这篇文章过多地加载大量代码,我从 Oracle 站点上的教程创建了一个小项目。基本上,一个名为"CelciusConverterProject"的项目,一个名为"CelciusconverterGUI"的JFrame作为包"learn"中的主类。然后我把一个jTable1放到框架上,并为名为"getMdl(("的表模型向CelciusconverterGUI添加一个getter:

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 显示为公共方法。

现在我已经创建了一个名为"测试"的新类,但是我不知道如何从实例化的运行JFrame调用getMdl((:

package learn;
import javax.swing.table.DefaultTableModel;
public class Testing {
tmdl = (DefaultTableModel) <...>
}

也不

tmdl = new (DefaultTableModel) learn.CelsiusConverterGUI.

也不

tmdl = (DefaultTableModel) learn.CelsiusConverterGUI.

在代码完成窗口中向我显示我的 getter。

可能是一个完全菜鸟的问题,但对不起,我什至无法谷歌任何问过同样问题的人。

你说你是"...制作一个 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()

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

您希望获取对实例化的 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();
// ...
}

最新更新