gpt4 book ai didi

JavaFX TitledPane 更改的标题背景在鼠标输入时重置

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:31:58 28 4
gpt4 key购买 nike

我需要在运行时根据一些传入值更改 TitledPane 标题背景,否则重置它。

我所有的 TitledPane 都在附加到场景的 CSS 上设置了样式。

换个背景没问题。问题是当鼠标在背景更改后进入标题时,背景因此被重置为 CSS 背景。


更改 TitledPane 标题背景的测试应用程序:

import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.TitledPane;
import javafx.scene.control.ToggleButton;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.Region;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class TitledPaneApplication extends Application {

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

@Override
public void start(Stage primaryStage) throws Exception {
final StackPane root = new StackPane();

final TitledPane titledPane = new TitledPane();
titledPane.setText("Title");
root.getChildren().add(titledPane);

final String titleBackgroundValue = "#00ff11";
final ToggleButton button = new ToggleButton("Change");
button.setOnAction(event -> {
boolean selected = button.isSelected();

final Node node = titledPane.lookup(".title");
if (selected) {
final Color color = Color.valueOf(titleBackgroundValue);
((Region) node).setBackground(new Background(new BackgroundFill(color, null, null)));
} else {
((Region) node).setBackground(null);
titledPane.applyCss();
}
});

button.setSelected(false);
titledPane.setContent(button);

final Scene scene = new Scene(root, 400, 400);
scene.getStylesheets().add(getClass().getResource("light.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.setTitle("TestApplication");
primaryStage.show();
}

}

场景 CSS light.css

.root {
-fx-base: rgb(240, 240, 240);
-fx-background: rgb(240, 240, 240);
-fx-border-color: rgb(220, 220, 220);

/* make controls (buttons, thumb, etc.) slightly lighter */
-fx-color: derive(-fx-base, 10%);

/* text fields and table rows background */
-fx-control-inner-background: rgb(248, 248, 248);
/* version of -fx-control-inner-background for alternative rows */
-fx-control-inner-background-alt: derive(-fx-control-inner-background, -2.5%);

/* text colors depending on background's brightness */
-fx-light-text-color: rgb(220, 220, 220);
-fx-mid-text-color: rgb(100, 100, 100);
-fx-dark-text-color: rgb(20, 20, 20);

/* A bright blue for highlighting/accenting objects. For example: selected
* text; selected items in menus, lists, trees, and tables; progress bars */
-fx-accent: rgb(0, 80, 100);

/* color of non-focused yet selected elements */
-fx-selection-bar-non-focused: rgb(50, 50, 50);

-fx-font-family: "Roboto"; /* "Segoe UI Semibold", "Roboto", "Monospaced" */
-fx-font-size: 1em;

-primary-border-color: rgb(220, 220, 220);
}

/* Fix derived prompt color for text fields */
.text-input {
-fx-prompt-text-fill: derive(-fx-control-inner-background, -50%);
}

/* Keep prompt invisible when focused (above color fix overrides it) */
.text-input:focused {
-fx-prompt-text-fill: transparent;
}

/* Fix scroll bar buttons arrows colors */
.scroll-bar > .increment-button > .increment-arrow,
.scroll-bar > .decrement-button > .decrement-arrow {
-fx-background-color: -fx-mark-highlight-color, rgb(220, 220, 220);
}

.scroll-bar > .increment-button:hover > .increment-arrow,
.scroll-bar > .decrement-button:hover > .decrement-arrow {
-fx-background-color: -fx-mark-highlight-color, rgb(240, 240, 240);
}

.scroll-bar > .increment-button:pressed > .increment-arrow,
.scroll-bar > .decrement-button:pressed > .decrement-arrow {
-fx-background-color: -fx-mark-highlight-color, rgb(255, 255, 255);
}

.text-field {
-fx-font-size: 10pt;
}

.combo-box {
-fx-font-size: 10pt;
}

/* ScrollPane style. */
.scroll-pane {
-fx-background-color: transparent;
}

.scroll-pane > .viewport {
-fx-background-color: transparent;
}

/* TabPane style. */
.tab-pane > .tab-header-area {
-fx-background-color: transparent;
}

/* TitledPane style. */
.titled-pane {
-fx-border-width: 1;
-fx-border-color: -primary-border-color;
-fx-effect: dropshadow(three-pass-box, rgba(0,0,0,0.15), 5, 0.0, 0, 1);
}

.titled-pane > .content {
-fx-border-width: 0;
}

.titled-pane .title .arrow-button {
visibility: false;
}

.titled-pane > .title {
-fx-background-color: -primary-border-color;
-fx-background-insets: 0;
-fx-background-radius: 0 0 0 0;
-fx-padding: 0.2em 0.2em 0.2em 0.2em;
}

.titled-pane > .title .text {
-fx-font-size: 10pt;
}

最佳答案

设置内联 CSS 样式优先于 css 文件中的样式。所以通过 setStyle 应用背景就可以了。

button.setOnAction(event -> {
final Node node = titledPane.lookup(".title");
if (button.isSelected()) {
node.setStyle("-fx-background-color:#00ff11;");
} else {
node.setStyle(null);
}
});

更新:但是,关于实际问题的更多细节。要理解这一点,首先需要知道.title 的背景在内部是如何定义的,hover 样式是如何设置的。

下面的 Modena.css 内部是 .title 背景的样式:

.titled-pane > .title {
-fx-background-color:
linear-gradient(to bottom,
derive(-fx-color,-15%) 95%,
derive(-fx-color,-25%) 100%
),
-fx-inner-border, -fx-body-color;
-fx-background-insets: 0, 1, 2;
-fx-background-radius: 3 3 0 0, 2 2 0 0, 1 1 0 0;
-fx-padding: 0.3333em 0.75em 0.3333em 0.75em; /* 4 9 4 9 */
}

.titled-pane > .title:hover {
-fx-color: -fx-hover-base;
}

如果您注意到实际背景来自 -fx-color、-fx-inner-border 和 -fx-body-color。然而,-fx-inner-border 和 -fx-body-color 确实再次派生自 -fx-color only。

-fx-inner-border: linear-gradient(to bottom,
ladder(
-fx-color,
derive(-fx-color,30%) 0%,
derive(-fx-color,20%) 40%,
derive(-fx-color,25%) 60%,
derive(-fx-color,55%) 80%,
derive(-fx-color,55%) 90%,
derive(-fx-color,75%) 100%
),
ladder(
-fx-color,
derive(-fx-color,20%) 0%,
derive(-fx-color,10%) 20%,
derive(-fx-color,5%) 40%,
derive(-fx-color,-2%) 60%,
derive(-fx-color,-5%) 100%
));

-fx-body-color: linear-gradient(to bottom,
ladder(
-fx-color,
derive(-fx-color,8%) 75%,
derive(-fx-color,10%) 80%
),
derive(-fx-color,-8%));

在 :hover 伪状态下,-fx-color 更改为 -fx-hover-base 并且背景相应更新。 这就是你的问题。您仅以编程方式设置默认背景。将鼠标悬停在 .title 上时,它仍会选择内部 CSS 文件样式(因为您还没有为悬停定义自定义样式)。

如果我们设法更新 -fx-color 属性,那么它将处理不同伪状态的相应 css 更新。

对于您的要求更正确的方法如下:这样您仍然可以获得内部定义的标题的漂亮渐变特征。

button.setOnAction(event -> {
final Node node = titledPane.lookup(".title");
if (button.isSelected()) {
node.setStyle("-fx-color:#00ff11;");
} else {
node.setStyle(null);
}
});

// In css file
.titled-pane > .title {
-fx-color: -primary-border-color;
-fx-background-insets: 0;
-fx-background-radius: 0 0 0 0;
-fx-padding: 0.2em 0.2em 0.2em 0.2em;
}

更新 2:

请在下面找到另一个 TitledPane 中的 TitledPane 示例。

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TitledPane;
import javafx.scene.control.ToggleButton;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import java.util.Set;

public class TitledPaneApplication extends Application {

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

@Override
public void start(Stage primaryStage) throws Exception {
final VBox root = new VBox();
root.setSpacing(10);

final TitledPane titledPane = new TitledPane();
titledPane.setText("Title");

final String titleBackgroundValue = "#00ff11";
final ToggleButton button = new ToggleButton("Change");
button.setOnAction(event -> {
final Set<Node> node = titledPane.lookupAll(".title");
if (button.isSelected()) {
node.forEach(n->n.setStyle("-fx-color:#00ff11;"));
} else {
node.forEach(n->n.setStyle(null));
}
});
button.setSelected(false);

VBox inner = new VBox();
inner.setSpacing(10);
inner.setPadding(new Insets(10));
final TitledPane innerTP = new TitledPane();
innerTP.setText("Inner Title");
inner.getChildren().addAll(new Label("Inner"),innerTP);
innerTP.setContent(new Button("Dummy Button"));

titledPane.setContent(inner);

root.getChildren().addAll(button,titledPane);
final Scene scene = new Scene(root, 400, 400);
scene.getStylesheets().add(getClass().getResource("light.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.setTitle("TestApplication");
primaryStage.show();
}
}

关于JavaFX TitledPane 更改的标题背景在鼠标输入时重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53083005/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com