文本组合框工厂电话

时间:2019-06-06 06:39:29

标签: java javafx combobox

对于我在Java FX中的项目,我有一个字符串列表,我需要将它们添加到组合框中,要求仅其中一个(第一个)用红色上色。

我考虑过将字符串封装在Text中,并使用适当的setStyle(“ fx-text-fill:Color.xxx”)将其添加到组合框中。这需要一个setCellFactory()方法,但我不知道如何正确设置它。

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.layout.Pane;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.util.Callback;

public class Mainu extends Application 
{
    final ObservableList<Text> SAMPUNITFRONT = FXCollections.observableArrayList(
            new Text("complete"), new Text("seconds"), new Text("minutes"), new Text("hours"), new Text("days")); 
    @Override
    public void start(Stage stage) throws Exception 
    {
        ComboBox<Text> cb = new ComboBox<Text>();
        for(int j = 0; j < SAMPUNITFRONT.size(); j++) // cycle over the list and generate a line with dashing defined by list
            {
                Text text = SAMPUNITFRONT.get(j);
                if(text.getText().equals("complete"))
                    text.setStyle("-fx-text-fill: RED");
                else
                    text.setStyle("-fx-text-fill: BLACK");
                cb.getItems().add(text);
            }

        cb.setCellFactory(new Callback<ListView<Text>, ListCell<Text>>() 
        {
            @Override public ListCell<Text> call(ListView<Text> p) 
            {
                return new ListCell<Text>() 
                {
                    private final Text text;
                        { 
                            setContentDisplay(ContentDisplay.GRAPHIC_ONLY); 
                            text = new Text();
                        } // end Text
                    @Override protected void updateItem(Text item, boolean empty) 
                        {   
                            super.updateItem(item, empty);
                            if (item == null || empty) 
                                {   
                                    setGraphic(null);
                                }
                            else 
                                {
                                    text.setStyle(item.getStyle());
                                    setGraphic(text); 
                                    setItem(text);
                                }
                        }  // end updateItem()
                }; // end ListCell return
            }
        });

        cb.getSelectionModel().selectFirst();
        Pane root = new Pane();
        root.getChildren().add(cb);
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.show();
    }
    public static void main(String[] args) {launch(args);}
}

此刻,该组合的下拉列表为空。

2 个答案:

答案 0 :(得分:2)

这里有几个建议:

  • 请勿将Node类型用作项目类型。而是存储确定项中ListCell的外观所需的数据,并让ListCell实现处理其余部分。您可以简单地使用String作为项目类型,如果只应根据文本或索引进行着色,或者可以创建一个包含2个属性的类。
  • 请勿自行致电setItem。让ComboBox / ListView处理这个问题。
  • 对于Text,您需要使用-fx-fill css属性而不是-fx-text-fill。如果您使用text本身的ListCell属性,则后一种将起作用。
  • 如果您不使用ObservableList的功能,则创建一个没有意义。您可以简单地使用List的{​​{1}}和Arrays.asList而不是ObservableListFXCollections.observableArrayList
SAMPUNITFRONT

或者不使用final ObservableList<String> SAMPUNITFRONT = FXCollections.observableArrayList("complete", "seconds", "minutes", "hours", "days"); @Override public void start(Stage stage) throws Exception { ComboBox<String> cb = new ComboBox<String>(SAMPUNITFRONT); cb.setCellFactory(new Callback<ListView<String>, ListCell<String>>() { @Override public ListCell<String> call(ListView<String> p) { return new ListCell<String>() { private final Text text; { setContentDisplay(ContentDisplay.GRAPHIC_ONLY); text = new Text(); } @Override protected void updateItem(String item, boolean empty) { super.updateItem(item, empty); if (item == null || empty) { setGraphic(null); } else { text.setStyle(item.equals("complete") ? "-fx-fill: red" : "-fx-fill: black"); text.setText(item); setGraphic(text); } } }; } }); cb.getSelectionModel().selectFirst(); Pane root = new Pane(); root.getChildren().add(cb); Scene scene = new Scene(root); stage.setScene(scene); stage.show(); } 作为Text

graphic

答案 1 :(得分:0)

问题是您将样式设置为“文本”对象。尝试为单元格设置相同的样式。而且您不需要将字符串封装在Text中。 这是带有修复程序的代码:

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ListCell;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class Main extends Application
{
    final ObservableList<String> SAMPUNITFRONT = FXCollections.observableArrayList("complete", "seconds", "minutes", "hours", "days");

    @Override
    public void start(Stage stage)
    {
        ComboBox<String> cb = new ComboBox<>();

        cb.setCellFactory(cell -> new ListCell<String>()
        {
            @Override
            protected void updateItem(String item, boolean empty)
            {
                super.updateItem(item, empty);
                if (item == null || empty)
                {
                    setGraphic(null);
                    setText("");
                }
                else
                {
                    if (item.equals("complete"))
                    {
                        setStyle("-fx-text-fill: RED");
                    }
                    setText(item);
                }
            }
        });


        cb.getItems().addAll(SAMPUNITFRONT);
        cb.getSelectionModel().selectFirst();
        Pane root = new Pane();
        root.getChildren().add(cb);
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.show();
    }

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

结果:

enter image description here

希望我能对您有礼貌,能为您提供帮助。