Wątek przeniesiony 2015-01-31 17:00 z Java przez bogdans.

JTextArea - dostęp z poziomu innej klasy

0

Siema,

Wie ktoś może czy w Javie można odwołać się do JTextArea z poziomu innej klasy w jakikolwiek sposób?

tzn. np (PSEUDOKOD):

public class Pierwsza { 

public Pierwsza() { 
super("Program"); 
... 
JTextArea t1 = new JTextArea(); 
add(t1); 
... 
} 

public static void main(String[] args) { 
Pierwsza p = new Pierwsza(); 
p.setVisible(true); 
} 
}
public class druga { 
... 
t1.setText("TEN TEKST CHCIAŁBYM PRZEKAZAĆ DO JTextArea ZAIMPLEMENTOWANEGO W KLASIE PIERWSZA"); 
... 
}

Muszę to zrobić w taki sposób, bo klasa Pierwsza, ma zostać nieruszana, taki odgórny wymóg... (nie mój). Wszystko działa i wyświetla mi się idealnie przy użyciu System.out.println(), a ja mam do tego czegoś dorobić GUI. Siedzę już przy tym 3 dzień i nie wiem co z tym zrobić. Przepytałem już wujka google, ale nie był zbyt wylewny (może złe pytania zadawałem???). Niestety nie mogę wrzucić tutaj całego kodu, bo to jest projekt na informatykę, a ziomek, z którym mam ma fioła na tym punkcie... nie daj Boże, żeby chociaż fragment gdzieś znalazł :P Z góry dzięki za pomoc.

0
Pierwsza p = new Pierwsza();
p.t2.setText("PRINT: "+wartosc);

zrobiłem to w taki sposób, ale za każdym razem, gdy wcisnę przycisk START to uruchamia mi się nowe okno... (w efekcie jest ich kilka na pulpicie) wie ktoś jak można to zrobić inaczej albo dlaczego może się tak robić?

0

W klasie druga musisz mieć referencję do okna klasy pierwsza (wystarczy referencja do do pola tekstowego). Jeżeli obiekty klas pierwsza i druga tworzysz w klasie pierwsza, nie masz w istniejącym kodzie przekazania referencji i nie wolno Ci zmieniać kodu klasa pierwsza, to sytuacja jest dość beznadziejna. Zrób tak (jeśli taka modyfikacja jest dopuszczalna):

public class Trzecia
{
    public static void main(String[] args)
    {
        Pierwsza p = new Pierwsza();
        new Druga(p);
    }
}
...
public class Druga
{
      private Pierwsza p;
      ...
      public Druga(Pierwsza p)
      {
           this.p = p;
      }
... 
     p.t2.setText("Udało się");     
}

Program uruchamiasz poleceniem java Trzecia.

0
public class Pierwsza extends JFrame {

    public final JTextArea a;

    public Pierwsza() {
        super("Program");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(300, 300);
        setLayout(null);
        setLocationRelativeTo(null);
        setResizable(false);

        JButton b = new JButton("Test");
        b.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                Druga druga = new Druga();
                druga.wykonaj();

            }
        });
        add(b);
        b.setBounds(150, 150, 100, 30);

        a = new JTextArea();
        a.setBounds(10, 10, 100, 100);
        add(a);
        setVisible(true);
    }

    public static void main(String[] args) {
        Pierwsza p = new Pierwsza();
        p.setVisible(true);
    }
}
public class Druga {

    public void wykonaj() {
        String a = "test";
        System.out.println(a);
    }
}

Błagam niech ktoś mi to ogarnie, bo nie powiem co mnie już trafia... Napis "test" z klasy Druga jest dotychczas wyświetlany za pomocą System.out.println(), a ma zostać wyświetlony w polu tekstowym JTextArea zaimplementowanym w klasie Pierwsza po wciśnięciu przycisku Test. Metoda nieważna byle działało (w grę wchodzi wszelaka modyfikacja klas oraz dodawanie nowych).

Teraz wyświetla się za każdym razem gdy przycisnę przycisk Test nowe okno programu i wyświetla się napis tak jak chciałem, tylko nie wiem jak zrobić żeby się nowe okno nie otwierało, a wyświetlało się w tym 1 oknie...

0

Czy Ty umiesz czytać? Przecież dostałeś odpowiedź z kodem:

public class Druga
{
      private Pierwsza p;
      ...
      public Druga(Pierwsza p)
      {
           this.pierwsza = pierwsza;
      }
... 
     p.t2.setText("Udało się");     
}

Musisz do klasy Druga przekazać referencję do okna klasy Pierwsza. Na wypadek gdybyś nie umiał przekazać tej referencji, jeszcze kawałek kodu:

        b.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                Druga druga = new Druga(Pierwsza.this);
                druga.wykonaj();
 
            }
        });
0

Niestety, ale to nie działa... Wywala taki błąd jak wcisnę przycisk Test i nic się nie dzieje, a zrobiłem według sugestii:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at tes.Druga.wykonaj(Druga.java:16)
	at tes.Pierwsza$1.actionPerformed(Pierwsza.java:25)

dodanie znacznika <code class="none"> - @furious programming

1

Pieprzysz waść. Skompiluj, uruchom i napisz, w którym wierszu jest NullPointerException.

import javax.swing.*;
import java.awt.event.*;
public class Pierwsza extends JFrame {
 
    public final JTextArea a;
 
    public Pierwsza() {
        super("Program");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(300, 300);
        setLayout(null);
        setLocationRelativeTo(null);
        setResizable(false);
 
        JButton b = new JButton("Test");
        b.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                Druga druga = new Druga(Pierwsza.this);
                druga.wykonaj();
 
            }
        });
        add(b);
        b.setBounds(150, 150, 100, 30);
 
        a = new JTextArea();
        a.setBounds(10, 10, 100, 100);
        add(a);
        setVisible(true);
    }
 
    public static void main(String[] args) {
        Pierwsza p = new Pierwsza();
        p.setVisible(true);
    }
}

public class Druga 
{
    private Pierwsza p;
    public Druga(Pierwsza p)
    {
        this.p = p;
    }
    public void wykonaj() {
        p.a.setText("Udało się");
    }
}
0

Zwracam honor, to jednak moja głupota, problem leżał od samego początku tutaj...

ja miałem tak:

    public Druga(Pierwsza p) {
        p = this.p;
    }

a powinno być tak:

public Druga(Pierwsza p) {
        this.p = p;
    }

Jednak nie potrafię czytać :P Dzięki i przepraszam.

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