TextArea nie reaguje polecenia z zewnętrznych klas.

2015-01-21 09:04
0

Proszę o pomoc w zrozumieniu dlaczego TexArea nie chce wyświetlić tekstu jeśli jest wywoływany z odrębnej klasy. Napisałem prosty przykład z 4 przyciskami:

  1. Ustawia TexArea - i jest ok.
  2. Wywołuje metodę wyswietl, która wyświetla przekazany jej tekst - i jest ok.
  3. Uruchamia metodę wywolajIWyswietl która wywołuje metodę wyswietl... - i jest ok.
  4. Robi to samo co trzeci tylko tylko wywoluje metodę wywolajIWyswietl należącą do innej klasy.
public class niedziala extends javax.swing.JFrame {

    public niedziala() {
        initComponents();
    }
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jButton3 = new javax.swing.JButton();
        jButton4 = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTextArea1 = new javax.swing.JTextArea();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jButton1.setText("jButton1");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jButton2.setText("jButton2");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        jButton3.setText("jButton3");
        jButton3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton3ActionPerformed(evt);
            }
        });

        jButton4.setText("jButton4");
        jButton4.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton4ActionPerformed(evt);
            }
        });

        jTextArea1.setColumns(20);
        jTextArea1.setRows(5);
        jScrollPane1.setViewportView(jTextArea1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jButton1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jButton2)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jButton3)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jButton4)
                .addContainerGap(80, Short.MAX_VALUE))
            .addComponent(jScrollPane1)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 184, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 65, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton1)
                    .addComponent(jButton2)
                    .addComponent(jButton3)
                    .addComponent(jButton4))
                .addGap(28, 28, 28))
        );

        pack();
    }// </editor-fold>                        

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        jTextArea1.append("tekst wywołany z przycisku 1\n");
    }                                        

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        wyswietl("przekazany tekst");
    }                                        

    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
       wywolajIWyswietl();
    }                                        

    private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        ZewnetrznaKlasa zewnKlas = new ZewnetrznaKlasa();
        zewnKlas.wywolajIWyswietl();
    }                                        

    public static void main(String args[]) {

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new niedziala().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JButton jButton4;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextArea jTextArea1;
    // End of variables declaration                   

void wyswietl(String txt){
    jTextArea1.append(txt+" - tekst wywołany ze zmiennej 2\n");
    System.out.println(txt);
}

void wywolajIWyswietl(){
    wyswietl("przekazany z METODY Wewnetrznej");
}

}//**** KONIEC KLASY niedziala

class ZewnetrznaKlasa {
    void wywolajIWyswietl(){
    niedziala wstaw= new niedziala();
    wstaw.wyswietl("tekst z poza klasy");
}
}

czy ktoś może mi powiedzieć dlaczego po wciśnięciu czwartego przycisku nie pojawia się tekst na TextArea, bo na System.out.print(); się pojawia jak trzeba.

Pozostało 580 znaków

2015-01-21 09:18
0

Tak na szybko, wydaje się, że brakuje Ci odpalenia setVisible(true) na tej nowej niedzieli, którą tworzysz wewnątrz wywolajIWyswietl().

Pozostało 580 znaków

2015-01-21 09:23
0

Jesli o to chodzi to niby jest

    public static void main(String args[]) {

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new niedziala().setVisible(true);
            }
        });
    }

Pierwsze 3 przyciski działają poprawnie.

edytowany 1x, ostatnio: TomDom, 2015-01-21 09:24

Pozostało 580 znaków

2015-01-21 09:26
0
    void wywolajIWyswietl(){
    niedziala wstaw= new niedziala();
    wstaw.wyswietl("tekst z poza klasy");

Tworzysz - niepotrzebnie - nową niedzielę i tam zmieniasz tekst. Drugi wiersz w powyższym kodzie jest zbyteczny. Zmienna wstaw (referencja do okna powinna być przekazana jako parametr do konstruktora klasy zewnętrznej.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans, 2015-01-21 09:30

Pozostało 580 znaków

2015-01-21 09:26
0

No tak, ale to jest na Twoim pierwotnym "niedziala" (świetna nazwa), potem tworzysz zupełnie nowe niedziała:

niedziala wstaw= new niedziala();

Na tym odpal setVisible(true).

edytowany 1x, ostatnio: Hrypa, 2015-01-21 09:27
Sądzę, że autor chce zmienić tekst w tym już widocznym oknie. Twój pomysł jest chyba zły. - bogdans 2015-01-21 09:29

Pozostało 580 znaków

2015-01-21 09:28
0

to jest Nie Działa a nie niedziela moze powinno być nieDziala ale mniejsza z tym.

hehe czyli problem w tym ze <ort>z byt</ort> LENIWA nazwa :D

edytowany 2x, ostatnio: furious programming, 2015-01-21 19:41
Nazwa niedziela pochodzi właśnie od "nie działać" i jest związana z tym, że w niedziele nie powinno się pracować tylko odpoczywać ;) - Shalom 2015-01-21 09:30

Pozostało 580 znaków

2015-01-21 09:36
0

Ok, nie zrozumiałem na początku, o co tu chodziło. Zmień to tak:

private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        ZewnetrznaKlasa zewnKlas = new ZewnetrznaKlasa();
        zewnKlas.wywolajIWyswietl(this);
    }    
// ...

class ZewnetrznaKlasa {
    void wywolajIWyswietl(niedziala jakosToNazwij){
    jakosToNazwij.wyswietl("tekst z poza klasy");
}

Pozostało 580 znaków

2015-01-21 09:47
0

Problem w tym że w poleceniach przycisku nie chce nic zmieniać on tylko ma uruchomić metodę bo pozniejsze metody bedą uruchamiane automatycznie lub za pomocą nasluchiwania klawiatury.

W pozniejszych klasach metody będą wykonywać jakies operacje wywoływać inne metody z innych klas i chodzi o to żeby była wyświetlana informacja że coś się zapisało do bazy danych albo został obliczony wynik i pytanie co z nim zrobić:

np:
"wynik obliczeń to sto 100"

  • naciśnij na klawiaturze 1 aby zapisać do 1 bazy danych.
  • naciśnij na klawiaturze 2 aby zapisać do 2 bazy danych.
  • naciśnij na klawiaturze 3 aby skasować wynik/nie brać go pod uwagę i przejść dalej

metody co się wykonają mają ewentualnie mnie informować co się wykonało.

dodam jeszcze, że:

class ZewnetrznaKlasa {

    void wywolajIWyswietl(){
    niedziala wstaw= new niedziala();
    wstaw.setVisible(true);
    wstaw.wyswietl("tekst z poza klasy");
}
}

działa tylko za każdym razem otwiera nowe okno :)

edytowany 1x, ostatnio: TomDom, 2015-01-21 09:52

Pozostało 580 znaków

2015-01-21 10:01
0

Ty czytasz otrzymane odpowiedzi?
Napisałem

    void wywolajIWyswietl(){
    niedziala wstaw= new niedziala();
    wstaw.wyswietl("tekst z poza klasy");

Tworzysz - niepotrzebnie - nową niedzielę i tam zmieniasz tekst.

@Hrypa napisał

private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        ZewnetrznaKlasa zewnKlas = new ZewnetrznaKlasa();
        zewnKlas.wywolajIWyswietl(this);
    }    
// ...

class ZewnetrznaKlasa {
    void wywolajIWyswietl(niedziala jakosToNazwij){
    jakosToNazwij.wyswietl("tekst z poza klasy");
}

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2015-01-21 10:04

Otwiera nowe okno, bo tworzysz nowe okno (new niedziala() - na początku zrozumiałem, że tego właśnie chcesz). Nie wiem, dlaczego nie chcesz zrobić tak, jak wyżej napisałem i dlaczego możesz wywołać metodę bez parametrów, a z jednym parametrem (this) już nie. W każdym razie musisz mieć referencję do obiektu klasy niedziala wewnątrz wywolajIWyswietl(), żeby wywołać jej metodę. Możesz to zrobić na kilka sposobów. Oprócz tego, który podałem, możesz trzymać obiekt ZewnetrznaKlasa jako pole obiektu niedziala i przy tworzeniu instancji przekazać do niego referencję do this:

public class niedziala extends javax.swing.JFrame {
    private _zewnetrznaKlasa;
    public niedziala() {
        _zewnetrznaKlasa = new ZewnetrznaKlasa(this);
        initComponents();
    }

class ZewnetrznaKlasa {
   public ZewnetrznaKlasa(niedziala nieDziala)
  {
      _nieDziala = nieDziala;
   }
   private niedziala _nieDziala; 
    void wywolajIWyswietl(){
    _nieDziala.wyswietl("tekst z poza klasy");
}

Pozostało 580 znaków

2015-01-21 10:11
0

Właśnie próbuje to podłączyć.

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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