2016-01-05 1 views
0

Я пытаюсь сравнить данные таблицы с использованием графического пользовательского интерфейса с использованием графического пользовательского интерфейса, поэтому я использовал JavaFX и создал приложение, могу получить данные пользователя из форм и выполнить его в бэкэнд и получить набор результатов, но Я не могу напечатать результирующий набор на вкладке ResultSet приложения Я пробовал используемые методы here и просматривал несколько других вопросов о стеке, но, поскольку я новичок в JFX, я не могу получить, как печатать в результате устанавливается на сценуJavaFX, отображающий набор результатов в существующем табличном представлении

enter image description here

FXML:

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.lang.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 

<TabPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="800.0" prefWidth="1100.0" tabClosingPolicy="UNAVAILABLE" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.40" 
fx:controller="application.Controller"> 
<tabs> 
<Tab text="Query Tab"> 
    <content> 
    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0"> 
      <children> 
       <TextArea layoutX="34.0" layoutY="143.0" prefHeight="506.0" prefWidth="360.0" promptText="Hive Query" fx:id="HiveQuery" /> 
       <TextArea layoutX="506.0" layoutY="141.0" prefHeight="508.0" prefWidth="384.0" promptText="Oracle Query" fx:id="OracleQuery" /> 
       <TextField layoutX="34.0" layoutY="27.0" promptText="Hive Server Name" fx:id="HiveServerName" /> 
       <TextField layoutX="34.0" layoutY="79.0" promptText="Hive Username" fx:id="HiveUserName" /> 
       <PasswordField layoutX="204.0" layoutY="79.0" promptText="Hive Password" fx:id="HivePassword" /> 
       <PasswordField layoutX="698.0" layoutY="79.0" promptText="Oracle Password" fx:id="OraclePassword" /> 
       <TextField layoutX="521.0" layoutY="79.0" promptText="Oracle Username" fx:id="OracleUserName" /> 
       <TextField layoutX="521.0" layoutY="27.0" promptText="Oracle HostName" fx:id="OracleHostName" /> 
       <Button layoutX="420.0" layoutY="666.0" mnemonicParsing="false" text="Compare" fx:id="CompareButton" onAction="#CompareDataSets" /> 
      </children></AnchorPane> 
    </content> 
</Tab> 
<Tab text="Result Set"> 
    <content> 
    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0"> 
      <children> 
       <TableView layoutX="8.0" layoutY="19.0" prefHeight="671.0" prefWidth="433.0"> 
       <columns> 
        <TableColumn prefWidth="75.0" text="C1" /> 
        <TableColumn prefWidth="75.0" text="C2" /> 
       </columns> 
       </TableView> 
       <TableView layoutX="463.0" layoutY="19.0" prefHeight="671.0" prefWidth="448.0"> 
       <columns> 
        <TableColumn prefWidth="75.0" text="C1" /> 
        <TableColumn prefWidth="75.0" text="C2" /> 
       </columns> 
       </TableView> 
      </children></AnchorPane> 
    </content> 
</Tab> 

+0

Можете ли вы показать, что вы пытались отобразить ваши данные? Код, который вы отправили, - это всего лишь макет. –

+0

@James_D: Да, по ссылке, упомянутой выше, я создал отдельный класс и передал значения входа в один класс, который возвращает набор результатов из oracle и hive ... Однако вместо этого на этой вкладке открывается новый этап/окно (таблица может иметь любое количество столбцов) – Vinod

+0

Я предполагаю, что мне нужно указать id в виде таблицы в fxml и использовать это в контроллере, но поскольку моя таблица не имеет фиксированных столбцов, я не совсем уверен, как это сделать – Vinod

ответ

1

Следуя примеру вы связаны с выше вы можете выполнять ту же логику, с небольшими ухищрений .... Первое имя вашего Tableview в FXML, а во-вторых, удалить столбцы, чтобы у вас был только tableView.

<Tab text="Result Set"> 
    <content> 
    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0"> 
      <children> 
       <TableView fx:id="tableView" layoutX="8.0" layoutY="19.0" prefHeight="671.0" prefWidth="433.0"> 
       <columns> 
       </columns> 
       </TableView> 
       ...... 
      </children></AnchorPane> 
    </content> 
</Tab> 

Затем обновите ваш контроллер:

//Name your table view in your FXML file and wire it like this. 
@FXML 
private TableView tableview; 

//Then in your method where you process the data you can add columns dynamically.... 
     /********************************** 
     * TABLE COLUMN ADDED DYNAMICALLY * 
     **********************************/ 
     for(int i=0 ; i<rs.getMetaData().getColumnCount(); i++){ 
      //We are using non property style for making dynamic table 
      final int j = i;     
      TableColumn col = new TableColumn(rs.getMetaData().getColumnName(i+1)); 
      col.setCellValueFactory(new Callback<CellDataFeatures<ObservableList,String>,ObservableValue<String>>(){      
       public ObservableValue<String> call(CellDataFeatures<ObservableList, String> param) {                        
        return new SimpleStringProperty(param.getValue().get(j).toString());       
       }      
      }); 

      tableview.getColumns().addAll(col); 
      System.out.println("Column ["+i+"] "); 
     } 

//Etc.... 

Это, как вы можете добавить столбцы динамически в Tableview выложенный в FXML.

+0

сейчас я способный видеть заголовки таблиц в нужном месте, но теперь есть две проблемы: 1. Все столбцы не печатаются, tableview не становится прокручиваемым, если я увеличиваю размер окна и запускаю еще больше столбцов. 2. После того, как заголовки строки не печатаются NPE это бросить: Попытка сравнить данные .... Колонка [0] ... Колонка [21] Row [1] добавлен [100777073, NULL, NULL, Y, ...] Исключение в потоке "JavaFX Application Thread" java.lang.NullPointerException \t в application.Controller $ 1.call (Controller.java:86) \t в application.Controller $ 1.call (Controller.java: 1) – Vinod

+0

возвращает новый SimpleStringProperty (param.getValue(). Get (j) .toString()); является 86-й строкой в ​​контроллере – Vinod

+0

Проверьте, чтобы возвращаемое значение не было нулевым. Возможно, что-то вроде if (param.getValue(). get (j) .toString())! = null then return new SimpleStringProperty (. param.getValue() получаем (к) .ToString()); else возвращает SimpleStringProperty (""); Еще один трюк, который я узнал, - заставить таблицу перерисовать, если что-то не отображается правильно. Иногда мне приходилось устанавливать столбец невидимым, а затем снова видимым. tableColumn.setVisible (ложь); tableColumn.setVisible (истина); Это может исправить проблему визуального отображения. –

Смежные вопросы