JLabel in einer anderen Klasse ausführen (Java)

...komplette Frage anzeigen

3 Antworten

Lies mal bitte etwas über die Grundprinzipien der objektorientierten Programmierung, und zwar Abstraktion, Kapselung, Vererbung und Polymorphie.

Entweder muss ein Objekt der Klasse GUI in der Klasse ATR erstellt wedren, was in diesem Fall aber keinen Sinn macht, oder das Label muss statisch deklariert werden, um von einer anderen Klasse darauf zugreifen zu können. Bitte gewöhne Dir bei der Gelegenheit auch gleich an, aussagekräftige Namen zu verwenden. Wenn das Label dann statisch und publik ist, musst der Klasse ATR auch mitteilen, um welches Objekt es sich handelt, also

GUI.OKLabel.setVisible(true);

Hier auch gleich ein Link zum weiterlesen: http://openbook.galileodesign.de/javainsel/javainsel03001.htm

Hier ein statisches Beispiel:

public class ATR {
    public static void main(String args[]){
        GUI.initGUI();
    }
    public static void listener() {
        if (GUI.label.isVisible()) {
            GUI.label.setVisible(false);
        } else {
            GUI.label.setVisible(true);
        }
    }
}

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class GUI {
    static JLabel label;
    static JButton button;
    static JFrame frame = new JFrame();
    public static void initGUI() {
        JPanel panel = new JPanel();
        label = new JLabel("can u see me?");
        button = new JButton("switch label visibility");
        frame.add(panel);
        panel.add(label);
        panel.add(button);
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                ATR.listener();
                frame.pack();
            }
        });
        frame.setVisible(true);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
0

Huhu, Also 1. das kannst du ja nur wenn du das GUI_ATR Objekt in deiner Klasse ATR zur verfügung hast, also mal angenommen du erzeugst das GUI Objekt irgendwo in der ATR Klasse, dann hast du irgendwo ja sowas stehen:

GUI_ATR gui= new GUI_ATR();

dann kannst du auf das Label zugreifen und es z.b. sichtbar machen mit:

gui.OK.setVisible(true);

Und 2. das ist aber ein eher schlechter Stil... nur die GUI selbst sollte direkt auf ihre Attribute zugreifen und modifizieren können, eine bessere Alternative wäre also z.B. in der GUI_ATR eine Methode:

public void showOkLabel(boolean flag) {
   OK.setVisible(flag);
}

wobei du das OK Label dann auch private und nicht public setzt. Diese Methode kannst du dann in der Klasse ATR benutzen.

LG

In der Klasse ATR lässt sich diese Methode nur benutzen, wenn sie statisch ist:

public static void showOkLabel(boolean flag) {  
   OK.setVisible(flag); 
}

Dann lässt sich das Label aus ATR heraus per

GUI.showOKLabel(true);

sichtbar machen.

0
@Cypherpunks

Ja, so auch wenn man das ATR_GUI Objekt nicht in ATR hat, dann muss das OK label auch statisch sein :)

0
@Kulle89

Nun, ich hab jetzt in meiner GUI.class den Abschnitt ...

public static void showOkLabel(boolean flag) {  
OK.setVisible(flag); 
}

eingefügt und in die ATR.class:

GUI.showOKLabel(true);

allerdings hats nicht funktioniert. Gut, ich muss auch dazu sagen, dass ich wenig Ahnung vom programmieren hab ;(

Mein Label muss ich doch in der GUI.class erzeugen und die Größe usw. bestimmen. Das hab ich über den "Design-Modus" unter eclipse gemacht. Ist das richtig bisher? und in der GUI.class kann ich damit:

OK.setVisible(true);

...mein "OK"-Label zum vorschein bringen, wenn ich ein Button betätige.

hoff mir kann noch geholfen werden

gruß

0
@Cihat47

Ja wenn du mit static arbeitest muss dein Label OK auch static sein. Wo erzeugst du denn die ATRGUI und ATR? also wo steht "new ATRGUI()" und "new ATR()"? Kannst du deine main-Methode eben hierher kopieren? ("public static void main (String...").

LG

0
@Kulle89

mein OK Label hab ich static gesetzt:

private static JLabel OK = new JLabel("OK");

und hier meine main aus GUI.class

public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        GUI_ATR frame = new GUI_ATR();
                        frame.setVisible(true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
        });
    }

new GUI_ATR(); erzeuge ich in der GUI.class (siehe main )und ein new ATR() gibt es gar nicht

0
@Cihat47

Ok, du sagst es ja eigentlich schon selber, wie willst du den mit ATR in der GUI etwas ändern wenns ATR nicht gibt? ;) Also wenn du mit static arbeitest, sollte es so jetzt gehen. Wenn du das alles ohne static machen willst, muss du erst dein ATR Objekt erzeugen und ihm deine GUI bekannt machen (Assoziation). Das machst du so: in der ATR Klasse machst du noch ein Attribut für die GUI und im Konstruktor stellst du die Assoziation her

// Attribut um mit der GUI zu arbeiten:
private GUI_ATR gui;

// Konstruktor für ATR mit der GUI, die assoziiert werden soll als Parameter:
public ATR(GUI_ATR pGUI) {
    // Bekannt machen:
    gui= pGUI;
    // Rest, des Konstruktors wenn du da nochmehr stehen hast
    //...
}

So kannst du mit gui.irgendeineOperation(...) mit der gui arbeiten. Jetzt musst du nurnoch auch das ATR Objekt erzeugen, das kannst du auch einfach in der main machen (zwischen den Sternchen das was dazugekommen ist):

public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        GUI_ATR frame = new GUI_ATR();
                        // *** der Parameter ist eben die GUI die ATR kennen soll ***
                        ATR atr= new ATR(frame);
                        // ***
                        frame.setVisible(true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
        });
    }
0
@Kulle89

bekomm es einfach nicht hin ;(

dennoch danke für deine Hilfe!

0
@Cihat47

vlt kannst du mir doch noch helfen, wenn ich dir hier den Code mal poste:

meine GUI.class: ->(vollständig heißt sie GUI_ATR.class )

package getATR;


import java.awt.EventQueue;
.
.

public class GUI_ATR extends JFrame implements ActionListener {
    JButton kontaktlos_pruefen = new JButton();
    JButton daten_pruefen = new JButton();
    JButton formular_reseten = new JButton();

    public static JLabel OK = new JLabel("OK");

static JTextArea textArea = new JTextArea();
static File f;
static String path_f;
static int returnVal;

private JPanel contentPane;
private final JScrollPane scrollPane = new JScrollPane();

public static void main(String[] args) {
//...den Inhalt kennst du ja schon bereits!!!
}

public void gui_leeren() {
OK.setVisible(false);
}
    public GUI_ATR() {
    panel.add(OK);
    OK.setBounds(942, 145, 28, 14);
    }

public class meinWindowListener extends WindowAdapter {
    public void windowClosing(WindowEvent a) {
        System.exit(0);
    }
} //END for class GUI_ATR

und hier meine ATR.class: ->(vollständig heißt sie Inhalt_ATR.class )

package getATR;

import java.text.DecimalFormat;
import javax.smartcardio.ATR;


public class Inhalt_ATR {

.
.

static byte receivedATR_dec[];
static String receivedATR_hex[];
private static ATR atr;

public GUI_ATR mit_gui_arbeiten;

public Inhalt_ATR(GUI_ATR pGUI) {   // hat leider nicht funktioniert ;(
    mit_gui_arbeiten= pGUI;
}
.
.
public static void ausgabe() {
    init_ATR();
    convert_atr();
    print_raw_ATR();
    GUI_ATR.textArea.append("");


}

public static void init_ATR() {

    setAtr(Connect_Card.getCard().getATR());
    setReceivedATR_dec(getAtr().getBytes());
    setReceivedATR_hex(new String[getAtr().getBytes().length]);

}

public static void convert_atr() {
    try {
        for (int i = 0; i < getAtr().getBytes().length; i++) {
            String test = (Integer
                    .toHexString(
                            receivedATR_dec[i]
                                    + (receivedATR_dec[i] < 0 ? 256 : 0))
                    .toUpperCase().substring(0) + " ");
            if ((test.length() == 2)) {
                test = ("0" + test);
                receivedATR_hex[i] = test;
            } else {
                receivedATR_hex[i] = (Integer
                        .toHexString(
                                receivedATR_dec[i]
                                        + (receivedATR_dec[i] < 0 ? 256 : 0))
                        .toUpperCase().substring(0) + " ");
            }
        }
    } catch (Exception e) {
        GUI_ATR.textArea.setText("Fehler beim umwandeln in Hexadezimal!\n");
    }
}

public static void print_raw_ATR() {
    try {

        GUI_ATR.textArea.append("ATR (original):  ");   
        for (int i = 0; i < getAtr().getBytes().length; i++) {
            GUI_ATR.textArea.append(receivedATR_dec[i] + " ");  
        }
        GUI_ATR.textArea.append("\n");
    } catch (Exception e) {
        GUI_ATR.textArea.setText(e.toString());
        return;
    }

    try {
         GUI_ATR.textArea.append("ATR (konvertiert): ");        
        for (int i = 0; i < getAtr().getBytes().length; i++) {
            GUI_ATR.textArea.append(receivedATR_hex[i] + " ");  
        }

        GUI_ATR.textArea.append("\n");
    } catch (Exception e) {
        GUI_ATR.textArea.setText("Fehler beim umwandeln in Hexadezimal!\n");
    }
    GUI_ATR.textArea.append("\n");


    if (getAtr().getBytes().length < 13){
    GUI_ATR.textArea.append("Fehler!");




    /////////////////////////////////////
    /// hier:       will ich mein "OK"Label später haben
    /////////////////////////////////////

    }
    else 
        GUI_ATR.textArea.append(" Versuchen Sie es erneut!");
}
.
.
public static byte[] getReceivedATR_dec() {
    return receivedATR_dec;
}

public static void setReceivedATR_dec(byte[] receivedATR_dec) {
    Inhalt_ATR.receivedATR_dec = receivedATR_dec;
}

public static String[] getReceivedATR_hex() {
    return receivedATR_hex;
}

public static void setReceivedATR_hex(String[] receivedATR_hex) {
    Inhalt_ATR.receivedATR_hex = receivedATR_hex;
}

public static ATR getAtr() {
    return atr;
}

public static void setAtr(ATR atr) {
    Inhalt_ATR.atr = atr;
}
} // END for class Inhalt_ATR

...puhhh, hoff ich hab jetzt alles wichtige dringelassen!

Grüße

0
@Cihat47

Ist ja schön das Du so viel code postest, aber ich habe wenig lukst mir jetzt extra ne main zu schreiben um das zu testen. Ein paar Fehler in Inhalt_ATR.java stechen aber trotzdem sofort ins Auge:

  1. 14: Wenn ActionListener implementiert wird, muss auch die Methode actionPerformed() vorhanden sein.
  2. 37: Es wurde keine Variable namens "panel" deklariert
  3. 45: Zähle mal die spitzen Klammern
0
@Cypherpunks

Hi,

die Methode actionPerformed() ist in der GUI_ATR.class vorhanden, habs nur weggelassen beim poste! und panel wurde auch deklariert!

auf die Spitzen Klammer hab ich jetzt auch nicht groß geachtet. In Eclipse würd ich sofort den Fehler beseitigen, wenn eine Spitze Klammer gefehlt hätte!

na ja, dein Beispiel hab ich jetzt ausprobiert, leider kam ein Fehler wegen:

ATR.listener();

aber bei mir ist die main Methode in der GUI_ATR.class und nicht in der Inhalt_ATR.class

vlt. kannst du mir einfach nur sagen, was ich in meine Inhalt_ATR.class noch einfügen muss, um mein "OK"-Label anzuzeigen! zu beachten ist mein Kommentar in der Inhalt_ATR.class

/////////////////////////////////////
/// hier:       will ich mein "OK"Label später haben
/////////////////////////////////////

Grüße

0
@Cihat47

Was um Himmels Willen hat eine main-Methode in einer GUI Klasse verloren? Eine GUI sollte immer seperat in einer Klasse aufgebaut werden und keinerlei Funktionalöität bereitstellen. Hier nocmal als .jar, der Quellcode befindet sich auch darin: http://www.file-upload.net/download-3442863/label.jar.html

Ich werde nicht Deine Klassen debuggen um dort ein label unsichtbar zu schalten, aber wenn Du mir etwas funktionierendes schickst werd ichs mir anschauen. Code bitte nach pastebin.com posten oder einen Downloadlink zu einem Archiv.

0
@Cypherpunks

///////////////////////////////////// /// hier: will ich mein "OK"Label später haben /////////////////////////////////////

einfach durch

GUI_ATR.OK.setVisible(false)

ersetzen. Bitte merken: http://www8.pic-upload.de/19.05.11/m1hh81d1dp3y.png

Variablen beginnen per Konvention übrigens mit einem kleinen Buchstaben und komplett in uppercase und Unterstrichen als Trennzeichen (GUI_ATR) werden nur konstanten geschrieben.

0
@Cypherpunks

Hi,

GUI_ATR.OK.setVisible(false)

das wollt ich die ganze Zeit haben ;) nur statt false natürlich true.

Die Sache mit der main hab ich noch von meinem Vorgänger einfach übernommen! aber ich merk es mir für die Zukunft ;)

Vielen Dank

0
@Cihat47

Steht doch auch in meinem Beispiel ;-)

Sorry das ich immer auf die Konvention hinweise, aber es wird sonst wirklich unübersichtlich.

0

Was möchtest Du wissen?