JFrame aktualisieren?
Ich habe folgendes problem. Ich möchte mein JFrame aktualisieren. Hier der code:
public class Shop {
Inventory inv = new Inventory();
int AnzahlInt= 1;
String Anzahl= Integer.toString(PokeballAnzahlInt);
public void Frame() {
GridLayout gLayout = new GridLayout(0, 1);
JFrame frame= new JFrame();
frame.setVisible(true);
frame.setSize(100, 100);
frame.setLayout(gLayout);
JButton Mehr = new JButton("<html> <h1>^<html>");
PokeballMehr.addActionListener(newActionListener() {
public void actionPerformed(ActionEvent e) {
AnzahlInt++;
frame.repaint();
}
});
PokeballFrame.add(PokeballMehr);
PokeballFrame.add(new JLabel(PokeballAnzahl));
}
}
Bin mir nicht ganz sicher dachte das das mit repaint geht aber anscheinend nicht.
1 Antwort
Von gutefrage auf Grund seines Wissens auf einem Fachgebiet ausgezeichneter Nutzer
programmieren, Java
1) Pack
frame.setVisible(true);
hinter deinen letzten add-Aufruf.
2) Hier:
newActionListener
fehlt ein Leerzeichen hinter new.
3) Du aktualisierst im ActionListener doch eh nichts, was mit der grafischen Oberfläche in Verbindung steht?
regex9
30.01.2022, 20:37
@Junski1
Also sind alle Variablen mit dem Präfix Pokeball eigentlich dieselben Variablen, wie die ohne diesen Präfix. Das hättest du früher erwähnen sollen.
Ein komplettes funktionales Beispiel:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Main {
private int counter = 1;
public void showFrame() {
JFrame frame = new JFrame("Example");
GridLayout gridLayout = new GridLayout(2, 1);
frame.setLayout(gridLayout);
frame.setSize(100, 100);
JLabel counterDisplay = new JLabel(Integer.toString(counter));
JButton moreButton = new JButton("<html><h1>^<html>");
moreButton.addActionListener(event -> {
++counter;
counterDisplay.setText(Integer.toString(counter));
});
frame.add(moreButton);
frame.add(counterDisplay);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new Main().showFrame();
});
}
}
- Das GridLayout braucht mindestens eine Zeile. Ich habe ihm hier zwei gegeben.
- Ein repaint-Aufruf ist nicht nötig. Der Frame muss auf dem Event Dispatch Thread erstellt werden (dafür sorgt invokeLater), dann kann der ActionListener den Zustand des Labels auch sicher ändern.
funktioniert leider immer noch nicht. Die Oberfläche wird nicht aktualisiert.