java JavaFX - 如何更改所选未聚焦行的 TableView 颜色?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/32456926/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
JavaFX - How to change TableView color of selected unfocused row?
提问by Markus Paul
No matter what i do - the color of the row keeps unchanged and has a greyish color. The changes only work for when the TableView is in focus.
无论我做什么 - 行的颜色保持不变并且呈灰色。这些更改仅适用于 TableView 处于焦点时。
I have tried every other suggestion i found online, for example a solution from another thread:
我已经尝试了我在网上找到的所有其他建议,例如来自另一个线程的解决方案:
.table-row-cell:selected { -fx-background-color: red; }
.table-row-cell:selected { -fx-background-color: red; }
Nothing seems to work and affect the rows when not in focus.
当不聚焦时,似乎没有任何工作并影响行。
回答by aw-think
Problem
问题
You want to change the color of the selection bar for a focused and unfocused state of TableView
您想为 TableView 的聚焦和非聚焦状态更改选择栏的颜色
Solution
解决方案
There is a -fx-selection-bar
and -fx-selection-bar-non-focused
definition in modena.css(default JavaFX style sheet). Both of them are in a section called Theming. So they are meant to be part of a changeable "global" theme. If you change them for the whole application, it will not only change the way TableView will color the selection, it will change even Menu's, List's etc. So you should be aware of it.
在modena.css(默认 JavaFX 样式表)中有一个-fx-selection-bar
and-fx-selection-bar-non-focused
定义。它们都在名为Theming的部分中。因此,它们旨在成为多变的“全球”主题的一部分。如果你为整个应用程序改变它们,它不仅会改变 TableView 为选择着色的方式,它甚至会改变菜单、列表等。所以你应该意识到这一点。
But from your comments above it should be clear, that you try to add the style by calling the method .setStyle() on the TableView instance. If you doing that, changing the color by this boths attributes will result in changing only the color of the TableView selection bar.
但是从您上面的评论中可以清楚地看出,您尝试通过在 TableView 实例上调用 .setStyle() 方法来添加样式。如果这样做,通过这两个属性更改颜色将导致仅更改 TableView 选择栏的颜色。
An Minimal, Complete, and Verifiable examplecould look like the following code:
一个最小、完整且可验证的示例可能类似于以下代码:
TableRowColor.java
表格行颜色.java
package tablerowcolor;
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
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.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class TableRowColor extends Application {
@Override
public void start(Stage primaryStage) {
ObservableList<Person> persons
= FXCollections.observableArrayList(
new Person("Sir", "Tobey"),
new Person("Admiral", "von Schneider"),
new Person("Mr.", "Pommeroy"),
new Person("Mr.", "Winterbottom"));
TableView<Person> tableView = new TableView<>(persons);
tableView.
setStyle("-fx-selection-bar: red; -fx-selection-bar-non-focused: salmon;");
TableColumn<Person, String> firstNameCol = new TableColumn<>("First Name");
firstNameCol.setCellValueFactory(new PropertyValueFactory("firstName"));
TableColumn<Person, String> lastNameCol = new TableColumn<>("Last Name");
lastNameCol.setCellValueFactory(new PropertyValueFactory("lastName"));
tableView.getSelectionModel().clearAndSelect(0);
tableView.getColumns().setAll(firstNameCol, lastNameCol);
Button btn = new Button();
btn.setText("Focus me");
VBox root = new VBox();
root.getChildren().addAll(tableView, btn);
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Selection Row Color");
primaryStage.setScene(scene);
primaryStage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
launch(args);
}
public class Person {
private final StringProperty firstName
= new SimpleStringProperty(this, "firstName");
public void setFirstName(String value) {
firstNameProperty().set(value);
}
public String getFirstName() {
return firstNameProperty().get();
}
public StringProperty firstNameProperty() {
return firstName;
}
private final StringProperty lastName
= new SimpleStringProperty(this, "lastName");
;
public void setLastName(String value) {
lastNameProperty().set(value);
}
public String getLastName() {
return lastNameProperty().get();
}
public StringProperty lastNameProperty() {
return lastName;
}
public Person(String firstName, String lastName) {
this.firstName.set(firstName);
this.lastName.set(lastName);
}
}
}
Netbeans Project Structure
Netbeans 项目结构
The JavaFX Appliction Project in Netbeans should look like this:
Netbeans 中的 JavaFX 应用程序项目应如下所示:
Working Application
工作申请
The working application will look like this:
工作应用程序将如下所示:
Setting Style in Scene Builder
在场景生成器中设置样式
In Scene Builder you be able to set the same style to a TableView by open the Inspector, than Properties of the TableView and add the following to the style boxes:
在 Scene Builder 中,您可以通过打开 Inspector 来为 TableView 设置相同的样式,而不是 TableView 的 Properties 并将以下内容添加到样式框中: