Paint-Methode geht nicht

  • Themenstarter Themenstarter ToGross
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
T

ToGross

Gast
Also ich habe folgendes Problem:

Code:
public class testframe {

	public static void main(String[] args) throws Exception{
		MyFrame frame = new MyFrame();
		
		...

		// Hintergrundbild zeichnen
		frame.setbackground(image);
		
		// Eigenschaften von frame setzen
		frame.setUndecorated(true);
		frame.setExtendedState(frame.MAXIMIZED_BOTH);
		frame.setVisible(true);

		// Text im Frame zeichnen - FEHLER
		frame.paint(frame.getGraphics(),"test",400,400,Color.red,"Arial-BOLD-40");
	}
}

Code:
public class MyFrame extends JFrame implements KeyListener{
	public void setbackground(String URL){
		JScrollPane scrollPane;
		final ImageIcon icon = new ImageIcon(URL);
		Image image;
		Dimension d = getSize();
		JPanel panel = new JPanel()
		{
			protected void paintComponent(Graphics g)
			{
				//  Dispaly image in max. size
				g.drawImage(icon.getImage(), 0, 0, null);
				super.paintComponent(g);
			}
		};
		panel.setOpaque( false );
		panel.setPreferredSize(new Dimension(d.width,d.height));
		scrollPane = new JScrollPane( panel );
		getContentPane().add( scrollPane );	
				
	}

	public void setbackground(BufferedImage img){
		JScrollPane scrollPane;
		final ImageIcon icon = new ImageIcon(img);
		Image image;
		Dimension d = getSize();
		JPanel panel = new JPanel()
		{
			protected void paintComponent(Graphics g)
			{
				g.drawImage(icon.getImage(), 0, 0, null);
				super.paintComponent(g);
			}
		};
		panel.setOpaque( false );
		panel.setPreferredSize(new Dimension(d.width,d.height));
		scrollPane = new JScrollPane( panel );
		getContentPane().add( scrollPane );	
		
	}

		
	public void keyPressed(KeyEvent event){
	}
	public void keyReleased(KeyEvent event){	
	}
	public void keyTyped(KeyEvent event){
	}
	
	public void paint(Graphics g,String text,int x, int y, Color color, String font){
		{
			g.setFont(Font.decode(font));
			g.setColor(color);
			g.drawString(text,x,y);			
			super.paint(g);
		}
	}

}


Fehlerbeschreibung:
frame.setbackground(image); geht genau so, wie ich mir das vorgestellt habe, aber sobald ich die paint-Methode aufrufe blinkt der Text kurz auf und verschwindet wieder.
Ich vermute mal, dass JPanel (panel) in das ich das Hintergrundbild zeichne wieder in den Vordergrund rückt.


Irgendwelche lösungsvorschläge?
Muss ich den Text der paint-Methode auf mein JPanel (panel) zeichnen?

PS: Ich hoffe ich habe mein Problem im richtigen Forum geschrieben. Handelt sich ja fast nur um java.awt
 
1. der super.paint(g) muss zu erst erfolgen

2. Die Methodensignatur deiner paint()-Methode entspricht nicht der evt. zu überschreibenden Methode.
public void paint(Graphics g)
 
Code:
...
        MyTextComponent.createTextComponent(frame, "test",400,400,Color.red,"Arial-BOLD-40");
...
class MyTextComponent extends JComponent{
    private String text = "";
    private int x;
    private int y;
    private Color color;
    private String font;
    public static Integer TEXT_LAYER
            = new Integer(JLayeredPane.FRAME_CONTENT_LAYER.intValue()
            + 1);
    public MyTextComponent(String text, int x, int y, Color color, String font) {
        this.text = text;
        this.x = x;
        this.y = y;
        this.color = color;
        this.font = font;
    }
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);        
        g.setFont(Font.decode(font));
        g.setColor(color);
        g.drawString(text,x,y);
    }
    public static void createTextComponent(JFrame frame, String text, int x, int y, 
            Color color, String font){
        MyTextComponent textComponent = new MyTextComponent(text, x, y, color, font);
        textComponent.setOpaque(false);
        Dimension screenSize =
                Toolkit.getDefaultToolkit().getScreenSize();
        textComponent.setBounds(0, 0, (int)screenSize.getWidth(), (int)screenSize.getHeight());
        frame.getLayeredPane().add(textComponent, TEXT_LAYER, 0);
    }
}
 
Erstmal ein Dankeschön für den Quellcode!!

Ich habe es nun so gemacht:

Code:
class MyTextComponent extends JComponent{
	private String text = "";
	private int x;
	private int y;
	private Color color;
	private String font;
	public static Integer TEXT_LAYER = new Integer(JLayeredPane.FRAME_CONTENT_LAYER.intValue()+ 1);


	public void createTextComponent(JFrame frame, String text, int x, int y, Color color, String font){
		this.text = text;
		this.x = x;
		this.y = y;
		this.color = color;
		this.font = font;
        
		this.setOpaque(false);
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		this.setBounds(0, 0, (int)screenSize.getWidth(), (int)screenSize.getHeight());
		frame.getLayeredPane().add(this, TEXT_LAYER, 0);
    	}
	
	public void removeTextComponent(int timeout){
		try{
			System.out.println("Methode removeTextComponent aufgerufen!");
			this.wait(timeout);
			this.setVisible(false);
		}
		catch(Exception e){
			
		}
	}
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);       
        g.setFont(Font.decode(font));
        g.setColor(color);
        g.drawString(text,x,y);
    }
}

Code:
...
MyTextComponent test = new MyTextComponent();
int count;
...
test.createTextComponent(frame,"Test",400,400,Color.red,"Arial-BOLD-40");
...
test.removeTextComponent(2000);
...

Naja ... ich hätte gern, dass ich das "gezeichnete" (MyTextComponent test) wieder löschen kann (nach einer bestimmten zeit)

Ich habe das mit der Methode removeTextComponent() versucht, geht aber nicht.
Mit Thread.sleep(timeout) geht es auch nicht!

Also wie kann ich der JComponent wieder löschen?
Wichtiger -> Wie bekomme ich die Zeitverzögerung hin?
 
Code:
   public void removeTextComponent(int timeout){
        timer = new javax.swing.Timer(timeout, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                setVisible(false);
                timer.stop();
            }
        });
        timer.start();
    }
 
Danke für deine Bemühungen!

Ich habe gerade eine ähnliche Lösung gefunden:

Code:
import java.util.Timer; //Ein anderer Timer
...
	public void removeTextComponent(int timeout){
		final JComponent a = this;
		Timer timer = new Timer();

		timer.schedule(new TimerTask() {
			public void run() {
				a.setVisible(false);
			}
		},timeout);
	}
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben