Automatischer repaint bei Swing so wie bei AWT?

  • Themenstarter Themenstarter Gast
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Gast

Gast
Hallo zusammen,

ich habe ein Fenster erstellt in dem ein wenig Text steht und ein Bild zu sehen ist.
Wenn ich dieses Fenster und die dazugehörige Menübar per AWT Programmiere und ich das Fenster außerhalb des Bildschirms und anschließend wieder rein ziehe, wird der Inhalt Automatisch repainted.

Wenn ich das Programm mit Swing (extends JFrame statt extends Frame und setJMenubar statt setMenubar) realisiere und es aus der Bildfläche rausziehe und anschließend wieder rein, muss ein manueller repaint erfolgen.

Weiß jemand wie ich das Problem bei Swing lösen kann?
Hab schon viel gelesen und gesucht aber nix gefunden!

Vielen Dank und viele Grüße!
 
Hast du in deinem Swing-Programm soetwas drin?

Code:
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    ... 

}
 
Ich habe zwar die zweite Zeile drin ( paint(Graphics g) ) drin, allerdings statt dem paintComponent(g) nur ein paint(g); . Wenn ich das ändere zu dem was du geschrieben hast, wird gar nichts mehr angezeigt.

Hier der Code:

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class wnd extends JFrame
{
int w = 800; //breite des Fensters
int h = 450; //höhe des Fensters
 
 public static void main(String[] args)
 {
 wnd fenster = new wnd(); 
 }

public wnd()
 {
 super("Fenster");
 setJMenuBar(getJMenubar());
 setLocation(300,300);
 setSize(w,h);
 setVisible(true);
 setResizable(false);
 setBackground(new Color(200,200,200));
 System.out.println("WINDOW OPENED");
 }

Image logo = Toolkit.getDefaultToolkit().getImage("img/logo.jpg");
public void paint(Graphics g)
{
 paintComponents(g);
 g.drawImage(logo,w-logo.getWidth(this),45,this);
 System.out.println("PAINT");
 g.setFont(new Font("Verdana",Font.PLAIN,12));
 g.drawString("wnd 1 2 3",51,101);
 System.out.println("DRAW");
}

public JMenuBar getJMenubar()
 {
	JMenuBar Jbar = new JMenuBar();
	ActionListener printListener = new ActionListener( )
	{
		public void actionPerformed(ActionEvent event)
		{	
		if (event.getActionCommand() == "REPAINT"){repaint();System.out.println("--> REPAINT");}
		if (event.getActionCommand() == "Speichern"){System.out.println("--> SAVE");}
		if (event.getActionCommand() == "Speichern Unter"){System.out.println("--> SAVE AS");}
		if (event.getActionCommand() == "Beenden"){System.out.println("--> WINDOW CLOSED");System.exit(0);}
		}
    };
	JMenu datei = new JMenu("Datei");
	JMenu dateisub = new JMenu("Speichern");
	JMenuItem item;
	datei.add(item = new JMenuItem("REPAINT"));
	item.addActionListener(printListener);
	dateisub.add(item = new JMenuItem("Speichern"));
	item.addActionListener(printListener);
	dateisub.add(item = new JMenuItem("Speichern Unter"));
	item.addActionListener(printListener);
	datei.add(dateisub);
	datei.add(item = new JMenuItem("Beenden"));
	item.addActionListener(printListener);
	Jbar.add(datei);
	return Jbar;
 }
}

Gruß!
 
Direkt im Frame zu zeichnen ist ungeschickt. Benutz lieber eine JComponent oder ein JPanel und überschreib dort statt paint die paintComponent.
 
Jop, das ist mir letztens auch so gegangen.. (manchmal gings, meistens nicht)

Am besten noch das contentPane mit einem JPanel ersetzen und das paintComponent überschreiben lassen.
 
Sorry ich versteh nicht genau was ihr meint mit dem was ich wem überschreiben soll.
Könntet ihr das vielleicht anhand von einem klitzekleinen Beispiel zeigen?
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben