Как получить доступ к значениям из автоматически созданных ярлыков? - PullRequest
0 голосов
/ 17 июня 2020

Здесь я получаю 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()));
            });
        });
    }
}

Ответы [ 2 ]

0 голосов
/ 29 июня 2020

Я решил проблему. Может, это не лучшее решение, но у меня работает. Я создал HashMap, где идентификатор продукта является ключом, а количество - значением.

Затем для кнопок добавления и удаления я просто заменяю значение для соответствующего ключа в 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);
    }
0 голосов
/ 17 июня 2020

Я бы, вероятно, добавил их в список и получил к ним доступ соответственно, я не уверен, что вам от них нужно, потому что вы нечетко, но взгляните на пример кода ниже

public class MySceneController {

    @FXML private ListView listView;
    private ArrayList<Label> labelList = new ArrayList<>();

    @FXML
    public void initialize()
    {
        populateListView();
    }

    public void populateListView()
    {
        ObservableList<Products> products = Logic.getProducts();

        products.forEach(prod -> {
            Label label = new Label(prod.getName());

            //Add them to a list here
            labelList.add(label);

            listView.getItems().addAll(results);
        });
    }


    public void doSomething()
    {
        for (Label label : labelList) {//Maybe iterate through the list depending on what you need
            //do something
        }
        //Here is where I need to access the label values
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...