TextArea nie reaguje polecenia z zewnętrznych klas.

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.

0

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

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.

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.

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).

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

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");
}

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 :)

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");
}
1

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");
}
0

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

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