Render-Problem & Actionlistener

stockhausen

Grünschnabel
Hallo Zusammen,

mich plagen zur Zeit zwei Probleme:

1)

GUI beschreibung:
Wie in der Abbildung zu sehen ist, wird "Hello ?" innerhalb des Hauptpanels angezeigt.
Sobald der Anwender unten auf dem Knopf drückt, sooll der Inhalt des Hauptpanels gelöscht und neu gesetzt werden. In diesem Fall setzt die Methode "setNewContent()" ein neues Label innerhalb des Hauptpanels.

Screenshot:
http://img69.imageshack.us/img69/5808/000lh.jpg

Mein Problem:
Nachdem Setzten des Hauptpanels wird das neue Label "Hello World!" nicht angezeigt!
Erst wenn ich mit der Maus die Größe des Fensters ändere, wird das Fenster neu gerendert!

Was muss ich machen, damit die Änderung gleich sichtbar wird?


Code:

Code:
import java.awt.BorderLayout;
import java.awt.Dimension;
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 Test implements ActionListener {
	
	JFrame frame;
	JPanel mainPanel;
	
	public Test() {
		frame = new JFrame();
		frame.setMinimumSize(new Dimension(500, 300));

		mainPanel = new JPanel();
		mainPanel = new JPanel(new BorderLayout());
		mainPanel.add(new JLabel("Hello ?"), BorderLayout.NORTH);
		mainPanel.add(new JLabel(""), BorderLayout.CENTER);
		JButton button = new JButton("Save");
		button.addActionListener(this);
		mainPanel.add(button, BorderLayout.SOUTH);
		
		frame.add(mainPanel);
		
		frame.setLocationRelativeTo(null);
		frame.setSize(frame.getPreferredSize());
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
		frame.pack();
	}
	
	private void setNewContent() {
		mainPanel.remove(0);
		mainPanel.add(new JLabel("Hello World!"), 0);
		mainPanel.repaint();
		frame.repaint();
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getActionCommand() == "save") {
			System.out.println(e.getActionCommand());
		}
		setNewContent();
	}
	
	public static void main(String[] args) {
		Test test = new Test();
	}
	
}


2)

Mein button wurde mit einem ActionListener versehen.
Ich möchte gerne einen zweiten button anbringen und ebenfalls mit dem Label "save" versehen.

Code:
if(e.getActionCommand() == "save") {
 System.out.println(e.getActionCommand());
}

Wie kann ich die beiden Button voneinander unterscheiden? So wie ich vorgegangen bin, reagiert der Listener bei allen Buttons mit dem Label "save"!


Ich bin für jede Hilfe dankbar!

Gruß,
Michael
 
Java:
if(e.getActionCommand() == "save") {
 System.out.println(e.getActionCommand());
}

geht nicht!!

String vergleich immermit equals

also

Java:
if(e.getActionCommand().equals("save")) {
 System.out.println(e.getActionCommand());
}
 
Zuletzt bearbeitet:
In dem anderen Beispiel hab ich den ActionListener extra an ein MenuItem geadded.
Jedes MenuItem sollte einen eigenen ActionListener bekommen.
Meiner Meinung nach die bessere Methode. Ich lasse nie eine Klasse den ActionListener implementieren.
Ist in meinen Augen weniger fehleranfällig!
Wenn du in deinem Beispiel die "Beschriftung" des Buttons änderst, z.B. wegen Mehrsprachigkeit, musst du den Vergleich im ActionListener (equals("save")) ebenfalls ändern.

UPS hab dich verwechselt , wenn es dich interessiert:

http://www.tutorials.de/forum/swing...-bei-jframe-menue-text-anders-ausfuehren.html
 
Zuletzt bearbeitet:
Hallo Zusammen,

das Renderproblem besteht weiterhin.
Das Button Problem wurde gelöst. Thx!

@CPoly

mainPanel.repaint() habe ich bereits ausgeführt.

Code:
private void setNewContent() {
	mainPanel.remove(0);
	mainPanel.add(new JLabel("Hello World!"), 0);
	mainPanel.repaint();
	frame.repaint();
}

Die Änderung wird erst sichtbar, wenn ich das Fenster mit der Hand bzw. mit der Maus vergrößere bzw. verkleinere.

Gruß,
Michael
 
Zuletzt bearbeitet:
Bitte für die Lösung nicht schlagen :)

Was auf jeden Fall geht ist:

Java:
frame.setSize(501,300);
frame.setSize(500,300);

oder

Java:
frame.setSize(frame.getHight()-1, frame.getWidth() );
frame.setSize(frame.getHight()+1, frame.getWidth() );

Ist aber nur ein mega häßlicher workaround.
Nur für den Fall, dass es unbedingt laufen muss.
Ich weiß, dass das nicht die Lösung des Problems darstellt und schäme mich auch für
diesen Post.
 
Du hast ganz einfach invokeLater() vergessen.
Versuch es mal so, dann müsste es klappen:

Code:
import java.awt.BorderLayout;
import java.awt.Dimension;
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 Test implements ActionListener {
	
	JFrame frame;
	JPanel mainPanel;
	
	public Test() {
		frame = new JFrame();
		frame.setMinimumSize(new Dimension(500, 300));

		mainPanel = new JPanel();
		mainPanel = new JPanel(new BorderLayout());
		mainPanel.add(new JLabel("Hello ?"), BorderLayout.NORTH);
		mainPanel.add(new JLabel(""), BorderLayout.CENTER);
		JButton button = new JButton("Save");
		button.addActionListener(this);
		mainPanel.add(button, BorderLayout.SOUTH);
		
		frame.add(mainPanel);
		
		frame.setLocationRelativeTo(null);
		frame.setSize(frame.getPreferredSize());
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
		frame.pack();
	}
	
	private void setNewContent() {
		mainPanel.remove(0);
		mainPanel.add(new JLabel("Hello World!"), 0);
		mainPanel.repaint();
		frame.repaint();
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getActionCommand() == "save") {
			System.out.println(e.getActionCommand());
		}
		setNewContent();
	}
	
	public static void main(String[] args) {
                SwingUtilities.invokeLater(new Runnable() {
			
			@Override
			public void run() {
				Test test = new Test();		
			}
		});
		
	}
	
}
 
Zurück