2016-12-12 13 views
6

Zakładając, że JavaFX CSS nie obsługuje :enabled w oparciu o JavaFX 8 Oracle CSS Reference, w jaki sposób mogę wykonać poniższe czynności?JavaFX Zastosuj css do TableRows, tylko jeśli są one: włączone

Hover and Active only when not disabled


A TableView istnieje gdzie jestem stosowaniu pewnego rodzaju CSS:

.table-row-cell:hover { 
    -fx-background-color:orange; 
} 

.table-row-cell:focused { 
    -fx-background-color:purple; 
} 

chcę powyższego należy zrobić (tylko), gdy TableRow jest włączona.

Więc i zmodyfikował kod obejmujący :enabled elementu pseudo ale nic nie działa teraz:

.table-row-cell:hover:enabled { 
    -fx-background-color:orange; 
} 

.table-row-cell:focused:enabled { 
    -fx-background-color:purple; 
} 

Wreszcie niewielkimi pytania:

1) Jak mogę łączą : hover z : wyłączone lub : włącz ed?

->[ apply **:hover** only if the `Table-Row|Cell` is enabled. ] 

2) Czy JavaFX css obsługuje : włączone?


Ostatni, ale nie najmniej:

Po wykonaniu kilku testów na kodzie powyżej doszedłem do youtu.be/l7Pbz2l2wjE?t=138 ten wynik.

+0

Czy można umieścić kod tabeli? Spróbuję Ci pomóc ! –

+0

@Bo Halim Kod działa poprawnie. Wyobraź sobie, że jest to ten sam kod z samouczka JavaFX Oracle. Problemem jest css. Pierwsza część działa dobrze, ale gdy próbuję użyć pseudo klasy ': enabled' nie działa. Może dlatego, że nie jest obsługiwane. Ale nie wiem jak to zrobić, pytam o tytuł ... – GOXR3PLUS

+0

@Bo Halim Możesz użyć kodu z odpowiedzi tutaj, gdzie masz kilka wierszy wyłączonych, a niektóre włączone http://stackoverflow.com/questions/26607144/javafx-how-to-disable-a-row-in-a-tableview – GOXR3PLUS

Odpowiedz

1

Moje ostateczne rozwiązanie używając :disabled był poniżej:

Jak można wyraźnie zobaczyć wiersz może być focused ale no hovered a nawet selected nawet jeśli jest :disabled.


liczba Rozwiązanie 1 z :disabled (szybciej):

/* .table-row-cell */ 

.table-row-cell:disabled{ 
    -fx-opacity:0.5; 
} 

.table-row-cell .text{ 
    -fx-font-weight:bold; 
    -fx-fill: black ; 
} 

.table-row-cell:focused .text { 
    -fx-fill: white ; 
} 

.table-row-cell:focused{ 
    -fx-background-color:purple; 
} 

.table-row-cell:focused:disabled{ /* focused+disabled */ 
    -fx-background-color:blue; 
} 

.table-row-cell:hover{ 
    -fx-background-color:magenta; 
} 

liczba Rozwiązanie 2 w oparciu o odpowiedzi na Harshita Sethi używając pseudoclass:

PseudoClass enableRowClass = PseudoClass.getPseudoClass("enabled-row"); 

setRowFactory(tv -> { 
       TableRow<Media> row = new TableRow<>(); 

       // use EasyBind to access the valueProperty of the itemProperty 
       // of the cell: 
       row.disableProperty().bind(
         // start at itemProperty of row 
         EasyBind.select(row.itemProperty()) 
           // map to fileExistsProperty[a boolean] of item, if item 
           // non-null 
           .selectObject(Media::fileExistsProperty) 
           // map to BooleanBinding checking if false 
           .map(x -> x.booleanValue() == false) 
           // value to use if item was null 
           .orElse(false)); 

    //This line of code is the idea of the `Harshita Sethi` modified a little bit to not use a changelistener 
    row.pseudoClassStateChanged(enableRowClass, !row.disabledProperty().get()); 

    return row; 
}); 
  • I oczywiście .css (wspomnieć, że nie produkują dokładnie jako roztwór 1 bo to brakuje niektórych linii;):

    .table-row-cell:enabled-row:hover .table-cell { 
        -fx-background-color: purple; 
    
    } 
    
    .table-row-cell:enabled-row:focused .table-cell { 
        -fx-background-color: orange; 
    
    } 
    
2

I odwrócić swój pomysł, zamiast próbować dowiedzieć się kto jest enabled, dlaczego nie poszukać przeciwnie (co jest disabled) i zastosować stały styl, tak, że nie zmienia się, gdy kursor przechodzi granice:

 .table-row-cell{ 

    -fx-background-color:red; 

    } 

    .table-row-cell:disabled{ 

    -fx-background-color:red; //Here you can define a fixed style 
           // or similar to the normal state 

    } 

    .table-row-cell:focused:disabled .text{ 

     -fx-fill: red; // Here you define the color of the text 

    } 

    .table-row-cell:hover{ 

    -fx-background-color:blue; 

    } 

Mam nadzieję, że to ci pomoże i przepraszam, jeśli źle zrozumiałem!

+0

Dzięki za próbę, ale czego chcę, to: Wyobraź sobie ten kod tutaj '.table-row-cell: focused { -fx-background-color: purple; } 'chcę, aby to było stosowane tylko i tylko jeśli' TableRow' nie jest wyłączona. Kod, który podałeś, nie jest lub może pomaga, ale muszę napisać podwójną ilość kodu, aby go osiągnąć :), ale doceniam wysiłek. Zmieniłem to pytanie na prostsze ... – GOXR3PLUS

2

Można użyć javafx.css.PseudoClass zmienić stylizację poszczególnych rzędów. Poniżej przedstawiono przykład użycia PseudoClass. Kod

JavaFX

PseudoClass enableRowClass = PseudoClass.getPseudoClass("enabled-row"); 
// A row factory that returns a row that disables itself whenever the 
// item it displays has a value less than 5: 
table.setRowFactory(tv -> { 
    TableRow<Item> row = new TableRow<>(); 
    row.disableProperty().bind(
      Bindings.selectInteger(row.itemProperty(), "value") 
        .lessThan(5)); 


    row.itemProperty().addListener(new ChangeListener<Item>() { 
     @Override 
     public void changed(ObservableValue<? extends Item> observable, Item oldValue, Item newValue) { 
      try { 
       //Applying pseudoclass to only those rows which are enabled. 
       // The condition is the reverse of the condition used to disable a row. 
       row.pseudoClassStateChanged(enableRowClass, newValue.getValue() >= 5); 
      } catch (NullPointerException e) { 
      } 
     } 
    }); 
    return row; 
}); 

CSS:

.table-row-cell:enabled-row:hover .table-cell { 
    -fx-background-color: purple; 

} 

.table-row-cell:enabled-row:focused .table-cell { 
    -fx-background-color: orange; 

} 
+0

Dzięki za pomysł użyłem czegoś podobnego do stworzenia innego rodzaju rozwiązania;) – GOXR3PLUS

+0

Z przyjemnością pomogę :) –

+0

Odpowiedź, którą dodałem, to wykorzystanie twojego pomysłu bez 'ChangeListener'. – GOXR3PLUS

Powiązane problemy