2 回答

TA貢獻1845條經驗 獲得超8個贊
子節(jié)點按照它們添加的順序呈現(xiàn),因此以相反的順序添加它們就足夠了:
main_layout.getChildren().addAll(viewPane, menuPane, iconPane);

TA貢獻1884條經驗 獲得超4個贊
子節(jié)點按照它們在 children 中出現(xiàn)的順序呈現(xiàn)ObservableList。這意味著索引較高的孩子將呈現(xiàn)在較低索引的孩子之上。因此,示例中的其他節(jié)點覆蓋了陰影。由于您使用AnchorPane的是開發(fā)人員設置的絕對位置,因此一個簡單的解決方法是反轉子列表的順序(如VGR 所示)。
如果您使用的布局也根據(jù)子列表的順序定位其子級,則該解決方案將無法正常工作,例如HBox. 您可以通過設置適當?shù)姆g轉換來解決此問題,但不建議這樣做。相反,您可以設置viewOrder子項的屬性(在 JavaFX 9 中添加)。這個性質:
定義 thisNode在其父級中的渲染和選取順序。
此屬性用于更改其父節(jié)點中節(jié)點的呈現(xiàn)和選取順序,而無需重新排序父節(jié)點的子列表。例如,這可以用作實現(xiàn)透明度排序的更有效方式。為此,應用程序可以將viewOrder每個節(jié)點的值分配給該節(jié)點與查看器之間的計算距離。
children父級將按降序遍歷它viewOrder。這意味著一個較低的孩子viewOrder將在一個較高的孩子面前viewOrder。如果兩個孩子有相同的 ,則父母將按照它們在父母列表中viewOrder出現(xiàn)的順序遍歷它們。children
由于您希望先前的子級呈現(xiàn)在后續(xù)子級之上,您可以簡單地將 設置為列表viewOrder中的索引children。這是一個例子:
import java.util.stream.DoubleStream;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.effect.BlurType;
import javafx.scene.effect.DropShadow;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Region;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
HBox root = new HBox(createRegions(50.0, 200.0, 700.0));
root.setPadding(new Insets(0.0, 75.0, 0.0, 0.0));
for (int i = 0; i < root.getChildren().size(); i++) {
root.getChildren().get(i).setViewOrder(i);
}
primaryStage.setScene(new Scene(root));
primaryStage.setTitle("ViewOrder Example");
primaryStage.show();
}
private Region[] createRegions(double... prefWidths) {
return DoubleStream.of(prefWidths).mapToObj(prefWidth -> {
Region region = new Region();
region.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
region.setPrefSize(prefWidth, 600.0);
region.setMaxSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
region.setEffect(new DropShadow(BlurType.THREE_PASS_BOX, Color.BLACK, 10.0, 0.0, 6.0, 4.0));
region.setBackground(new Background(new BackgroundFill(Color.WHITE, null, null)));
return region;
}).toArray(Region[]::new);
}
}
您提到您嘗試的解決方案之一是設置孩子的 Z-Order,但它不起作用。為了設置z坐標工作,您必須在創(chuàng)建Scene. 您可以通過修改上面的示例來測試它:
更改setViewOrder(i)為setTranslateZ(i)。
更改new Scene(root)為new Scene(root, -1.0, -1.0, true)
這具有在 JavaFX 8 中工作的好處。
添加回答
舉報