2016-07-08 2 views
2

Фактически известная ошибка и сталь открыли отчет об ошибке для JavaFX, который вы можете найти here.Неверная ширина заголовка TableView при использовании TableView.CONSTRAINED_RESIZE_POLICY

описание:

Когда ColumnResizePolicy выставиться в CONSTRAINED_RESIZE_POLICY и таблице, данные, которые не соответствуют по высоте доступных Tableview (в вертикальной прокрутки видна), то заголовки имеют неправильную ширину - но только тогда, когда TableView не сфокусирован , Когда TableView получает фокус, заголовки получают правильную ширину.

Проблема в том, что мне действительно нужно это исправить, но я не могу найти обходного пути для этого.

Я пробовал:

refresh() и просто "прыгает", и в

otherGUIObject.requestFocus(); 
tableView.requestFocus(); //or getSelectionModel().Select(0)  
otherGUIObject.requestFocus(); 

также

tableView.setColumnResizePolicy(TableView.UNCONSTRAINED_RESIZE_POLICY); 
tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); 

Но ничего, кажется, работает. Есть какие-то идеи? Спасибо!

ответ

2

Вы на правильном пути: вы должны позвонить по номеру requestFocus() на номер TableView.

Проблема со следующим фрагментом (из вашего вопроса)

otherGUIObject.requestFocus(); 
tableView.requestFocus(); //or getSelectionModel().Select(0)  
otherGUIObject.requestFocus(); 

является то, что при вызове requestFocus(), то focusedProperty из Node установлен в true, как и ожидалось, но это не значит, что контроль фактически фокусируется на графическом интерфейсе (макет обновляется) - поскольку он обновляется только тогда, когда поток приложений JavaFX успевает его обновить. В фрагменте вы делаете три звонка requestFocus в строке: первые два будут оптимизированы, поэтому выполняется только последний (наиболее вероятно).

Решение заключается в вызове метода requestLayout на TableView после того, как фокус запрошен для обеспечения того, чтобы фокус также обновлялся в графическом интерфейсе. Впоследствии вы можете установить фокус на любом другом Node (в примере я использовал из Scene, чтобы получить то, что Node в настоящее время выбрано, а затем после фокусировки фокуса TableView я снова фокусирую Node).

Пример

// The current focus owner on the Scene 
Node focusOwner = scene.getFocusOwner(); 

table.requestFocus(); 
table.requestLayout(); 

// Request focus on the currently focused Node 
if(focusOwner != null) 
    focusOwner.requestFocus(); 
else 
    // request focus on any Node you want 
    textField.requestFocus(); 
+0

Великий ответ. Большое спасибо! –

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