• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

JAVA przesyłanie obiektu File pomiędzy JFrame

Object Storage Arubacloud
0 głosów
321 wizyt
pytanie zadane 5 grudnia 2016 w Java przez jaroslaw.slaby Początkujący (410 p.)

Dzień dobry,

Mam następujący problem. Otóż piszę sobie prosty czat LAN. Wpadłem na pomysł, że dobrym pomysłem byłoby zaimplementowanie możliwości przesyłania plików. Napisałem klasę ClientFrame, z która zawiera GUI klienta czatu oraz klasę SendFileFrame służącą do wybierania pliku do wysłania. Poniżej wklejam kod klasy ClientFrame:

package com.jarek.chat;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.net.Socket;

/**
 * Created by Jarek on 09.11.16.
 */
public class ClientFrame extends JFrame implements ActionListener{
    private JPanel panelMain;
    private JTextArea msgArea = new JTextArea(10, 32);
    private JTextField msgText = new JTextField();
    private JPanel btnPanel = new JPanel();
    private JButton msgSend = new JButton("Send message!");
    private JButton clearArea = new JButton("Clear message area!");
    private JButton fileSend = new JButton("Send file!");
    private File file;
    private Container container = getContentPane();
    private SendFileFrame sendFile;


    static Socket s;
    static DataInputStream dataInputStream;
    static DataOutputStream dataOutputStream;

    public ClientFrame() {

        msgArea.setEditable(false);
        msgArea.setWrapStyleWord(true);
        msgArea.setLineWrap(true);

        msgSend.addActionListener(this);
        clearArea.addActionListener(this);
        fileSend.addActionListener(this);

        container.add(new JScrollPane(msgArea), BorderLayout.CENTER);
        btnPanel.setLayout(new FlowLayout());
        btnPanel.setPreferredSize(new Dimension(200,200));
        btnPanel.add(msgSend, BorderLayout.NORTH);
        btnPanel.add(clearArea, BorderLayout.SOUTH);
        btnPanel.add(fileSend, BorderLayout.WEST);
        container.add(btnPanel, BorderLayout.EAST);
        container.add(msgText, BorderLayout.SOUTH);
        setTitle("Client");
        pack();
        setVisible(true);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                int choice = JOptionPane.showConfirmDialog(container, "Exit?", "Close CHAT",
                        JOptionPane.OK_OPTION);
                if (choice == JOptionPane.OK_OPTION)
                    System.exit(0); // do dopracowania
            }
        });

    }

    @Override
    public void actionPerformed(ActionEvent e) {

        if(e.getSource() == msgSend) {

            try {

                String msgOut;
                msgOut = msgText.getText().trim();
                dataOutputStream.writeUTF(msgOut);
                msgText.setText("");

            } catch (Exception i) {
                JOptionPane.showMessageDialog(this, "Send message error! Check your " +
                        "connection or if server is closed!", "Send error!", JOptionPane.ERROR_MESSAGE);
            }
        }
        else if(e.getSource() == clearArea) {

            msgArea.setText("");

        }
        else if(e.getSource() == fileSend) {

           sendFile = new SendFileFrame(this);
           msgArea.append("Loaded file: " + file.getName());

        }

    }

    private void listen()  {

        String msgIn = "";

        try {

            s = new Socket("127.0.0.1" , 1220);

            dataInputStream = new DataInputStream(s.getInputStream());
            dataOutputStream = new DataOutputStream(s.getOutputStream());

            while(msgIn!="exit") {

                msgIn = dataInputStream.readUTF();
                System.out.println(msgIn);
                msgArea.setText(msgArea.getText() + "\nServer: " + msgIn);
            }

        } catch (Exception e) {
            JOptionPane.showMessageDialog(this, "Receive message error! Check your " +
                "connection!", "Receive error!", JOptionPane.ERROR_MESSAGE);
            }

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            ClientFrame clientFrame = new ClientFrame();
            clientFrame.listen();
        });
    }

    public void setFile(File file) {
        this.file = file;
    }
}

Oraz SendFileFrame:

package com.jarek.chat;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;

/**
 * Created by jarek on 12/2/16.
 */
public class SendFileFrame extends JPanel implements ActionListener {


    private JPanel panelMain;
    private JFileChooser fileChooser;
    private JButton selectFile = new JButton("Select file to send!");
    private JButton sendFile = new JButton("Send choosed file!");
    private JButton cancel = new JButton("Cancel!");
    private JTextField fileName;
    private JTextField filePath;
    private JPanel main;
    public File file = null;
    private static JFrame frame = new JFrame("Choose file to send!");
    private ClientFrame clientFrame;


    private void showGUI() {

        fileName = new JTextField();
        fileName.setEditable(false);
        filePath = new JTextField();
        filePath.setEditable(false);
        fileChooser = new JFileChooser();
        fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
        selectFile.addActionListener(this);
        sendFile.addActionListener(this);
        cancel.addActionListener(this);
        panelMain = new JPanel();
        panelMain.add(selectFile);
        panelMain.add(sendFile);
        panelMain.add(cancel);
        add(panelMain, BorderLayout.PAGE_START);
        add(fileName,BorderLayout.CENTER);
        add(filePath, BorderLayout.SOUTH);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(this);
        frame.pack();
        frame.setVisible(true);
     }

     public SendFileFrame(ClientFrame client) {
        super(new BorderLayout());
        showGUI();
        this.clientFrame = client;

     }

    public void actionPerformed(ActionEvent e){

        if(e.getSource() == selectFile) {

            int returnVal = fileChooser.showOpenDialog(SendFileFrame.this);

            if(returnVal == JFileChooser.APPROVE_OPTION) {

                file = fileChooser.getSelectedFile();
                fileName.setText("Name: " + file.getName());
                filePath.setText("Path: " + file.getPath());

            }
            else
                fileName.setText("Cancelled by user!");

        }
        else if(e.getSource() == sendFile)
        {
            clientFrame.setFile(this.file);
            frame.dispose();
        }

        else if(e.getSource() == cancel){
            frame.dispose();
        }
            // close

    }


    public static void main(String[] args) {

            SwingUtilities.invokeLater(() -> {
                SendFileFrame sf = new SendFileFrame(null);
            });

    }

    public File getFile() {
        return file;
    }
}

Rozwiązanie to jednak wywołuje NullPointerException. Jakieś rady, możliwe sposoby rozwiązania?

komentarz 5 grudnia 2016 przez Mateusz51 Nałogowiec (28,180 p.)
możesz wskazać linijke ktora twoim zdaniem wysyla plik?

2 odpowiedzi

0 głosów
odpowiedź 5 grudnia 2016 przez MichuDev Pasjonat (20,300 p.)
wybrane 6 grudnia 2016 przez jaroslaw.slaby
 
Najlepsza

Wyjątek java.lang.NullPointerException, jest dość częstym przypadkiem błędu w trybie wykonania. Polega on na tym, że na obiekcie który nie istnieje (wartość null), wywołujemy metodę. Jak się tego pozbyć ? Bardzo prosto:

  • Nie zwracamy z żadnych metod null - lepsze są wyjątki.
  • Nie przekazujemy żadnym metodom null.
  • W konstruktorze tworzymy wszystkie obiekty, nic nie zostaje jako null (przynajmniej się staramy to osiągnąć).
  • Jeśli coś może być null (nie udało nam się spełnić 3 warunku) sprawdzamy to za każdym razem prostym warunkiem if(object != null) // wywołujemy metodę.

Usuń wszystkie nulle z kodu, a będzie lepiej działać (chyba, że jakaś metoda z biblioteki zewnętrznej zwraca null, to można zrobić interfejs graniczny lub proste sprawdzenie warunku). 

komentarz 6 grudnia 2016 przez jaroslaw.slaby Początkujący (410 p.)
Problem udało mi się załatwić za pomocą konstruktora z parametrem i metody setFile. Dziękuję za pomoc
0 głosów
odpowiedź 5 grudnia 2016 przez mbabane Szeryf (79,280 p.)
Moge sie mylic bo nigdy tego nie robilem, ale wydaje mi sie ze Ty przesylasz tylko referencje do pliku, a powinienes przeslac jego zawartosc i po stronie odbiorcy tworzyc odpowiedni plik i kopiowac tam odebrane dane.

Podobne pytania

0 głosów
2 odpowiedzi 2,674 wizyt
pytanie zadane 22 listopada 2016 w Java przez itcloud Gaduła (3,380 p.)
0 głosów
0 odpowiedzi 444 wizyt
pytanie zadane 6 grudnia 2016 w Programowanie przez jaroslaw.slaby Początkujący (410 p.)
+1 głos
1 odpowiedź 250 wizyt
pytanie zadane 10 kwietnia 2022 w Java przez coriver Nowicjusz (170 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...