我需要創建一個組合框,它可以在其串列視圖的末尾有一個按鈕。This list can have items added or removed and displays a scroll bar when the number of items is over 5. Also, this list view does not close itself when an item is selected.
如何在以下螢屏截圖中添加按鈕“新專案”?

這是源代碼:
helloApplication.java
package com.example.demo;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.io.IOException;
public class HelloApplication extends Application {
@Override
public void start(Stage stage) throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader(HelloApplication.class.getResource("hello-view.fxml"));
Scene scene = new Scene(fxmlLoader.load(), 320, 240);
stage.setTitle("Hello!");
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch();
}
}
HelloController.java
package com.example.demo;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ComboBox;
import javafx.scene.control.skin.ComboBoxListViewSkin;
import java.net.URL;
import java.util.ResourceBundle;
public class HelloController implements Initializable {
@FXML
private ComboBox<String> frequencyPlanComboBox;
@Override
public void initialize(URL pURL, ResourceBundle pResourceBundle) {
frequencyPlanComboBox.getItems()
.addAll("aaa", "bbb", "ccc");
ComboBoxListViewSkin<String> comboBoxListViewSkin = new ComboBoxListViewSkin<String>(frequencyPlanComboBox);
comboBoxListViewSkin.setHideOnClick(false);
frequencyPlanComboBox.setSkin(comboBoxListViewSkin);
}
}
你好-view.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>
<VBox alignment="CENTER" spacing="20.0" xmlns="http://javafx.com/javafx/null" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.example.demo.HelloController">
<padding>
<Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
</padding>
<Label fx:id="welcomeText" />
<ComboBox fx:id="frequencyPlanComboBox" prefWidth="150.0" visibleRowCount="5" />
</VBox>
uj5u.com熱心網友回復:
編輯版本:
正如評論中所指出的,OP 中的模型在串列視圖之外具有按鈕,因此無需滾動到串列視圖底部即可看到它。您可以通過創建一個覆寫該getPopupContent()方法的自定義皮膚來完成此操作:
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.geometry.Bounds;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ListCell;
import javafx.scene.control.skin.ComboBoxListViewSkin;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import java.net.URL;
import java.util.ResourceBundle;
public class HelloController implements Initializable {
@FXML
private ComboBox<String> frequencyPlanComboBox;
@Override
public void initialize(URL pURL, ResourceBundle pResourceBundle) {
for (int i = 1 ; i <=20 ;i ) {
frequencyPlanComboBox.getItems().add("Item " i);
}
ComboBoxListViewSkin<String> comboBoxListViewSkin = new ComboBoxListViewSkin<String>(frequencyPlanComboBox) {
private Button button = new Button("Add New");
private VBox pane = new VBox();
{
pane.setStyle("-fx-background-color: -fx-control-inner-background;");
}
@Override
public Node getPopupContent() {
Node defaultContent = super.getPopupContent();
defaultContent.setManaged(true);
pane.getChildren().setAll(defaultContent, button);
return pane ;
}
};
comboBoxListViewSkin.setHideOnClick(false);
frequencyPlanComboBox.setSkin(comboBoxListViewSkin);
}
}
這是原始解決方案,可能不太理想:
將空值添加到組合框專案串列的末尾,并使用自定義串列單元格顯示該值的按鈕。
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ListCell;
import javafx.scene.control.skin.ComboBoxListViewSkin;
import java.net.URL;
import java.util.ResourceBundle;
public class HelloController implements Initializable {
@FXML
private ComboBox<String> frequencyPlanComboBox;
@Override
public void initialize(URL pURL, ResourceBundle pResourceBundle) {
frequencyPlanComboBox.getItems()
.addAll("aaa", "bbb", "ccc", null);
ComboBoxListViewSkin<String> comboBoxListViewSkin = new ComboBoxListViewSkin<String>(frequencyPlanComboBox);
comboBoxListViewSkin.setHideOnClick(false);
frequencyPlanComboBox.setSkin(comboBoxListViewSkin);
frequencyPlanComboBox.setCellFactory(lv -> new ListCell<>() {
private Button button = new Button("Add New...");
{
button.setOnAction(e -> {
/*
Do something
*/
System.out.println("Button pressed");
});
}
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText("") ;
setGraphic(null);
} else if (item == null) {
setText("");
setGraphic(button);
} else {
setText(item);
setGraphic(null);
}
}
});
}
}
您可能想嘗試一下該單元格的樣式,因此它不會顯示為選中狀態。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/511549.html
