Java JComboBox 接受 ArrayList 但不显示 ArrayList 的项目

Java JComboBox takes in ArrayList but doesn't show items of ArrayList

我正在尝试用数据库中的记录填充组合框。在我的控制器中,我使用的是 MVC,而在我的模型中,我有一个方法 getAllRoutes(),它将数据库中的所有路由名称放入 ArrayList 中。此方法按预期工作,因为我在其中添加了一个 System.out.println() ,表明 ArrayList 确实填充了数据库值。

在我的控制器中,我创建了一个名为 "routes" 的新 ArrayList,并使用我放入 getAllRoutes() 方法的 return 中的 ArrayList 对其进行了初始化。这也有效,因为我添加了 System.out.println() 并打印出来。

在我的视图中,我创建了一个新的 JComboBox、一个新的 ArrayList comboBoxValues 和一个仅填充 ArrayList comboBoxValues 的新方法 setComboBoxValues()。回到控制器中,我调用 setComboBoxValues() 方法并用 "routes" ArrayList 填充它。

但由于某些原因,当我 运行 程序时,JComboBox 保持为空(见下图)。我做错了什么?

我的模特:

package main.java.models;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

import main.java.controllers.MapController;
import main.resources.ConnectionManager;

import javax.swing.*;

public class MapModel {
    List<String> coordinateList = new ArrayList<String>(); //deze moet naar fillCoordinateListArray

    public List<String> fillCoordinateListArray(int selected){
        try (Connection connection = ConnectionManager.getConnection()) {
            String query = "SELECT RouteLocationID, RouteLocations.RouteID, X, Y FROM RouteLocations WHERE RouteID = ?";
            PreparedStatement stmt = connection.prepareStatement(query);
            stmt.setInt(1, 1);
            ResultSet results = stmt.executeQuery();

            while (results.next()) {
                double X = results.getDouble(3);
                double Y = results.getDouble(4);
                coordinateList.add(X + "," + Y);
            }

        } catch (SQLException e) {
            System.out.println("Er is een fout opgetreden.");
            e.printStackTrace();
        }
        return coordinateList;
    } //method end

    public String parseCoordinates(){
        String text = "";
        for(int i = 0; i<coordinateList.size(); i++) {
            text+="&markers=label:" + (i+1) + "%7C" + coordinateList.get(i) + "%7C";

        }
        return text;
    } //method end

    public ArrayList getAllRoutes(){
        ArrayList<String> routeArrayList = new ArrayList<String>();
        try (Connection connection = ConnectionManager.getConnection()) {
            String query = "SELECT RouteID, RouteName FROM route";
            PreparedStatement stmt = connection.prepareStatement(query);
            ResultSet results = stmt.executeQuery();

            while (results.next()) {
                String routeName = results.getString(2);
                routeArrayList.add(routeName);

            }
        } catch (SQLException e) {
            System.out.println("Er is een fout opgetreden.");
            e.printStackTrace();
        }
        System.out.println(routeArrayList);
        return routeArrayList;
    } //method end


} //class end

我的控制器:

import main.app.view.MapView;
import main.java.models.MapModel;

import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import javax.imageio.ImageIO;
import javax.swing.*;

public class MapController {
    private MapView view;
    private MapModel model;

    public MapController(MapView view, MapModel model) {
        this.view = view;

        MapController.ListenerOfActions listener = new MapController.ListenerOfActions();
        view.addListenerOfActions(listener);
        this.model = model;
        this.model.getAllRoutes();

        ArrayList<String> routes = model.getAllRoutes();
        this.view.getRouteComboBox().getSelectedItem();
        this.view.setComboBoxValues(routes);
        System.out.println(routes);

        this.updateMap(1);
        this.view.setVisible(true);
    } //constructor end

    private void updateMap(int routeID){
        model.fillCoordinateListArray(routeID);
        Image image = null;
            try {
                URL url = new URL("https://maps.googleapis.com/maps/api/staticmap?" +
                        "&size=600x450" +
                        "&maptype=roadmap" +
                        this.model.parseCoordinates() +
                        //"San+Francisco,CA" + "%7C" +
                        //"&markers=label:1%7C40.702147,-74.015794" + "%7C" +

                        "&key=AIzaSyAbLM94WcbkB-cf_ubHXOHmCDSsNWEz7XE");
                image = ImageIO.read(url);
              //  System.out.print(url);
            } catch (IOException e) {
                System.out.println("Ongeldige URL");
                e.printStackTrace();
        }
        this.view.setImage(image);
        this.view.repaint();
    } //method end

    class ListenerOfActions implements ActionListener {
        int selected = 0;
        @Override
        public void actionPerformed(ActionEvent e) {

            String actionCommand = e.getActionCommand();
            if(actionCommand.equals("OK")) {
                int selected = view.getRouteComboBox().getSelectedIndex() + 1;
                System.out.println(selected);
                System.out.println("hallo");

                updateMap(selected);
            }

        }

        public int getSelected(){
            return this.selected;
        }


    } //class end
} //class end

我的看法:

package main.app.view;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.Border;


import main.java.models.MapModel;
import main.resources.ConnectionManager;

public class MapView extends JPanel {
    public Image image;
    private JLabel jlImage;
    private JLabel jlName;
    private static JButton jbOk;
    private ArrayList<String> comboBoxValues;
    private JComboBox routeComboBox = new JComboBox();
    //private JComboBox<ArrayList<>>;
    private ActionListener actionListener;

    public MapView(){
        super(new FlowLayout());
        setSize(900, 450);
        this.add(getRouteComboBox());
        jbOk = new JButton("OK");
        jbOk.setActionCommand("OK");
        jbOk.addActionListener(this.actionListener);
        add(jbOk);
       // comboBoxValues.toArray();
    } //constructor end

    public void setComboBoxValues(ArrayList<String> comboBoxValues) {
        this.comboBoxValues = comboBoxValues;
    }

    public void setImage(Image image){
        this.image = image;
    }


    public MapView getView(){
        jlImage = new JLabel(new ImageIcon(this.image));
        add(jlImage);
        return this;
    }

    public void addListenerOfActions(ActionListener listenForAction) {
        this.actionListener = listenForAction;
    }

    public JComboBox getRouteComboBox(){
        return routeComboBox;
    }

} //class end

空的 JComboBox 图片: enter image description here

In my View, I create a new JComboBox, a new ArrayList comboBoxValues and a new method setComboBoxValues() that just fills the ArrayList comboBoxValues.

所以你有一个包含数据的 ArrayList。

如何期望数据神奇地出现在组合框中?答案是不会。

您需要将数据从 ArrayList 复制到 setComboBoxValues(…) 方法中的组合框:

类似于:

for (String item: comboBoxValues)
{
    comboBox.addItem( item );
}

事实上,您甚至不需要视图中的 ArrayList class,因为数据将存储在组合框的模型中。

阅读 How to Use Combo Boxes Swing 教程中的基础部分。