автоматически изменяет размер TableColumn TableColumn в TableView с JavaFX -8 - PullRequest
0 голосов
/ 21 января 2020

Когда я генерирую таблицу в JavaFX, столбцы слишком велики, и я хочу изменить их размер, когда он появляется в моем приложении, чтобы уменьшить их. Я прочитал те статьи о stackOverflow, которые полезны, но они мне не помогли: столбец javafx в табличном представлении размер файла ; JavaFX TableColumn изменить размер для соответствия содержимому ячейки . Действительно, в отличие от темы, у меня есть столбцы в моих столбцах, и это не работает. Для информации эти столбцы реагируют одинаково: если мы дважды щелкнем по ним, они автоматически изменят размер. Я пытался воспроизвести эти решения следующим образом:

    import java.lang.reflect.InvocationTargetException; 
    import java.lang.reflect.Method; import java.util.List; 
    import java.util.stream.Collectors;   
    import com.sun.javafx.scene.control.skin.TableViewSkin;
    import javafx.collections.ListChangeListener; 
    import javafx.collections.ObservableList; 
    import javafx.scene.control.TableColumn; 
    import javafx.scene.control.TableView;

public class GUIUtils {     
       private static Method columnToFitMethod;

       static {         
            try {           
               columnToFitMethod = TableViewSkin.class.getDeclaredMethod("resizeColumnToFitContent",TableColumn.class,int.class);
            columnToFitMethod.setAccessible(true);      
            } catch (NoSuchMethodException e) {             
                e.printStackTrace();        
            }   
        }

       public static <S> void autoFitTable(TableView<S> tableView) {         
            tableView.getItems().addListener(new ListChangeListener<Object>() {
                  @Override             
                  public void onChanged(Change<?> c) {
                        for (TableColumn column : tableView.getColumns()) {
                            try {
                                List<TableColumn<S, ?>> columns = (List<TableColumn<S, ?>>) column.getColumns.stream().collect(Collectors.toList());
                                for (TableColumn col : columns) {
                                    columnToFitMethod.invoke(tableView.getSkin(), col, -1);
                                }
                                columnToFitMethod.invoke(tableView.getSkin(), column, -1);
                            } catch (IllegalAccessException | InvocationTargetException e) {
                                e.printStackTrace();
                            }
                        }           
                  }         
           });  
       } 
}

Во время моей второй итерации для дочернего столбца у меня было:

java .lang.reflect.InvocationTargetException на солнце. отражать. refle.Method.invoke (Метод. java: 498) в myPackage.GUIUtils $ 1.onChanged (GUIUtils. java: 37). , , Вызывается: java .lang.NullPointerException в com.sun.javafx.scene.control.skin.TableViewSkin.resizeColumnToFitContent (TableViewSkin. java: 257) ... еще 80

Do у вас есть представление о том, что я могу сделать? Спасибо за вашу помощь

1 Ответ

0 голосов
/ 22 января 2020

Для тех, кто заинтересован, мое решение работает, но некоторые из моих столбцов не видны, и поэтому у меня есть исключение. Просто поставьте if (col.isVisible ()), и это нормально!

...