【问题标题】:Change a precise item color in a listview in JAVAFX without changing all of them在 JAVAFX 的列表视图中更改精确的项目颜色而不更改所有项目颜色
【发布时间】:2021-06-18 11:01:26
【问题描述】:

我在论坛上看了很多主题,但不知道该怎么做。我真的需要你的帮助

基本上我有 4 个列表视图。

其中 3 个是静态的,在控制器初始化时预加载(其中的值始终相同)。它们包含字符串。 我的目标是单击 3 个不同列表视图中包含的任何项目(在初始化时预加载),并根据不重要的标准以某种颜色出现在第四个列表视图中(例如,我在这里选择了蓝色和红色)在这里。

事实是我的代码确实有效并且确实改变了第四个列表视图的颜色发生(我只想为一个精确的项目设置颜色,而不是为每个项目设置颜色)。 前 2 个名为 listevolview 和 listesolview 的静态列表视图:当您单击这 2 个列表视图中的任何项目时,相同的项目应该出现在名为 listeclairanceview 的第四个列表视图中,以红色显示。 第三个名为 listeexoview 的静态列表视图:当您单击此列表视图时,选定的项目应该以蓝色显示在第四个视图中。

总结新闻条目出现在listefrequenceview(第四个listview)中,颜色很好,但是前面的条目的颜色已经不是很好的颜色了(它们都是相同的颜色:最后一个条目的颜色)加载到第四个列表视图);

我在代码的末尾有我的例子。所以在这里当我点击第一个列表视图时没关系,因为它变成了红色 那么下一个项目是蓝色的,但第一个项目不再是红色了。 第三张图片也是同样的问题,一切都变红了。 顺便说一句,我没有把所有明显的方法都放在一个理解问题上。


import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.concurrent.FutureTask;

import com.sun.javafx.tk.Toolkit.Task;

import javafx.scene.canvas.GraphicsContext;
import javafx.application.Platform;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.canvas.Canvas;
//import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.Button;
import javafx.scene.control.Cell;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.MenuButton;
import javafx.scene.control.MenuItem;
import javafx.scene.control.RadioButton;
import javafx.scene.control.TextField;
import javafx.scene.control.ToggleButton;
import javafx.scene.control.ToggleGroup;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.util.Callback;
import java.net.Socket;
//import javafx.scene.canvas.Canvas;
public class SampleController implements Initializable{

     
        /**
     * 
     */
    
    
        


        
        
        
        
        
         @FXML
         private ListView<String> listefrequenceview;
         
         @FXML
         private ListView<String> listevolview;
         
         @FXML
         private ListView<String> listesolview;
         
         @FXML
         private ListView<String> listeexoview;
         
        private  InterfaceClairances interfaceclairance= new InterfaceClairances();
        
    
        private ToggleGroup toggglegroup= new ToggleGroup();
        
        
          @FXML
            private ToggleButton avion1;

            @FXML
            private ToggleButton avion2;

            @FXML
            private ToggleButton avion3;
         
         
         
            @FXML
          public  void clairancesol(MouseEvent arg0) {
                        
                
                        interfaceclairance.getObslisteclairancesfrequence().add(listesolview.getSelectionModel().getSelectedItem());
                        interfaceclairance.getListeclairancesfrequence().add(new Clairance(listesolview.getSelectionModel().getSelectedItem(),3));
                        //interfaceclairance.getListeclairancespilotesSOL().get(listesolview.getSelectionModel().getSelectedIndex()).setEtat(2);  // etat 2 : traitement en cours
                        //this.listefrequenceview.setItems(interfaceclairance.getObslisteclairancesfrequence());
                        this.listefrequenceview.getItems().add(listesolview.getSelectionModel().getSelectedItem());
                
            }
            
            @FXML
              public  void clairancevol(MouseEvent arg0) {
                            
                    
                            interfaceclairance.getObslisteclairancesfrequence().add(listevolview.getSelectionModel().getSelectedItem());
                            interfaceclairance.getListeclairancesfrequence().add(new Clairance(listevolview.getSelectionModel().getSelectedItem(),3));
                            //interfaceclairance.getListeclairancespilotesSOL().get(listevolview.getSelectionModel().getSelectedIndex()).setEtat(2);  // etat 2 : traitement en cours
                            //this.listefrequenceview.setItems(interfaceclairance.getObslisteclairancesfrequence());
                            this.listefrequenceview.getItems().add(listevolview.getSelectionModel().getSelectedItem());
                    
                }
            
            @FXML
              public  void clairanceexo(MouseEvent arg0) {
                            
                    
                            interfaceclairance.getObslisteclairancesfrequence().add(listeexoview.getSelectionModel().getSelectedItem());
                            interfaceclairance.getListeclairancesfrequence().add(new Clairance(listeexoview.getSelectionModel().getSelectedItem(),4));
                            //interfaceclairance.getListeclairancespilotesSOL().get(listeexoview.getSelectionModel().getSelectedIndex()).setEtat(2);  // etat 2 : traitement en cours(demande du pilote) etat 3: traité par le controleur(ou demande du controleur) etat 4: traité et collationné par le pilote etat 1: non traité. 
                            //listefrequenceview.setItems(interfaceclairance.getObslisteclairancesfrequence());
                            this.listefrequenceview.getItems().add(listeexoview.getSelectionModel().getSelectedItem());
                    
                }
         
        
        
            
            
            
        
        
    
    
        
    
              
               
               
            
        

        
        @Override
        public void initialize(URL arg0, ResourceBundle arg1) {
            // TODO Auto-generated method stub
            
               
            
              
              this.listesolview.getItems().addAll(interfaceclairance.getObslisteclairancespilotesSOL());
               
               this.listevolview.getItems().addAll(interfaceclairance.getObslisteclairancespilotesVOL());
               
               this.listeexoview.getItems().addAll(interfaceclairance.getObslisteclairancespilotesEXO());
               
               this.toggglegroup.getToggles().addAll(avion1,avion2,avion3);
               
               this.listefrequenceview.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {

                    @Override
                    public ListCell<String> call(ListView<String> p) {
                        return new ListCell<String>() {

                            @Override
                            protected void updateItem(String value, boolean empty) {
                                super.updateItem(value, empty);
                                
                                setText(empty ? "" : value);
                                
                                if (SampleController.this.interfaceclairance.getListeclairancesfrequence().get(SampleController.this.interfaceclairance.getListeclairancesfrequence().size()-1).getEtat()==3) {
                                   
                                   
                               
                                    
                                    setStyle( "-fx-text-fill: red;");
                             
                                }
                                else {
                                    
                                     setStyle("-fx-text-fill: skyblue;");
                                }
                               
                                    
                            }
                        };
                    }
                });
             
              
        }

}

public class InterfaceClairances {
     
    private ArrayList<Clairance> listeclairancespilotesSOL;
    
    private ArrayList<Clairance> listeclairancesfrequence;
    
    private ArrayList<Clairance> listeclairancespilotesVOL;
    
    private ArrayList<Clairance> listeclairancespilotesEXO;
    
    private ObservableList<String> obslisteclairancespilotesSOL=FXCollections.observableArrayList();
    
    private ObservableList<String> obslisteclairancespilotesVOL=FXCollections.observableArrayList();
    
    private ObservableList<String> obslisteclairancespilotesEXO=FXCollections.observableArrayList();
    
    private ObservableList<String> obslisteclairancesfrequence = FXCollections.observableArrayList();
    
public class Clairance {
    
    private String clairance;
    private int etat;


first:  https://i.stack.imgur.com/uEpK9.png
second: https://i.stack.imgur.com/FoQU1.png
third:  https://i.stack.imgur.com/mm8w5.png

【问题讨论】:

  • 请使用格式正确的minimal reproducible example 来更新您的问题,以证明问题所在。并且一定要阅读该链接,因为仅构建 MCVE 的过程可能会导致您的解决方案。
  • 如前所述:minimal reproducible example - 请注意M!并在代码格式化方面付出一些努力

标签: java listview javafx fxml


【解决方案1】:

您的 ListCell 实现一定有问题,但我无法准确判断是什么,因为我不了解您代码中的 if 条件。不过,这里有一个简单且有效的示例,可以帮助您找到错误:

view.fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.String?>
<?import javafx.collections.FXCollections?>
<?import javafx.scene.control.ListView?>
<?import javafx.scene.layout.HBox?>

<HBox xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1"
      fx:controller="org.example.Controller">
    <ListView fx:id="sourceListView1">
        <items>
            <FXCollections fx:factory="observableArrayList">
                <String fx:value="1.1"/>
                <String fx:value="1.2"/>
                <String fx:value="1.3"/>
            </FXCollections>
        </items>
    </ListView>
    <ListView fx:id="sourceListView2">
        <items>
            <FXCollections fx:factory="observableArrayList">
                <String fx:value="2.1"/>
                <String fx:value="2.2"/>
                <String fx:value="2.3"/>
            </FXCollections>
        </items>
    </ListView>
    <ListView fx:id="sourceListView3">
        <items>
            <FXCollections fx:factory="observableArrayList">
                <String fx:value="3.1"/>
                <String fx:value="3.2"/>
                <String fx:value="3.3"/>
            </FXCollections>
        </items>
    </ListView>
    <ListView fx:id="targetListView"/>
</HBox>

Controller.java:

package org.example;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.util.Callback;

import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

public class Controller implements Initializable {

    @FXML
    private ListView<String>
            sourceListView1, // your "listevolview" or volListView... (use lowerCamelCase-Notation)
            sourceListView2,
            sourceListView3;
    @FXML
    private ListView<Item>
            targetListView; // your "listeclairanceview" or clearanceListView

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {

        // Create a custom list cell for the target list view:
        targetListView.setCellFactory(new Callback<>() {
            @Override
            public ListCell<Item> call(ListView<Item> param) {
                return new ListCell<>() {
                    @Override
                    protected void updateItem(Item item, boolean empty) {
                        super.updateItem(item, empty);

                        if (item == null || empty) {
                            setText("");
                            setStyle("-fx-text-fill: -fx-text-base-color;");
                        } else {
                            setText(item.getText());

                            // Logic for setting the right color here:
                            if (item.getSource() == sourceListView1 || item.getSource() == sourceListView2)
                                setStyle("-fx-text-fill: blue;");
                            else
                                setStyle("-fx-text-fill: red;");
                        }
                    }
                };
            }
        });

        // Add item to the target list view when selection of a source list view changes:
        List<ListView<String>> sourceListViews = new ArrayList<>();
        sourceListViews.add(sourceListView1);
        sourceListViews.add(sourceListView2);
        sourceListViews.add(sourceListView3);
        sourceListViews.forEach(listView
                -> listView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue)
                -> targetListView.getItems().add(new Item(listView, newValue))));
    }
}

Item.java:

package org.example;

import javafx.scene.control.ListView;

/**
 * Item class for the target list view to have the information needed to be able to differentiate the source
 * and to be able to set the color accordingly.
 */
public class Item {

    private final ListView<String> // Here your distinction; Should better not be the control itself
            source;                // but maybe an enum type you can create.

    private final String text; // The String to be shown in the target list view.

    // Constructor:
    public Item(ListView<String> source, String text) {
        this.source = source;
        this.text = text;
    }

    // Getters:
    public ListView<String> getSource() {
        return source;
    }

    public String getText() {
        return text;
    }
}

App.java:

package org.example;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.io.IOException;


public class App extends Application {

    @Override
    public void start(Stage stage) throws IOException {
        FXMLLoader loader = new FXMLLoader(App.class.getResource("view.fxml"));
        Scene scene = new Scene(loader.load());
        stage.setScene(scene);
        stage.show();
    }

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

预览:

【讨论】:

  • 感谢您的帮助!!明天我会试试这个模型。
  • 其实你说得对,if条件有问题。我尝试了一个明显的if条件,效果很好。但我不知道为什么它不起作用。if条件正在尝试了解 clairance 的 int 参数(Etat)的状态,这是 listeclairancesfrequence 中最后添加的 clairance。这就是为什么我使用 size-1 来获取 list.SampleController.this.interfaceclairance.getListeclairancesfrequence 中的最后一个 clairance( ).get(SampleController.this.interfaceclairance.getListeclairancesfrequence().size()-1).getEtat()*** get()中的行是列表的索引
猜你喜欢
  • 2022-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多