[JAVA] zmiana zawartości JTextArea w callbacku

0

Witam wszystkich :-) jest to mój pierwszy post na tym forum.

Program działa tak, że gdy odbierze jakiekolwiek dane od Brokera to powinien je ustawić w formie tekstu w textArea, dokładnie to w metodzie onPublish:

public void onPublish(UTF8Buffer utf8Buffer, Buffer buffer, Runnable runnable) {...

która wywołana zostaje w callbacku. Jednakże tak się nie dzieję i nic nie pojawia się w textArea.
Metoda ustawiam_txt() jest wywoływana ponieważ działa:

System.out.printf("Wywołanie z konstruktora %n ");

To jest kod:




    public class Aplikacja {
    private JButton button1;
    private JPanel panel1;

        JTextArea textArea = new JTextArea();


            public void ustawiam_txt(){

                textArea.setText("zerowanie");
                System.out.printf("Wywołanie z konstruktora %n ");
        }

    public Aplikacja(){
        button1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

            }
        });
    }

    public static void main(String[] args) {
        JFrame jFrame = new JFrame("Aplikacja");
        jFrame.setContentPane(new Aplikacja().panel1);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.pack();
        jFrame.setVisible(true);


        MQTT mqtt = new MQTT();
        mqtt.setPassword("mojeHasło");
        mqtt.setUserName("mojaNazwa");

        try {
            mqtt.setHost("tcp://m24.cloudmqtt.com:10838");
        } catch (URISyntaxException e1) {
            e1.printStackTrace();
        }


        final CallbackConnection connection = mqtt.callbackConnection();
        connection.listener(new Listener() {
            @Override
            public void onConnected() {
                System.out.printf("Callback Połączono %n");
            }

            @Override
            public void onDisconnected() {
                System.out.printf("onDisconnected() %n");
            }

            @Override
            public void onPublish(UTF8Buffer utf8Buffer, Buffer buffer, Runnable runnable) {
                System.out.printf("onPublish %n"+buffer+ "%n");
                
                Aplikacja aplikacja = new Aplikacja();
                aplikacja.ustawiam_txt();



            }

            @Override
            public void onFailure(Throwable throwable) {
                System.out.printf("onFailure %n");
            }
        });




        connection.connect(new Callback<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                System.out.printf("Wywołanie Callbacka z sukcesem %n");

                Topic[] topics = {new Topic("nowy topik",QoS.AT_LEAST_ONCE)};
                connection.subscribe(topics, new Callback<byte[]>() {
                    @Override
                    public void onSuccess(byte[] bytes) {
                        System.out.printf("Zasubskrybowano topik %n ");
                    }
                    @Override
                    public void onFailure(Throwable throwable) {

                    }
                });
            }

            @Override
            public void onFailure(Throwable throwable) {
                System.out.printf("onFailure() %n");
            }
        });
        connection.publish("nowy topik", "Gratulacje".getBytes(), QoS.AT_LEAST_ONCE, false, new Callback<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                System.out.printf("Opublikowano dane %n");
            }

            @Override
            public void onFailure(Throwable throwable) {
                System.out.printf("onFailure() %n");
            }
        });

    }
}

Gdzie może leżeć problem?
Powinienem operować w osobnym wątku na polach tekstowych?

1

Pewnie w tym, że w handlerze tworzysz nowa instancje Application, wiec również ustawiasz wartość w nowo tworzonej za każdym razem instancji pola tekstowego :)

0

a jak odwołać się do pola tekstowego właśnie w takim przypadku?

1
jFrame.setContentPane(new Aplikacja().panel1);

Wynik tego new Application() przypisz do zmiennej. Następnie użyj w handlerze tej zmiennej a nie rób new Application(). Ale tak generalnie ten kod to jakis dramat i nie trzyma się kupy.
Jak robisz new to powstaje nowy niezależny obiekt! Operacje na jednym obiekcie nie powodują zmian w innym!

0

Jest to moj pierwszy program w Javie i dlatego pewnie wygląda źle.
Nie bardzo rozumiem jakiego typu ma być zmienna do której mam przypisać wynik new Aplication() ?
Chodzi o new Aplikacja()? Popełniłeś literówkę czy ja źle coś interpretuję?



import com.sun.security.auth.module.LdapLoginModule;
import org.fusesource.hawtbuf.Buffer;
import org.fusesource.hawtbuf.UTF8Buffer;
import org.fusesource.mqtt.client.*;

import javax.swing.*;
import javax.swing.event.AncestorListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.net.URISyntaxException;

import static org.fusesource.hawtbuf.Buffer.utf8;

    public class Aplikacja {

        public JPanel panel1;
        JTextArea textArea;
        JButton button1;
        




        public Aplikacja() {
            button1.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {

                }
            });
        }

        public static void main(String[] args) {
        JFrame jFrame = new JFrame("Aplikacja");
        jFrame.setContentPane(new Aplikacja().panel1);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.pack();
        jFrame.setVisible(true);

        Aplikacja aplikacja = new Aplikacja();

        MQTT mqtt = new MQTT();
        mqtt.setPassword("S***********");
        mqtt.setUserName("**********j");


        try {
            mqtt.setHost("tcp://m24.cloudmqtt.com:10838");
        } catch (URISyntaxException e1) {
            e1.printStackTrace();
        }


        final CallbackConnection connection = mqtt.callbackConnection();
        connection.listener(new Listener() {
            @Override
            public void onConnected() {
                System.out.printf("Callback Połączono %n");
            }

            @Override
            public void onDisconnected() {
                System.out.printf("onDisconnected() %n");
            }

            @Override
            public void onPublish(UTF8Buffer utf8Buffer, Buffer buffer, Runnable runnable) {
                System.out.printf("onPublish %n"+buffer+ "%n");

             

                        aplikacja.textArea.setText("napis");
               
            }

            @Override
            public void onFailure(Throwable throwable) {
                System.out.printf("onFailure %n");
            }
        });




        connection.connect(new Callback<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                System.out.printf("Wywołanie Callbacka z sukcesem %n");

                Topic[] topics = {new Topic("nowy topik",QoS.AT_LEAST_ONCE)};
                connection.subscribe(topics, new Callback<byte[]>() {
                    @Override
                    public void onSuccess(byte[] bytes) {
                        System.out.printf("Zasubskrybowano topik %n ");
                    }
                    @Override
                    public void onFailure(Throwable throwable) {

                    }
                });
            }

            @Override
            public void onFailure(Throwable throwable) {
                System.out.printf("onFailure() %n");
            }
        });
        connection.publish("nowy topik", "Gratulacje".getBytes(), QoS.AT_LEAST_ONCE, false, new Callback<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                System.out.printf("Opublikowano dane %n");
            }

            @Override
            public void onFailure(Throwable throwable) {
                System.out.printf("onFailure() %n");
            }
        });

    }
}

0

Dobrze, ja niechlujnie pisze kod a Ty czytasz słabo kod :-) Jest zatem remis O-o
Jestem jak najbardziej normalny :-)

0

Jest to moj pierwsze kod w Javie jeśli chodzi o aplikacje okienkowe. Dane poprzez tę aplikację wysyłam do Brokera i odbieram. Nie ma z tym problemu. Jest natomiast z odbieraniem i wyświetlaniem tych danych przez element typu pole tekstowe

0

Jeśli chodzi o kod to zmodyfikowałem tak:

 JFrame frame = new JFrame("Tytul");
            JPanel panel1 = new JPanel();
            panel1.setLayout(new FlowLayout());
            JTextArea textArea = new JTextArea("");
            JButton button = new JButton();
            button.setText("Button");
            panel1.add(textArea);
            panel1.add(button);
            frame.add(panel1);
            frame.setSize(400, 400);
            frame.setLocationRelativeTo(null);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);

a jeśli chodzi o callbacka to nie trzeba robić tego w osobnym wątku:

  @Override
            public void onPublish(UTF8Buffer utf8Buffer, Buffer buffer, Runnable runnable) {
                System.out.printf("onPublish %n"+buffer+ "%n");


                textArea.setText(textArea.getText()+buffer+"\n");
            }

Acha i pozdrawiam obrażalskiego Moderatora Shaloma :-)
Który to sam potrafi powiedzieć, że ktoś jest nienormalny (co potraktowałem jako żart w moim kierunku), ale gdy to ja zażartowałem z niego, że nie potrafi czytać kodu to zrezygnował z dalszej pomocy.
Co złego to nie ja :-)
Zamykam temat

1 użytkowników online, w tym zalogowanych: 0, gości: 1