JFrame -> setVisible

shadow25990

Neues Mitglied
Hi,

ganz kurz zu mir:
Ich habe C++ gelernt und mit Qt schon einige private Projekte erfolgreich umgesetzt.
Ich versuche mich jetzt in Java und muss feststellen das sich sehr viel ähnelt. Gerade swing mit JLabel was in Qt QLabel ist etc.
Auch die ganzen Layouts sind gleich, wodurch es mir Spaß macht, damit java zu lernen.

Aber! 🙂
Was ich in c++ bzw. Qt nicht hatte, war das Problem mit dem setVisible mit Jframe.

Wenn ich das richtig verstanden habe, muss man wirklich nach jeder Änderung im JFrame, diesen neuladen in dem man erneut JFrame auf setVisible(true); setzt ?

ich versuche mich nämlich gleich wieder an einem eigenen projekt.
Dort möchte ich mit jsoup eine html seite parsen.
Da ich Anfänger bin, hab ich es ganz einfach gehalten.

Aufbau:

MenuBar -> Menu ("Seite") -> MenuItem("Laden")

mit einem ActionListener lasse ich die Methode sLaden(); aufrufen.
in sLaden jabe ich ein JPanel , einen Button und ein Label erstellt.

wenn ich auf den Button drücke, dann soll er mir im JLabel den header title der geparsten HMTL Seite anzeigen.

Nun habe ich das Problem, das ich JFrame bereits für den Button auf visible gesetzt habe.
Da der Button nun einen ActionListener hat und ein bereits vorhandenes JLabel neu geladen werden muss, müsste ich ja erneut JFrame auf visible true setzen.

Wenn ich das mache, zeigt er mir anschließend jedoch 2 buttons an.
Wenn ich im ActionEvent erst das JLabel in das JPanel einfüge , dann bekomm ich nach jedem klick einen "weiteren" JLabel angezeigt.

Wie ist hier die richtige vorgehensweise ?
Ich möchte nur einen button und ein leeres Label.
Wenn ich den Button drücke, soll das JLabel gefüllt werden.
Wenn ich ihn erneut drücke, dann soll das JLabel einfach nur überschrieben werden.
Hab auch schon probiert, im ActionEvent vom Button, als erstes das Label auf =""; zu setzen und danach erst zu füllen, damit es überschrieben wird, aber auch das geht nicht.
Ich glaube dann wurde es nicht angezeigt.
Ich bin leider aktuell auf arbeit und habe kein Quellcode zur Hand.

hat jemand eine Idee, was ich hier beachten muss und wie das
mit dem JFrame visible true genau funktioniert? reicht das nicht 1 mal?

Danke schon einmal.

MFG
 
Beispiel:

Java:
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

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

public class Test extends JFrame {

    public Test() {

        initUI();
    }

    public final void initUI() {

        setLayout(null);
        final JLabel label = new JLabel();
        label.setBounds(150, 50, 80, 25);
        label.setText("0");

        JButton ok = new JButton("OK");
        ok.setBounds(50, 50, 80, 25);
        ok.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                label.setText(new Random().nextInt() + " ");
            }
        });

        add(ok);
        add(label);

        setTitle("Test Label");
        setSize(300, 250);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
    }

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                Test ex = new Test();
                ex.setVisible(true);
            }
        });
    }
}

Wie du siehst sollte es ohne Probleme funktionieren oder was machst du in deinem Code?
label = new JLabel(); ???
 
(Bin kein Experte was das betrifft, daher muss nicht alles richtig sein was ich hier verzapfe 😉 )
Jein 1x reicht auch. Das Problem "setVisible" sorgt dafür das alle deine Komponenten welche am JFrame hängen gezeichnet werden.

Wenn du jetzt später eine neue Komponente hinzufügst dann wird nicht automatisch neu gezeichnet, sondern nur deine Komponente im Baum dazugehängt.
Ein nicht so schöner Fix wäre einfach nochmal "setVisible" aufzurufen, da somit auch neu gezeichnet wird. (ein ähnlicher angeblich auch "pack()" aufzurufen).

Schöner hingegen wäre es hier mit "revalidate" und "repaint" zu arbeiten.

Aber eine andere Möglichkeit sollte es auch sein mit dem SwingWorker zu arbeiten bzw. die UI wie im Beispiel von truesoul in einen extra Thread laufen zu lassen.
 
Danke Joose für die Erklärung. Hat mir schon einmal Gedanklich weitergeholfen.
Und truesoul, danke dir auch. Dein Code ist um einiges anders aufgebaut. aber sinnbildlich das selbe. ich muss das mal zu Hause ausprobieren bzw vergleichen.

Danke schon einmal 🙂
 

Zurück
Oben