繁体   English   中英

如何将方法从另一个类连接到actionListener?

[英]How to connect method from another class to actionListener?

我正在尝试完成有关搜索图形的项目,其中从用户输入了函数之一(顶点和边)。

在另一个类中我已经有一个用于此的方法,但是现在我需要将其放入GUI中。

我已经尝试了许多教程,但是没有任何效果。 有人可以帮我,如何将getInputFromCommand方法转换为gui?

我已经尝试过将方法复制到GUI中,但是由于结果类型无效,“ return g”存在问题,我尝试仅调用该方法(我知道..愚蠢),但是它没有也不行。

package Process;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
 import java.util.Arrays;
import java.util.LinkedList;
import java.util.Scanner;

public class FindIslands {



String message = "";
int V;
LinkedList<Integer>[] adjListArray;
static LinkedList<String> nodeList = new LinkedList<String>();

// constructor
FindIslands(int V) {
    this.V = V;

    adjListArray = new LinkedList[V];

    for (int i = 0; i < V; i++) {
        adjListArray[i] = new LinkedList<Integer>();
    }
}

void addEdge(int src, int dest) {

    adjListArray[src].add(dest);
    adjListArray[dest].add(src);
}

void DFSUtil(int v, boolean[] visited) {
    visited[v] = true;
    message += getValue(v) + " ";
    //   System.out.print(getValue(v) + " ");

    for (int x : adjListArray[v]) {
        if (!visited[x]) {
            DFSUtil(x, visited);
        }
    }

}

void connectedComponents() {

    boolean[] visited = new boolean[V];
    int count = 0;
    message = "";
    for (int v = 0; v < V; ++v) {
        if (!visited[v]) {

            DFSUtil(v, visited);
            message += "\n";
            //     System.out.println();
            count++;
        }
    }

    System.out.println("" + count);
    System.out.println("");
    System.out.println("Vypis ostrovu: ");
    String W[] = message.split("\n");
    Arrays.sort(W, new java.util.Comparator<String>() {
        @Override
        public int compare(String s1, String s2) {
            // TODO: Argument validation (nullity, length)
            return s1.length() - s2.length();// comparison
        }
    });
    for (String string : W) {
        System.out.println(string);
    }

}

public static void main(String[] args) {


    FindIslands g = null; //
    String csvFile = "nodefile.txt";
    BufferedReader br = null;
    String line = "";
    int emptyLine = 0;
    try {
        br = new BufferedReader(new FileReader(csvFile));
        while ((line = br.readLine()) != null) {
            if (line.equals("")) {
                emptyLine = 1;
                //    System.out.println("found blank line");
            }
            if (emptyLine == 0) {
                // System.out.println(line);
                nodeList.add(line);
            } else if (line.isEmpty()) {
                g = new FindIslands(nodeList.size());
            } else {
                String[] temp = line.split(",");
                g.addEdge(getIndex(temp[0]), getIndex(temp[1]));
            }
        }
    } catch (FileNotFoundException e) {
        System.out.println("Soubor nenalezen, zadejte data v danem formatu");
        g = getInputFromCommand();

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (br != null) {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    System.out.println("Pocet ostrovu");
    if (g != null) {
        g.connectedComponents();


    }
}


public static int getIndex(String str) {
    return nodeList.indexOf(str);
}

public static String getValue(int index) {
    return nodeList.get(index);
}

public static FindIslands getInputFromCommand() {


    FindIslands g = null;
    BufferedReader br = null;
    String line = "";
    int emptyLine = 0;
    Scanner scanner = new Scanner(System.in);


    line = scanner.nextLine();
    while (!line.equals("")) {
        if (line.equals("--gui")) {
            Guicko gui = new Guicko();
            gui.setVisible(true);
        } else
            nodeList.add(line);
            line = scanner.nextLine();
        }
        g = new FindIslands(nodeList.size());
        line = scanner.nextLine();
        while (!line.equals("")) {
            String[] temp = line.split(",");
            if (temp.length != 2) {
                System.out.println("spatny format zadanych dat, prosim zkuste znovu");
            } else {
                g.addEdge(getIndex(temp[0]), getIndex(temp[1]));
            }

            line = scanner.nextLine();
        }
        return g;
    }

}

最后一个方法“ getInputFromCommand()”在哪里很重要

和...桂

package Process;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.util.Scanner;

public class Guicko extends JFrame {
private JButton štartButton;
private JPanel panel;
private JTextField textField2;
private JTextArea textArea1;


public Guicko() {
    add(panel);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setResizable(false);
    setTitle("Zadej hodnoty");

    setSize(500, 400);

    textField2.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            FindIslands.getInputFromCommand();
        }
    });

    štartButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            String str = "asd";
            FindIslands g = null;
            g.connectedComponents();
            textArea1.setText(str);
        }
    });



}



public static void main (String args[]){
    Guicko gui = new Guicko();
    gui.setVisible(true);
}

}

我敢肯定有很多正确的方法可以修复此代码,但是在恕我直言中,您的Guicko类需要具有FindIslands类成员,并且我认为您需要将某些内容从FindIslands.main()移至Guicko.main()或其他方法。

然后,您的“动作侦听器”内部类的actionPerformed方法仅委托给FindIslands成员实例中的方法,如下所示

....
private FindIslands fi;

public Guicko() {
    ....
    textField2.addActionListener(new ActionListener() { 
        @Override
        public void actionPerformed(ActionEvent e) {
            fi = FindIslands.getInputFromCommand();
        }
    });

    startButton.addActionListener(new ActionListener() { 
        @Override
        public void actionPerformed(ActionEvent e) {
            String comps = fi.connectedComponents();// method needs to return a string
            textArea1.setText(comps);
        }
    });
}

GUIdomain分开的整个想法是轻松进行更改。 GUI具有该domain知识,但是domain具有该GUI知识。 我们可以使用一个接口来分隔它们,在那种情况下, Domain说,我不在乎谁实现此接口,但是谁实现此接口都可以得到响应并可以与我一起工作。

因此,如果我们创建一个新的GUI ,则可以让它实现该接口,并且相同的domain将与该GUI

有很多错误,但是为了使它起作用并向您展示一个示例,我做了很少的更改。

public class Guicko extends JFrame implements PropertyChangeListener{
   private JButton štartButton;
   private JPanel panel;
   private JTextField textField2;
   private JTextArea textArea1;
   private FindIslands land;

   private JTextField textField;
   private JButton button;



public Guicko() {
    JPanel panel = new JPanel();
    super.getContentPane().setLayout(new GridLayout());

    //For each gui, there should be one land.
    this.setLand(new FindIslands(100));


    //Subscribe to the domain so that you can get update if something change in domain.
    this.getLand().subscribe(this);


    //Dummy buttons are fields(need too initiate first)
    textField2 = new JTextField("",30);
    štartButton = new JButton();
    textField = new JTextField("",30);
    button = new JButton();
    button.setPreferredSize(new Dimension(100, 40));
    button.setText("Get input from Domain");
    štartButton.setPreferredSize(new Dimension(100, 40));
    textField.setEditable(false);
    štartButton.setText("Start");
    panel.add(textField2);
    panel.add(štartButton);
    panel.add(textField);
    panel.add(button);



    add(panel);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setResizable(false);
    setTitle("Zadej hodnoty");

    setSize(500, 400);

    //When you type something in , then this function will send it to domain(i mean to function : getInputFromCommand();).
    this.addListerToField(štartButton,this.getLand(),textField2);


    //Now the second case, suppose you press a button and want something to show up in textfield. In that case , this function will do work.
    this.addListerToSecondField(button,this.getLand(),textField);

}



//Here i can catch the events from the domain.
@Override
public void propertyChange(PropertyChangeEvent e) {
    if(e.getPropertyName().equals("String changed")) {
        this.getTextField().setText((String) e.getNewValue());
    }
}





private void addListerToSecondField(JButton button, FindIslands land, JTextField field) {
    button.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            land.requireArgumentsForField();
        }

    });
}





private void addListerToField(JButton štartButton, FindIslands land, JTextField field) {
    štartButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                land.getInputFromCommand(field.getText());
            }
        });
}



public static void main (String args[]){
    Guicko gui = new Guicko();
    gui.setVisible(true);
 }



public FindIslands getLand() {
    return land;
}



public void setLand(FindIslands land) {
    this.land = land;
}






public JTextField getTextField() {
    return textField;
}





public void setTextField(JTextField textField) {
    this.textField = textField;
}





public JButton getButton() {
    return button;
}





public void setButton(JButton button) {
    this.button = button;
}

这是第二堂课。 运行它,并尝试感受它的工作原理。

 public class FindIslands {




String message = "";
int V;
LinkedList<Integer>[] adjListArray;
static LinkedList<String> nodeList = new LinkedList<String>();

// constructor
FindIslands(int V) {
    this.V = V;
    //initialize the list
    this.setListeners(new ArrayList<>());

    adjListArray = new LinkedList[V];

    for (int i = 0; i < V; i++) {
        adjListArray[i] = new LinkedList<Integer>();
    }
}

void addEdge(int src, int dest) {

    adjListArray[src].add(dest);
    adjListArray[dest].add(src);
}

void DFSUtil(int v, boolean[] visited) {
    visited[v] = true;
    message += getValue(v) + " ";
    //   System.out.print(getValue(v) + " ");

    for (int x : adjListArray[v]) {
        if (!visited[x]) {
            DFSUtil(x, visited);
        }
    }

}

void connectedComponents() {

    boolean[] visited = new boolean[V];
    int count = 0;
    message = "";
    for (int v = 0; v < V; ++v) {
        if (!visited[v]) {

            DFSUtil(v, visited);
            message += "\n";
            //     System.out.println();
            count++;
        }
    }

    System.out.println("" + count);
    System.out.println("");
    System.out.println("Vypis ostrovu: ");
    String W[] = message.split("\n");
    Arrays.sort(W, new java.util.Comparator<String>() {
        @Override
        public int compare(String s1, String s2) {
            // TODO: Argument validation (nullity, length)
            return s1.length() - s2.length();// comparison
        }
    });
    for (String string : W) {
        System.out.println(string);
    }

}

//You need only one main class, not two.----------------------------
/**
public static void main(String[] args) {

    FindIslands g = null; //
    String csvFile = "nodefile.txt";
    BufferedReader br = null;
    String line = "";
    int emptyLine = 0;
    try {
        br = new BufferedReader(new FileReader(csvFile));
        while ((line = br.readLine()) != null) {
            if (line.equals("")) {
                emptyLine = 1;
                //    System.out.println("found blank line");
            }
            if (emptyLine == 0) {
                // System.out.println(line);
                nodeList.add(line);
            } else if (line.isEmpty()) {
                g = new FindIslands(nodeList.size());
            } else {
                String[] temp = line.split(",");
                g.addEdge(getIndex(temp[0]), getIndex(temp[1]));
            }
        }
    } catch (FileNotFoundException e) {
        System.out.println("Soubor nenalezen, zadejte data v danem formatu");
        g = getInputFromCommand();

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (br != null) {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    System.out.println("Pocet ostrovu");
    if (g != null) {
        g.connectedComponents();


    }
}
**/

public static int getIndex(String str) {
    return nodeList.indexOf(str);
}

public static String getValue(int index) {
    return nodeList.get(index);
}


//Static cases are to be avoided.This is the property of object not class.
public void getInputFromCommand(String string) {

    //Here you will recieve a string from the GUI and will be printed in command prompt.You can do whatever you want to do with it.
    System.out.println("Recieve string is " + string);



    //No idea what you are trying to do.
   /** FindIslands g = null;
    BufferedReader br = null;
    String line = "";
    int emptyLine = 0;
    Scanner scanner = new Scanner(System.in);

    line = scanner.nextLine();
    while (!line.equals("")) {
        if (line.equals("--gui")) {
            Guicko gui = new Guicko();
            gui.setVisible(true);
        } else
            nodeList.add(line);
            line = scanner.nextLine();
        }
        g = new FindIslands(nodeList.size());
        line = scanner.nextLine();
        while (!line.equals("")) {
            String[] temp = line.split(",");
            if (temp.length != 2) {
                System.out.println("spatny format zadanych dat, prosim zkuste znovu");
            } else {
                g.addEdge(getIndex(temp[0]), getIndex(temp[1]));
            }

            line = scanner.nextLine();
        }
        return line;**/
    }

//This function is triggered with second button and you can send data to gui as shown below.
public void requireArgumentsForField() {
    //Suppose i want to send following string.
    String name = "I don't know";
    this.getListeners().stream().forEach(e -> {
        //  I will catch this in view.
        e.propertyChange(new PropertyChangeEvent(this, "String changed", null, name));
    });
}

private ArrayList<PropertyChangeListener> listeners;


//Let the objects subscibe. You need this to publish the changes in domain.
public void subscribe(PropertyChangeListener listener) {
    this.getListeners().add(listener);
}



public ArrayList<PropertyChangeListener> getListeners() {
    return listeners;
}

public void setListeners(ArrayList<PropertyChangeListener> listeners) {
    this.listeners = listeners;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM