2016-11-09 1 views
0

У меня есть этот простой код:JavaFX просмотр таблицы строк цвет

import javafx.application.Application; 
import javafx.beans.property.BooleanProperty; 
import javafx.beans.property.SimpleBooleanProperty; 
import javafx.beans.property.SimpleObjectProperty; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableRow; 
import javafx.scene.control.TableView; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

public class Example extends Application 
{ 
    @Override 
    public void start(Stage stage) throws Exception 
    { 
     TableView<Integer> table = new TableView<>(); 

     TableColumn<Integer, Integer> column = new TableColumn<>(); 
     column.setCellValueFactory(param -> new SimpleObjectProperty<>(param.getValue())); 
     ObservableList<Integer> items = FXCollections.observableArrayList(); 
     table.getColumns().add(column); 
     table.setItems(items); 
     table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); 

     for (int i = 0; i < 500; i++) 
      items.add((int) (Math.random() * 500)); 

     BooleanProperty disable = new SimpleBooleanProperty(); 

     table.setRowFactory(param -> 
     { 
      TableRow<Integer> row = new TableRow<>(); 

      row.disableProperty().bind(disable); 

      row.disableProperty().addListener((observable, oldValue, newValue) -> 
      { 
       if (newValue) 
        row.setStyle("-fx-background-color: red"); 
       else 
        row.setStyle(""); 
      }); 

      return row; 
     }); 

     Button button = new Button("Disable all rows"); 
     button.setOnAction(event -> disable.set(true)); 

     stage.setScene(new Scene(new VBox(table, button))); 
     stage.show(); 
    } 

    public static void main(String[] args) 
    { 
     launch(args); 
    } 
} 

Когда я запускаю его и нажмите на кнопку, он должен окрасить все строки. Он работает, пока вы не прокрутите стол вниз. Затем происходит что-то странное, некоторые строки не будут яркими, и когда вы прокрутите назад, они будут красочными, а некоторые другие не будут.

Но когда вы сначала прокручиваете и затем нажимаете кнопку, все будет хорошо. Я понятия не имею, что там происходит, мне кажется, что это ошибка.

В исходном коде мне нужно отключить несколько строк, потому что мне нужно отключить таблицу. Тем не менее, это не сработает, даже если мы переключим свойство disable на редактируемое свойство.

У кого-нибудь есть идея, как исправить это и почему он не работает?

ответ

1

При прокрутке таблице может потребоваться создать еще несколько строк. Если строки создаются после нажатия кнопки, вы начинаете , а свойство disable присваивает новой строке логическое свойство, которое вы создаете (поэтому для свойства отключения строки установлено значение true), затем вы регистрируете слушателя с помощью строки отключить свойство, которое изменяет стиль. Поскольку свойство disable строки никогда не изменяется после регистрации слушателя, оно никогда не вызывается, и стиль никогда не изменяется.

Вы можете сделать

table.setRowFactory(param -> 
    { 
     TableRow<Integer> row = new TableRow<>(); 

     row.disableProperty().addListener((observable, oldValue, newValue) -> 
     { 
      if (newValue) 
       row.setStyle("-fx-background-color: red"); 
      else 
       row.setStyle(""); 
     }); 

     row.disableProperty().bind(disable); 

     return row; 
    }); 

или вы можете просто использовать привязку непосредственно:

table.setRowFactory(param -> 
    { 
     TableRow<Integer> row = new TableRow<>(); 

     row.styleProperty().bind(Bindings 
      .when(disable) 
      .then("-fx-background-color: red;") 
      .otherwise("")); 

     row.disableProperty().bind(disable); 

     return row; 
    }); 

или вы можете использовать внешнюю таблицу стилей с

.table-row-cell:disabled { 
    -fx-background-color:red ; 
} 

и опустить слушателя/привязка для стиля целиком:

table.setRowFactory(param -> 
{ 
    TableRow<Integer> row = new TableRow<>(); 

    row.disableProperty().bind(disable); 

    return row; 
});