首页 > 解决方案 > 如何从自动生成的标签中访问值?

问题描述

在这里,我收到一个ObservableList产品。然后为每个产品中的名称、价格和数量List创建一个Label。我还创建了两个按钮,用于添加和删除数量,更改标签中的值。我的问题出在“escolherProdutos()”方法中,我想在其中访问每个标签的值与数量相关,这样我就可以知道每个产品的请求数量,我似乎无法从外部访问这些值populateFlowPane()方法。这可能不是解决我的问题的最佳方法,而且我是初学者,所以如果您能帮助我解决我的问题,甚至有更好的方法,我将不胜感激。

public class EscolherProdutosController 
{
    @FXML private VBox nomesVBox;
    @FXML private VBox precoVBox;
    @FXML private VBox qtdsVBox;
    @FXML private Button escolherBtn;
    
    private static ArrayList<Label> quantidades = new ArrayList<>();
    
    @FXML
    public void initialize() 
    {
        populateFlowPane();
    }   
    
    public void populateFlowPane()
    {
        ObservableList<Produto> produtos = Logic.getProdutos();
        
        produtos.forEach(prod -> {
            HBox hbox = new HBox(5);
            
            Label nome = new Label(prod.getNome());
            Label preco = new Label(String.valueOf(prod.getPreco()));
            Button minus = new Button("-");
            minus.setMinSize(20, 20);
            Label qtd = new Label("0");
            Button plus = new Button("+");
            
            nomesVBox.getChildren().add(nome);
            precoVBox.getChildren().add(preco);
            
            hbox.getChildren().addAll(minus, qtd, plus);
            
            qtdsVBox.getChildren().add(hbox);
            
            //remover unidades do produto
            minus.setOnAction((ActionEvent e) -> {
                int quantidade = Integer.parseInt(qtd.getText());
                if(quantidade >= 1)
                {
                    quantidade--;
                    qtd.setText(String.valueOf(quantidade));
                }
            });
            
            //adicionar unidades do produto
            plus.setOnAction((ActionEvent e) -> {
                int quantidade = Integer.parseInt(qtd.getText());
                if(quantidade >= 0)
                {
                    quantidade++;
                    qtd.setText(String.valueOf(quantidade));
                }
            });
            
            quantidades.add(qtd);
        });
        
    }
    
    public void escolherProdutos()
    {
        ObservableList<Produto> produtos = Logic.getProdutos();
        produtos.forEach(prod -> {
            quantidades.forEach(qtd -> {
                Logic.escolherProdutos(prod.getIdProduto(),
                Integer.parseInt(qtd.getText()));
            });
        });
    }
}

标签: javajavafx

解决方案


我解决了这个问题。也许这不是最好的解决方案,但它对我有用。我所做的是创建一个HashMap产品 ID 是关键,数量是价值的地方。

然后对于添加和删除按钮,我只需替换HashMap. 这样做之后,我可以将其用作类中escolherProdutos()方法的输入Logic,以选择产品。

public class EscolherProdutosController 
{
    @FXML private VBox nomesVBox;
    @FXML private VBox precoVBox;
    @FXML private VBox qtdsVBox;
    
    private HashMap<BigDecimal, Integer> quantidades = new HashMap<>();

    
    
    @FXML
    public void initialize() 
    {
        populateFlowPane();
    }   
    
    public void populateFlowPane()
    {
        ObservableList<Produto> produtos = Logic.getProdutos();
        
        
        produtos.forEach(prod -> {
            HBox hbox = new HBox(5);
            
            Label nome = new Label(prod.getNome());
            Label preco = new Label(String.valueOf(prod.getPreco()));
            Button minus = new Button("-");
            minus.setMinSize(20, 20);
            Label qtd = new Label("0");
            Button plus = new Button("+");
            
            nomesVBox.getChildren().add(nome);
            precoVBox.getChildren().add(preco);
            
            hbox.getChildren().addAll(minus, qtd, plus);
            
            qtdsVBox.getChildren().add(hbox);
            
            //remover unidades do produto
            minus.setOnAction((ActionEvent e) -> {
                Integer quantidade = Integer.parseInt(qtd.getText());
                if(quantidade >= 1)
                {
                    quantidade--;
                    qtd.setText(String.valueOf(quantidade));
                    
                    if(quantidades.containsKey(prod.getIdProduto()))
                        quantidades.replace(prod.getIdProduto(), quantidade);
                    else
                        quantidades.put(prod.getIdProduto(), quantidade);
                }
            });
            
            //adicionar unidades do produto
            plus.setOnAction((ActionEvent e) -> {
                Integer quantidade = Integer.parseInt(qtd.getText());
                if(quantidade >= 0)
                {
                    quantidade++;
                    qtd.setText(String.valueOf(quantidade));
                    
                    if(quantidades.containsKey(prod.getIdProduto()))
                        quantidades.replace(prod.getIdProduto(), quantidade);
                    else
                        quantidades.put(prod.getIdProduto(), quantidade);
                }
            });
        });
        
    }
    
    public void escolherProdutos()
    {
        Logic.escolherProdutos(quantidades);
    }

推荐阅读