2013-03-30 2 views
0

Я использую swing jFrame для создания графического интерфейса для моей системы бронирования клиент-сервер. Я столкнулся с проблемой на клиенте, где я хотел бы использовать DatagramSocket заявил в этом:Доступ к объекту DatagramSocket из кнопки Swing ActionPerformed

public BookingClientUI() throws SocketException { 
     DatagramSocket clientSocket = new DatagramSocket(9876); 
     initComponents(); 
     RecvPacket recvProcess = new RecvPacket(clientSocket); 
     Thread recvThread = new Thread(recvProcess); 
     recvThread.start(); 
} 

позже в этой кнопке ActionPerformed:

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {           
    try { 
     String passwordString = new String(passwordfield.getPassword()); 
     byte[] passwordBytes = passwordString.getBytes(); 
     byte[] packetData = new byte[1500]; 
     packetData = SendPacketHandler.packetConstructor(SendOpcodes.REGISTER_USER,usernamefield.getText(),EncryptionHandler.hashPassword(passwordBytes)); 
     DatagramPacket packet = new DatagramPacket(packetData,packetData.length,InetAddress.getByName("127.0.0.1"),9876); 
     clientSocket.send(packet); 
    } catch (NoSuchAlgorithmException | UnknownHostException | IOException ex) { 
     Logger.getLogger(BookingClientUI.class.getName()).log(Level.SEVERE, null, ex); 
    } 

}  

Очевидно, что линия:

 clientSocket.send(packet); 

имеет ошибку «не удается найти символ», поскольку объявленная DatagramSocket не входит в область видимости. Однако я не знаю, как это исправить, поскольку я только программировал на Java пару дней.

Любая помощь будет оценена по достоинству.

ответ

1

Вам просто нужно сохранить сокет в член данных класса, который позже доступен для обработчика кнопок. Вы недостаточно объяснили свою иерархию классов, чтобы сказать, как это сделать. Если обработчик кнопки находится внутри BookingClientUI, это просто. Вы будете иметь что-то вроде:

public BookingClientUI() extends JFrame { 

    final DatagramSocket clientSocket; 

    public BookingClientUI() throws SocketException { 
    // Initialize the data member with the open socket. 
    clientSocket = new DatagramSocket(9876); 
    initComponents(); 
    RecvPacket recvProcess = new RecvPacket(clientSocket); 
    Thread recvThread = new Thread(recvProcess); 
    recvThread.start(); 
    } 

    // Any member function can now use clientSocket, including a button action. 

} 

Во всем этом, не забывайте, что (почти) все свинг код должен выполняться в потоке пользовательского интерфейса.

Смежные вопросы