简体   繁体   English

摇摆动作听众不会听我的

[英]Swing action listener won't listen to me

I am trying to add a GUI for my java client but I am banging my head against the wall once again. 我正在尝试为我的Java客户端添加GUI,但是我又一次把头撞到了墙上。 What I am trying to do is send a command to my MySQL server when I click a JButton(the Shifts button) but I get an exception ("Unknown command!") that I created when anything different than the numbers 0, 1-4 is sent. 我想做的是,当我单击JButton(Shifts按钮)时将命令发送到MySQL服务器,但遇到一个不同于数字0、1-4的异常(“未知命令!”)已发送。 Without using the GUI it was working with keyboard input(scanner, etc.). 在不使用GUI的情况下,它只能使用键盘输入(扫描仪等)。 Now I am trying to pass static arguments but it seems that they can't be read properly. 现在,我尝试传递静态参数,但似乎无法正确读取它们。 I will be glad if anyone could help. 如果有人可以帮助,我将感到高兴。 Here's the code 这是代码

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ConnectException;
import java.net.Socket;
import java.util.Scanner;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;


public class AirlinesClient extends JFrame implements Runnable {
    JPanel Shifts;
    JButton shButt;
    JPanel AirplanesFood;
    JButton afButt;
    JPanel Pilots;
    JButton pButt;
    JPanel Schedule;
    JButton sButt;
    public static String contact;
    public AirlinesClient(){
        setTitle("Airlines");
        setSize(300,290);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }
    private void Schedule(){
        this.Schedule = new JPanel();
        Schedule.setLayout(null);
        this.getContentPane().add(Schedule);
    }

    private void ScheduleButton(JPanel SchedulePanel){
        this.sButt = new JButton("Check schedules");
        this.sButt.setBounds(75, 10, 150, 50);
        SchedulePanel.add(this.sButt);
    }

    private void Pilots(){
        this.Pilots = new JPanel();
        Pilots.setLayout(null);
        this.getContentPane().add(Pilots);
    }
    private void PilotsButton(JPanel PilotsPanel){
        this.pButt = new JButton ("Check pilots' shifts");
        this.pButt.setBounds(75, 70, 150, 50);
        PilotsPanel.add(this.pButt);
    }

    private void AirplanesFood(){
        this.AirplanesFood = new JPanel();
        AirplanesFood.setLayout(null);
        this.getContentPane().add(AirplanesFood);
    }

    private void AirplanesButton(JPanel afPanel){
        this.afButt = new JButton ("Airplanes and Food");
        this.afButt.setBounds(75, 130, 150, 50);
        afPanel.add(this.afButt);

    }

    private void Shifts(){
        this.Shifts = new JPanel();
        Shifts.setLayout(null);
        this.getContentPane().add(Shifts);
    }

    private void ShiftsButton(JPanel ShiftsPanel){
        this.shButt = new JButton ("Possible shift changes");
        this.shButt.setBounds(75, 190, 150, 50);
        shButt.addActionListener(new ActionListener() {
              public void actionPerformed(ActionEvent event) {
                  contact = "1";
              }
            });
            this.shButt.setToolTipText("Check wheter shift changes are possible");
        ShiftsPanel.add(this.shButt);
    }


    public static void main(String[] args) {
        SwingUtilities.invokeLater(new AirlinesClient());
        Socket connection = null;
        BufferedReader socketIn = null;
        PrintWriter socketOut = null;
        int port = 1234;
        String host = "localhost";
        Scanner keyIn = new Scanner(System.in);
        try{
            try{
            connection = new Socket(host,port);
            socketIn = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            socketOut = new PrintWriter(connection.getOutputStream(),true);
        }catch(ConnectException e){
            System.out.println("Could not connect to the host!");
            return;
        }
        System.out.println("Successfully connected to the server!");
        String command;
        command = AirlinesClient.contact;
        do{
            socketOut.flush();
            socketOut.println(command);
            String breakline;

            while (!(breakline =socketIn.readLine()).equals("$$$")){
                System.out.println(breakline);
            }

        }while((command = keyIn.nextLine())!="0");


        System.out.println("Closing connection to server!");

    }catch(IOException e){
        e.printStackTrace();
    } finally{
           try{
               if(socketIn!=null) socketIn.close();
               if(socketOut!=null) socketOut.close();
               if(connection!=null) connection.close();
             }
             catch(IOException e){
               System.err.println("Socket could not be closed!");
             }
           }

    }
    public void run() {
        this.Schedule();
        this.ScheduleButton(this.Schedule);
        this.setVisible(true);
        this.Pilots();
        this.PilotsButton(this.Pilots);
        this.setVisible(true);
        this.AirplanesFood();
        this.AirplanesButton(this.AirplanesFood);
        this.setVisible(true);
        this.Shifts();
        this.ShiftsButton(this.Shifts);
        this.setVisible(true);

    }


}

I would be glad if you could also tell me a way to print the information I should receive from the server(as a string) into a new text field(placed in a new JFrame). 如果您也可以告诉我一种将应该从服务器接收的信息(作为字符串)打印到新的文本字段(放置在新的JFrame中)的方法,我将非常高兴。 Here's what's on the server side: 这是服务器端的内容:

 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Date; import java.util.Scanner; public class Airlines { public static void main(String[] args) { ServerSocket serverSocket = null; Socket connection = null; int port = 1234; try{ serverSocket = new ServerSocket(port); while ((connection = serverSocket.accept())!=null){ System.out.println("Client connected!"); Thread client = new Thread (new AirlinesThread(connection)); client.start(); } }catch (IOException e){ System.out.println("Binding unsuccesful..."); } } } class AirlinesThread implements Runnable{ Socket connection = null; public AirlinesThread (Socket connection){ this.connection = connection; } private static Connection connect(String url, String user, String password){ Connection result = null; try{ result = DriverManager.getConnection(url, user, password); System.out.println("Database connection successful!"); } catch(SQLException e){ System.out.println("Could not connect to the database!"); } return result; } String url = "jdbc:mysql://localhost:3306/Airlines"; String user = "root"; String pass = "123456"; Connection link = AirlinesThread.connect(url, user, pass); Statement stmt = null; ResultSet resultSet = null; public void run() { PrintWriter socketOut = null; Scanner socketIn = null; try{ socketOut = new PrintWriter(this.connection.getOutputStream(),true); socketIn = new Scanner(new BufferedReader(new InputStreamReader(this.connection.getInputStream()))); String command; socketOut.flush(); loop:do{ socketOut.flush(); command = socketIn.nextLine(); switch (command){ case "1": try{ stmt = link.createStatement(); resultSet = stmt.executeQuery("select Flight.id, Flight.Date, Flight.Time, Flight.Total_Flight_Time, Airports.Departure, Airports.Arrivals FROM Flight, Airports WHERE Flight.id = Airports.Flight"); socketOut.flush(); socketOut.println("FlightID\\tDate\\t\\tTime\\t\\tTotal Time\\tDeparture\\tArrivals"); while (resultSet.next()) { socketOut.println(resultSet.getString("Flight.id")+"\\t\\t"+resultSet.getDate("Flight.Date")+"\\t"+resultSet.getString("Flight.Time")+"\\t"+resultSet.getString("Flight.Total_Flight_Time")+"\\t\\t"+resultSet.getString("Airports.Departure")+"\\t\\t"+resultSet.getString("Airports.Arrivals")); } } catch(SQLException e){ System.out.println("Something went wrong at 1"); } socketOut.flush(); socketOut.println("\\nSelect from the options below:\\n1: Check schedules\\n2: Check pilots shifts\\n3: Check corresponding airplanes and food offered\\n4: Possible pilot shift changes\\n0: Exit"); socketOut.flush(); socketOut.println("$$$"); break; case "2": try{ stmt = link.createStatement(); resultSet = stmt.executeQuery("select Flight.id, Flight.Date, Flight.Time, Pilots.First_Name, Pilots.Last_Name from Flight RIGHT JOIN Pilots ON Flight.id = Pilots.FlightID;"); socketOut.flush(); socketOut.println("FlightID\\tDate\\t\\tTime\\t\\tFirst Name\\tLast Name"); while (resultSet.next()) { socketOut.flush(); socketOut.println(resultSet.getString("Flight.id")+"\\t\\t"+resultSet.getDate("Flight.Date")+"\\t"+resultSet.getString("Flight.Time")+"\\t"+resultSet.getString("Pilots.First_Name")+"\\t\\t"+resultSet.getString("Pilots.Last_Name")); } } catch(SQLException e){ System.out.println("Something went wrong at 2"); } socketOut.flush(); socketOut.println("\\nSelect from the options below:\\n1: Check schedules\\n2: Check pilots shifts\\n3: Check corresponding airplanes and food offered\\n4: Possible pilot shift changes\\n0: Exit"); socketOut.flush(); socketOut.println("$$$"); break; case "3": String FlightID; socketOut.flush(); socketOut.println("Select your Flight ID: "); socketOut.println("$$$"); command = socketIn.nextLine(); FlightID = command; try{ stmt = link.createStatement(); resultSet = stmt.executeQuery("SELECT Airplanes.Plane_Model, Food.Breakfast, Food.Lunch, Food.Dinner FROM Airplanes JOIN Flight ON Airplanes.FlightID = Flight.id JOIN Food ON Flight.id = Food.FlightID WHERE Flight.id = "+FlightID+";"); if(!resultSet.isBeforeFirst()){ socketOut.flush(); socketOut.println("You've entered wrong FlightID!"); } while (resultSet.next()) { socketOut.flush(); socketOut.println(resultSet.getString("Airplanes.Plane_Model")+"\\t\\t"+resultSet.getString("Food.Breakfast")+"\\t\\t"+resultSet.getString("Food.Lunch")+"\\t\\t"+resultSet.getString("Food.Dinner")); } } catch(SQLException e){ System.out.println("Something went wrong at 3"); } socketOut.flush(); socketOut.println("\\nSelect from the options below:\\n1: Check schedules\\n2: Check pilots shifts\\n3: Check corresponding airplanes and food offered\\n4: Possible pilot shift changes\\n0: Exit"); socketOut.flush(); socketOut.println("$$$"); break; case "4": String FirstName=null; String LastName=null; Date date1 = new Date(); Date date2 = new Date(); socketOut.flush(); socketOut.println("Please enter the First name of the pilot to be replaced: "); socketOut.println("$$$"); command = socketIn.nextLine(); FirstName = command; socketOut.flush(); socketOut.println("Please enter the Last name of the pilot to be replaced: "); socketOut.println("$$$"); command = socketIn.nextLine(); LastName = command; String FirstName1=null; String LastName1=null; socketOut.flush(); socketOut.println("Please enter the First name of the pilot to take the shift: "); socketOut.println("$$$"); command = socketIn.nextLine(); FirstName1 = command; socketOut.flush(); socketOut.println("Please enter the Last name of the pilot to take the shift: "); socketOut.println("$$$"); command = socketIn.nextLine(); LastName1 = command; int id1 = 0; int id2 = 0; try{ stmt = link.createStatement(); resultSet = stmt.executeQuery("Select Flight.Date, Pilots.First_Name, Pilots.Last_name, Pilots.FlightID FROM Flight, Pilots WHERE Flight.id=Pilots.FlightID and Pilots.First_Name="+"\\""+FirstName+"\\""+"and Pilots.Last_Name="+"\\""+LastName+"\\""+";"); if(!resultSet.isBeforeFirst()){ socketOut.flush(); socketOut.println("You've entered a wrong name!"); } while (resultSet.next()) { date1 = resultSet.getDate("Flight.Date"); id1 = resultSet.getShort("Pilots.FlightID"); } resultSet = stmt.executeQuery("Select Flight.Date, Pilots.First_Name, Pilots.Last_name, Pilots.FlightID FROM Flight, Pilots WHERE Flight.id=Pilots.FlightID and Pilots.First_Name="+"\\""+FirstName1+"\\""+"and Pilots.Last_Name="+"\\""+LastName1+"\\""+";"); if(!resultSet.isBeforeFirst()){ socketOut.flush(); socketOut.println("You've entered another wrong name!"); } while (resultSet.next()) { date2 = resultSet.getDate("Flight.Date"); id2 = resultSet.getShort("Pilots.FlightID"); if (date1.equals(date2)){ socketOut.flush(); socketOut.println("Both pilots have a flight at the same date or are on the same flight."); socketOut.println(FirstName+" "+LastName+"is on flight "+id1+", "+FirstName1+" "+LastName1+"is on flight "+id2+"."); } else { socketOut.flush(); socketOut.println(FirstName+" "+LastName+" can be replaced by "+FirstName1+" "+LastName1+"."); } } } catch(SQLException e){ System.out.println("Something went wrong at 4"); } socketOut.flush(); socketOut.println("\\nSelect from the options below:\\n1: Check schedules\\n2: Check pilots shifts\\n3: Check corresponding airplanes and food offered\\n4: Possible pilot shift changes\\n0: Exit"); socketOut.flush(); socketOut.println("$$$"); break; case "0" : socketOut.flush(); socketOut.println("Exitting..."); break loop; default: System.out.println("Unknown command!"); socketOut.println("Unknown command!"); socketOut.println("$$$"); break; } }while(command!="0"); System.out.println("Closing connection to the client!"); }catch (IOException e){ e.printStackTrace(); }finally{ try{ if (socketIn!=null) socketIn.close(); if (socketOut!=null) socketOut.close(); if (connection!=null) connection.close(); System.out.println("Connection to server closed!"); } catch(IOException e){ System.err.println("Could not close connection!"); } } try{ if(stmt != null) stmt.close(); if(resultSet != null) resultSet.close(); if(link != null) link.close(); System.out.println("Database connection closed successfully!"); }catch(SQLException ex){ System.out.println("Could not close connection to the database!"); } } } 

So far I managed to send text to the Server and get a console answer from it but my problem now is that I can't add anything else than this "Schedule" button. 到目前为止,我设法将文本发送到服务器并从中获取控制台答案,但是现在的问题是,除了此“计划”按钮之外,我无法添加其他任何内容。 Whatever I try to add is not visible or it replaces the button. 我尝试添加的所有内容均不可见或替换了按钮。 Any ideas? 有任何想法吗?

 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.JTextField; public class AirlinesClient extends JFrame implements ActionListener { public static BufferedReader socketIn = null; public static PrintWriter socketOut = null; public static Socket connection = null; public static String breakline; public static String command; private static void initGUI() throws UnknownHostException, IOException{ JFrame mainFrame = new JFrame("Airlines Client"); JPanel schPanel = new JPanel(); JButton Schedules = new JButton ("Flight Schedules"); JTextField schedArea = new JTextField("HI",20); //mainFrame mainFrame.setSize(300, 400); mainFrame.setLocationByPlatform(true); mainFrame.setDefaultCloseOperation(EXIT_ON_CLOSE); mainFrame.setVisible(true); //adding ScheduleButton's panel to the root frame schPanel.setLayout(null); mainFrame.getContentPane().add(schPanel); //Adding Schedule button Schedules.setBounds(75, 10, 150, 50); Schedules.setVisible(true); schPanel.add(Schedules); //Adding action on click Schedules.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { socketOut.println("1"); } }); } public static void main(String[] args) throws UnknownHostException, IOException { initGUI(); int port = 1234; String host = "localhost"; connection = new Socket(host,port); socketIn = new BufferedReader(new InputStreamReader(connection.getInputStream())); socketOut = new PrintWriter(connection.getOutputStream(),true); try{ System.out.println("Successfully connected to the server!"); do{ while (!(breakline =socketIn.readLine()).equals("$$$")){ System.out.println(breakline); } }while(command!="0"); System.out.println("Closing connection to server!"); }catch(IOException e){ e.printStackTrace(); } finally{ try{ if(socketIn!=null) socketIn.close(); if(socketOut!=null) socketOut.close(); if(connection!=null) connection.close(); } catch(IOException e){ System.err.println("Socket could not be closed!"); } } } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub } } 

You're likely repeatedly sending out in your socketOut null since you're getting extracting contact from your AirlinesClient only once, at the beginning of the program, when its null, and then are repeatedly sending it over the socket. 你很可能会反复在你socketOut发出了null ,因为你要提取contact从AirlinesClient只有一次,在节目的开始,当它空,然后被重复发送过来的插座。

Again, I'd change the entire code's structure: 同样,我将更改整个代码的结构:

  • Make contact a non-static variable 使接触成为非静态变量
  • Pass the Socket into the GUI 将套接字传递到GUI
  • Call println on the Socket only when needed -- here in the button's ActionListener. 仅在需要时在套接字上调用println -在此按钮的ActionListener中。
  • Read from the Socket in a SwingWorker background thread, and publish the results to the GUI using the SwingWorker's publish/process method pair. 在SwingWorker后台线程中从Socket中读取,并使用SwingWorker的发布/处理方法对将结果发布到GUI。

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

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