这里是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 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();
// ...
}