repaint() geht gar nicht; GUI aktualisieren

  • Themenstarter Themenstarter john1337
  • Beginndatum Beginndatum
J

john1337

Gast
Hi,

ich habe eine GUI die in meiner main_class erzeugt wird
Launcher.java
Java:
public class Launcher extends JFrame implements ActionListener{
main_class.java
Java:
public class main_class {
	public static void main(String args[]){
		Launcher launcher = new Launcher();
		launcher.setVisible(true);
	}
}
es geht alles, ich kann sogar in meinem launcher eine 2te gui, die das eigentliche spiel darstellt, erzeugen und anzeigen. ich hab sogar mehrere Klassen deren Objekte munter aufeinander zugreifen und mit getter-Methoden die Titel einiger label und buttons bestimmen.

Das Problem ist, wenn ich etwas ändere ändert sich nichts in der GUI. es wird bis dahin alles korrekt ausgeführt (mit popupfenster kontrolliert). Alles was einmal gezeichnet wurde bleibt unverändert (abgesehen von Textfields; aber das ist ja klar).
ich habe an jeder erdenklichen Stelle des Codes die repaint()-Methode aufgerufen ohne erfolg.
ich habe 20 verschiedene Forenbeiträge und Lösungsvorschläge durchgelesen; nichts... und jetzt bin total verwirrt. vielleicht liegt's an mir aber die Hintergrundfarbe ändern geht auch nicht mehr.

ALSO: wo muss repaint() oder irgendwas zum aktualisieren aufgerufen werden?
danke schon mal im vor raus. :-(
 
Repaint ist schon richtig, updateUI bringt gar nix und ist falsch. Zu deinem Problem kann man ohne Code aber nicht viel sagen. Du musst schon etwas präziser sein und uns sagen, was geht und was nicht. Vorallem aber was dabei am ende rauskommen soll.
 
Was genau soll den aktualisiert werden?
Texte von Buttons kannst du z.B. per Observer-Pattern deine Daten überwachen lassen und sie daraufhin anpassen.
Bei komponenten wie JPanel, bei denen du eigene Zeichenoperationen durchführst, würdest du mittels Überschreiben von paintComponent() und repaint() wohl auch Ergebnisse bekommen.
Vielleicht hilft dir das hier bei den Methoden:
http://www.java-forum.org/bilder-gui-damit-zusammenhaengt/57543-jcomponent-wichtige-methoden.html

und hierzu:
Java:
public class Launcher extends JFrame implements ActionListener{
les dir doch mal das hier durch, solche Konstrukte sind meistens vermeidbar.
http://www.java-forum.org/blogs/firephoenix/182-leidige-extends-jframe.html


Ansonsten wie schon gesagt wurde: Etwas Code wäre hilfreich (was muss aktualisiert werden, wo kommen die Daten her und wer ist für die Aktualisierung verantwortlich)

Gruß
 
das mit extends JFrame werd ich später ändern; vll liegst ja sogar daran.

nun aber erstmal der gewünschte code. ich kürz das ganze erstmal recht stark da viele button und label nicht wirklich was mit dem prolme zu tun haben.
ich habe zur Zeit 6 Klassen: main_class, Launcher, Battle, Monster, Turn und Move.
die main erzeugt den Launcher der dann über nen Button die Battle-GUI starten kann. Die Monster haben Eigenschaften und Moves die in den Buttons der Battle-GUI verwendet werden. die buttons in battle rufen turn aus Turn auf. turn ändert dann die texte in battle. soweit funktioniert alles, aber repaint() macht mal garnichts
main_class.java
Java:
public class main_class {
	public static void main(String args[]){
		Launcher launcher = new Launcher();
		launcher.setVisible(true);
	}
}
Launcher.java
Java:
import javax.swing.*;
import java.awt.Color;
import java.awt.event.*;



@SuppressWarnings("serial")
public class Launcher extends JFrame implements ActionListener{
	//DEKLARATION
	private JButton buttonBattle;
//weitere button und label..
	//KONSTRUKTOR
	public Launcher(){
		setLayout(null);
		setSize(800,600);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//setBackground(Color.RED); //not working; warum auch immer???
		
		// INSTANZIERUNG
//...
		
		
		// POSITION
		buttonBattle.setBounds(300,20,130,30);
//...
		
		
		// EINBINDUNG
		add(buttonBattle);
//...

		
	}
	//BUTTONS
	public void actionPerformed(ActionEvent e){
		if (e.getSource() == buttonBattle) {
			Battle battle = new Battle();
			setVisible(false);//Launcher wird invis
			battle.setVisible(true); battle wird sichtbar

		}
	}
}
Battle.java
Java:
import javax.swing.*;
import java.awt.Color;
import java.awt.event.*;

@SuppressWarnings({ "serial"})
public class Battle extends JFrame implements ActionListener{
	//DEKLARATION
	private JButton buttonMove1;
	private JButton buttonMove2;
	private JButton buttonMove3;
	private JButton buttonMove4;
	static JLabel labelChat;
	static JTextArea textAreaChat;
	

	
	public static void setBattleChat(String text){
		labelChat.setText(text);
	}
	//KONSTRUKTOR
	public Battle(){
		
		
		setLayout(null);
		setSize(800,600);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		
		// INSTANZIERUNG
		labelChat = new JLabel ("the battle has begun");

		buttonMove1 = new JButton(currentMonster.getMonsterMove1().getMoveName());
		buttonMove2 = new JButton(currentMonster.getMonsterMove2().getMoveName());
		buttonMove3 = new JButton(currentMonster.getMonsterMove3().getMoveName());
		buttonMove4 = new JButton(currentMonster.getMonsterMove4().getMoveName());
		
		textAreaChat = new JTextArea("test "+ " adsadsad");
		JScrollPane scrollPane = new JScrollPane(textAreaChat);
		textAreaChat.setEditable(true);
		textAreaChat.setLineWrap(true);
		
		// POSITION		
		
		textAreaChat.setBounds(500,300,300,300);
		labelChat.setBounds(500,200,150,20);
		buttonMove1.setBounds(20,240,100,20);
		buttonMove2.setBounds(125,240,100,20);
		buttonMove3.setBounds(20,265,100,20);
		buttonMove4.setBounds(125,265,100,20);
		
		// EINBINDUNG
		add(textAreaChat);
		add(labelChat);
		add(buttonMove1);
		add(buttonMove2);
		add(buttonMove3);
		add(buttonMove4);
		
	}	// ENDE KONSTRUKTOR
		
				
	// BUTTONS
	public void actionPerformed(ActionEvent e){
		if (e.getSource() == buttonMove1) {
			Turn.turn(currentMonster.getMonsterMove1());
		}
		else if (e.getSource() == buttonMove2) {
			Turn.turn(currentMonster.getMonsterMove2());
		}
		else if (e.getSource() == buttonMove3) {
			Turn.turn(currentMonster.getMonsterMove3());
		}
		else if (e.getSource() == buttonMove4) {
			Turn.turn(currentMonster.getMonsterMove4());
		}
	}

}
Monster.java
Java:
public class Monster{
	private String name;
	private int id;
	private int hp;
	private Move move1;
	private Move move2;
	private Move move3;
	private Move move4;
	
	public Monster(String name,int id, int hp, Move move1, Move move2, Move move3, Move move4){
		this.name = name;
		this.id = id;
		this.hp = hp;
		this.move1 = move1;
		this.move2 = move2;
		this.move3 = move3;
		this.move4 = move4;
		
	}
	public Move getMonsterMove1(){
		return move1;
	}
	public Move getMonsterMove2(){
		return move2;
	}
	public Move getMonsterMove3(){
		return move3;
	}
	public Move getMonsterMove4(){
		return move4;
	}
	public String getMonsterName(){
		return name;
	}
	public int getMonsterId(){
		return id;
	}
	public int getMonsterHp(){
		return hp;
	}

	
	//List of all Monster
	static Monster monster1 = new Monster("AlphaMon", 1, 500, Move.fire, Move.ice, Move.water, Move.dark);
	static Monster monster2 = new Monster("BetaMon", 2, 500, Move.fire, Move.ice, Move.water, Move.dark);
	
}
Move.java
Java:
public class Move {
	//variables
	private String name;
	private int damage;
	private int accuracy;
	
	//Constructor
	Move(String name, int damage, int accuracy){
		this.name = name;
		this.damage = damage;
		this.accuracy = accuracy;
	}
	
	//getter
	public String getMoveName(){
		return name;
	}
	public int getMoveDamage(){
		return damage;
	}
	public int getMoveAccuracy(){
		return accuracy;
	}
	
	//objects
	static Move fire = new Move("fire",50,90);
	static Move ice = new Move("ice",40,100);
	static Move water = new Move("water",45,95);
	static Move dark = new Move("dark",180,60);
}
und zu guter letzt die wichtige Turn.java
Java:
import java.awt.*;

public class Turn {
	

	static void turn(Move usedMove){
		Battle.setBattleChat(Battle.currentMonster.getMonsterName()+ " uses " + usedMove.getMoveName());
		Battle.labelChat.repaint();
		Battle.textAreaChat.setText(Battle.currentMonster.getMonsterName()+ " uses " + usedMove.getMoveName());
		Battle.textAreaChat.repaint();
	}
}
 
Und was genau wird davon jetzt nicht neu gezeichnet?

Wenn das Problem hier liegen sollte:
Java:
buttonMove1 = new JButton(currentMonster.getMonsterMove1().getMoveName());
und sich der Text nicht ändert, wenn sich currentMonster ändert, dann hilft dir auch repaint nicht, denn einmal gesetzt ist der Text fix, da gibt es keinen "Pointer" oder sowas der dauernd auf den moveName von currentMonster zeigt, sondern der Text wird einmal ausgewertet und dann im Button gespeichert (nämlich da wo du ihn anlegst).

Gruß
 
in der Turn.java wird der erste Zug ausgeführt. das wir dann über battleChat im labelChat angezeigt bzw im textAreaChat.
Java:
import java.awt.*;
 
public class Turn {
    
 
    static void turn(Move usedMove){
        Battle.setBattleChat(Battle.currentMonster.getMonsterName()+ " uses " + usedMove.getMoveName());
        Battle.labelChat.repaint();
        Battle.textAreaChat.setText(Battle.currentMonster.getMonsterName()+ " uses " + usedMove.getMoveName());
        Battle.textAreaChat.repaint();
    }
}
und ich denke immerhin JLabel sind nicht fix. es gibt ja immerhin die vordefinierte setText-methode
Java:
	public static void setBattleChat(String text){
		labelChat.setText(text);
	}
nur genau dieses label bzw. textarea wird nicht aktualisiert.

wo genau sollte denn dieses frame.add(this) hin.
 
habe mittlerweile das extends JFrame entfernt und das direkt über frame gemacht. kleiner Nebeneffekt ist, dass Komponenten erst sichtbar werden wenn ich das Fenster ändere. das ist aber egal das kann ich selber schon noch lösen.

aber immer noch zur alten frage: wie kann ich das Frame neuzeichnen lassen (bzw einen Teil davon) wenn sich der Inhalt (text von textfields) geändert hat.

hoffe ihr macht nur ne kleine pause nachdem ihr nun endlich den gewünschten code habt.
danke
 
setText der betreffenden Komponente sollte eigentlich ausreichen, teste mal ob die Methode aufgerufen wird.

Hier mal ein kleines Beispiel:
Java:
public class Main {
	public static void main(String[] args) {
		new Gui(new Model());
	}
}

Java:
public class Model {

	private int actionCounter = 0;
	
	public void action() {
		actionCounter++;
	}
	
	public int getActionCount(){
		return actionCounter;
	}

}

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

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


public class Gui {

	JFrame frame;
	JButton button;
	public Gui(Model model){
		frame = new JFrame("test");
		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		button = new JButton("Klicks: 0");
		button.addActionListener(new MyActionListener(model, button));
		frame.getContentPane().add(button);
		frame.pack();
		frame.setVisible(true);
	}
	
	private static class MyActionListener implements ActionListener{

		Model model;
		JButton buttonToUpdate;

		public MyActionListener(Model model, JButton buttonToUpdate) {
			this.model = model;
			this.buttonToUpdate = buttonToUpdate;
		}

		@Override
		public void actionPerformed(ActionEvent e) {
			model.action();
			buttonToUpdate.setText("Klicks: "+model.getActionCount());
		}
		
	}
}

Gruß
 

Neue Themen


Zurück
Oben