Ссылка на JTable из другого класса - PullRequest
0 голосов
/ 29 января 2020

Java newb ie здесь. Я использую NetBeans 11.2. Я делаю GUI AWT приложение, у меня есть основной класс в качестве JFrame, и мне нужно сослаться на JTable на него или его модель из другого класса.

Чтобы не перегружать этот пост большим количеством кода, я создал крошечный проект из учебника на Oracle сайте . По сути, это проект с именем "CelciusConverterProject", JFrame с именем "Celciusconverter GUI" в качестве основного класса в пакете "learn". Затем я положил jTable1 на фрейм и добавил геттер в Celciusconverter GUI для табличной модели с именем "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();
     }

}

Пока ошибок нет, панель Navigator показывает getMdl как публикацию c method.

Теперь я создал новый класс под названием «Testing», но не могу понять, как вызвать getMdl () из запущенного экземпляра JFrame:

package learn;

import javax.swing.table.DefaultTableModel;

public class Testing {

     tmdl = (DefaultTableModel) <...>

}

Ни то, ни другое

 tmdl = new (DefaultTableModel) learn.CelsiusConverterGUI.

, ни

 tmdl = (DefaultTableModel) learn.CelsiusConverterGUI.

показывает мне мой получатель в окне завершения кода.

Вероятно, совершенно неопрятный sh вопрос, но извините, я могу ' даже Google, кто задал тот же вопрос.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

Я добавляю другой ответ, потому что теперь у нас есть лучшее определение вопроса.

Вы хотите получить ссылку на объект CelsuisConverter GUI, который вы создали; чтобы сделать это, вам нужно присвоить результат создания экземпляра класса переменной, а затем каким-то образом получить эту ссылку. Ниже приведен пример, который я даже не скомпилировал, но должен быть близок - в нем есть переменная stati c, которая сохраняет (единственную) ссылку на основной класс и создает экземпляр класса в первый раз, когда получатель получает экземпляр используется:

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();
  // ...
}
0 голосов
/ 29 января 2020

Вы говорите, что «... делаете Java awt приложение ...», но вы используете классы Swing. AWT - это библиотека Java UI, а Swing - это другая библиотека Java UI, в которой все еще используются некоторые компоненты AWT. Но я думаю, что более полезно и точнее сказать, что вы пишете приложение Java Swing.

Ваш метод getMdl() возвращает DefaultTableModel - нужно ли возвращать что-то, что указывает c? Особенно когда вы только начинаете, будет проще, если вы сможете работать с существующими библиотеками без приведения больше, чем нужно. Метод JTable.getModel() возвращает TableModel, интерфейс (https://docs.oracle.com/javase/7/docs/api/javax/swing/table/TableModel.html), который гарантирует, что любой возвращаемый объект будет реализовывать все методы в интерфейсе. Поэтому, если вам не нужно вызывать метод, который находится в DefaultTableModel, а не в TableModel, вы можете исключить приведение к DefaultTableModel ((DefaultTableModel), которое вы имеете в нескольких местах.

It Возможно, завершение кода сбито с толку этим преобразованием - если бы вы на самом деле пытались привести CelsiusConverterGUI к DefaultTableModel, то он не показал бы вам метод getMdl(), потому что его нет в DefaultTableModel. Я знаю, что вы, вероятно, пытались привести значение getMdl() к DefaultTableModel, но логика завершения кода c может не осознавать этого.

Поэтому я рекомендую получить getMdl() return TableModel и исключите все приведения к DefaultTableModel. Я думаю, что ваше завершение кода покажет вам getMdl() в вашем классе `CelsiusConverter GUI '.

Еще одна вещь: Java соглашение требует написание слов в названиях вещей: большинство Java программистов будут использовать и ожидать getModel() вместо getMdl().

...