【问题标题】:Java ActionPerformed() method doesn't executeJava ActionPerformed() 方法不执行
【发布时间】:2020-05-24 21:52:54
【问题描述】:

我正在使用 MVC。在我的视图中 在我的视图中,我创建了一个名为 jbOk 的新按钮并执行了 jbOk.setActionCommand("OK")。在我的控制器的 actionPerformed() 中,我做了一个 if 语句:if(actionCommand.equals("OK")),那么它必须打印一些东西。这不打印。在 if 语句之外,我做了另一个 System.out.println() 也不会打印。

我做错了什么?

我的观点:

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;
        for (String item: comboBoxValues) {
            routeComboBox.addItem( item );
        }
    }

    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

我的控制器:

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(2);
        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("This doesn't print");

             //   updateMap(selected);
            }
            System.out.println("and even outside the if statement, this doesn't print");

        }

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


    } //class end
} //class end

我的模特:

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, selected);
            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

【问题讨论】:

    标签: java swing model-view-controller actionlistener


    【解决方案1】:

    截至目前,您的代码实际上并未引用您的 ListenerOfActions 类。如果您将 ListenerOfActions 类移动到您的 MapView 类中,您可以将其作为动作侦听器正确添加到您的 jbOK 按钮中。

    ListenerOfActions listener = new ListenerOfActions();
    jbOK.addActionListener(listener);
    

    jbOK.addActionListener(new ListenerOfActions());
    

    【讨论】:

    • 我知道将它放在视图中会更容易,但是如果我绝对必须将 ActionListener 保留在 Controller 中怎么办?可以删除 ListenerOfActions 类,这对我来说并不重要
    • @DeZaakVanDeP 你掉进了一个常见的陷阱——问你自己一个简单的问题——“为什么控制器需要知道视图是如何实现的?” - 答案是,它没有也不应该。相反,视图和控制器应该在彼此之间建立一个契约来说明数据是如何在它们之间传递的,这样,你可以使用任何实现了这个契约的视图。从interface 开始,它描述了视图期望控制器传递给它的信息(模型数据)以及控制器可以从视图订阅的事件
    • @DeZaakVanDeP 要对这个问题进行更长时间的讨论,你可以看看这个example - 还要记住,Swing 已经是 MVC 的一种形式,所以你可能会发现自己在与系统作斗争
    猜你喜欢
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多