Applet JApplet Problem

SirBaros

Bekanntes Mitglied
Hallo ich möchte gerne ein Bild und ein Button in einem Applet anzeigen lassen.
In Eclipse funktioniert das Applet mit dem Code super. Nur wenn ich es in eine Html einbinde und mit dem Browser starte erscheint nur das Bild und nicht der Button.

Woran liegt das?

Java:
public class TestFrame extends JApplet {

	private Image img;

	public void init() {
		setSize(900, 670);
		Container ct = getContentPane();
		ct.setLayout(null);// Null-Layout
		ct.setBackground(Color.WHITE);

		JButton bt = new JButton("Button");
		bt.setBounds(10, 400, 50, 50);

		img = getImage(getDocumentBase(), "picture.jpg");

		ct.add(bt);

	}

	public void paint(Graphics g) {

		g.drawImage(img, 0, 0, this);

		g.setColor(new Color(3, 4, 97));
		g.drawLine(0, 122, 900, 122);

	}

}

Hier Html Code
Java:
<html>
  <title> TestApp</title>
  <body bgcolor=#cccccc>
    <font face="verdana" size="2">  
    <br>
    TestAnwendung
	<br>
	</font>
	<P ALIGN=center>
	<Applet code="TestFrame.class" Height="670" Width="900"></P>


	</Applet>

</body>	

</html>
 
Probiers mal mit nem
Code:
validate();
hinter
Code:
ct.add(bt);
. Wenn das nicht reicht, noch ein
Code:
repaint();
dranhängen.
 
Das liegt daran, weil du die paint()-Methode überschreibst.
Mach das alles in einem JPanel, überschreibe dort zum Zeichnen die paintComponent()-Methode und setze das JPanel dann ins JApplet.
 
Danke L-extron-X. Ist das so richtig? Es funktioniert so immer noch nicht.
Java:
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;

import javax.swing.ImageIcon;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

public class TestFrame extends JApplet {

	private Image img;
	private Graphics g;

	public void init() {
		setSize(900, 670);
		Container ct = getContentPane();
		ct.setLayout(null);// Null-Layout
		ct.setBackground(Color.WHITE);

		JButton bt = new JButton("Button");
		bt.setBounds(10, 400, 50, 50);

		img = getImage(getDocumentBase(), "picture.jpg");

		JPanel p = new JPanel();
		p.setLayout(null);
		g = p.getGraphics();
		

		ct.add(p);
		p.add(bt);
	}

	public void paint(Graphics g) {

		g.drawImage(img, 0, 0, this);

		g.setColor(new Color(3, 4, 97));
		g.drawLine(0, 122, 900, 122);

	}

}
 
L-ectron-X hatte Dir empfohlen die paintComponent-Methode zu überschreiben. Du überschreibst immer noch die paint-Methode.
 
Ok habs mit PaintComponent versucht, geht immer noch net. Hab den Code genommen von meinem vorletzten Post und habe diese Methode überwschrieben. Funktionert net.

Java:
   public void paintComponent(Graphics g) {
 
        g.drawImage(img, 0, 0, this);
 
        g.setColor(new Color(3, 4, 97));
        g.drawLine(0, 122, 900, 122);
 
    }
 
}
 
Überschreibst du da wirklich etwas? Setz mal ein
Code:
@Override
vor die Methode, um sicherzugehen.
Du solltest die
Code:
paintComponent(Graphics)
vom JPanel überschreiben. Dort dann als erstes Statement das
Code:
super.paintComponent(Graphics)
nicht vergessen! Außerdem solltest du mal nen LayoutManager nehmen. So, wie es momentan ist, dürfte das JPanel gar nicht erst bei dir angezeigt werden.
 
Mhh ich krieg des nicht hin. Kannst mir bitte mal mein Code abändern. Komm nicht vorran. Er bringt mir fehler wenn ich @override dazumache... danke
 
JApplet besitzt keine Methode paintComponent(Graphics) die man überschreiben könnte.
Versuchs doch mal mit dem Hinweis von L-extron-X:
Verwende ein JPanel füge darin den JButton ein und überschreibe dessen paintComponent(Graphics). Diese JPanel fügst Du dann ins JApplet ein.
L-extron-X hat gesagt.:
Mach das alles in einem JPanel, überschreibe dort zum Zeichnen die paintComponent()-Methode und setze das JPanel dann ins JApplet.
Grundsätzlich sollte man keine paint(Graphics) einer Swing Kompontene überschreiben, wenn man nicht genau weiss, was man da macht.
 
Kein Wunder, dass es einen Fehler gibt. Schließlich hat JApplet/JFrame keine
Code:
paintComponent(Graphics)
. So wars gemeint:
Java:
ct.add(new JPanel() {
	@Override
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.drawImage(img, 0, 0, this);
		g.setColor(new Color(3, 4, 97));
		g.drawLine(0, 122, 900, 122);
	}
});
Falls dir das Ganze etwas merkwürdig vorkommt, dann mach dich mal über anonyme Klassen schlau.
 
Hier mal einer von mehrere möglichen Lösungsansätzen:

Java:
//Zeichnen auf einen Container (JPanel), welcher dem JApplet als Hintergrund hinzugefügt wird:
import javax.swing.*;
import javax.imageio.*;
import java.awt.*;
import java.net.*;
import java.io.*;


public class PictureApplet extends JApplet {
   private Image image;

   public void init() {
      setContentPane(new MyContentPane());

      try {
         image = ImageIO.read(new URL(getCodeBase(), "Bild.jpg"));
      }
      catch(IllegalArgumentException iae) {
         JOptionPane.showMessageDialog(this, "Grafikdatei nicht gefunden!");
      }
      catch(IOException ioe) {
         JOptionPane.showMessageDialog(this, "Fehler beim Einlesen der Grafikdatei!");
      }

   }

   private class MyContentPane extends JPanel {
      private MyContentPane() {
        setLayout(new GridBagLayout());
        JButton b = new JButton("Klicken!");
        add(b);
      }

      public void paintComponent(Graphics g) {
         super.paintComponent(g);
         if(image != null) {
            g.drawImage(image, 0, 0, this);
         }
      }
   }
}
 
Hi L-extron-X Danke nochmal. Meine letzte Frage wie kann ich dann wenn ich den Button klicke ein neues leeres JPanel im Applet anzeigen lassen? Hab eine extra interne klasse erzeugt TestPane (dein Code erweitert) und teile der Klasse dem setContentPane zu. Eine Idee?

Java:
private class MyContentPane extends JPanel implements ActionListener {
		private MyContentPane() {
			setLayout(new GridBagLayout());
			JButton b = new JButton("Klicken!");
			b.addActionListener(this);

			add(b);
		}

		public void actionPerformed(ActionEvent ev) {
			setContentPane(new TestPane());
			

		}

		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			if (image != null) {
				g.drawImage(image, 0, 0, this);
			}
		}

               private class TestPane extends JPanel{
		private TestPane() {
			
			setLayout(new BorderLayout());
			JButton bt = new JButton("GEIL");

			add(bt,BorderLayout.SOUTH);
		}
	}
 
Weder JPanel noch die Klasse MyContentPane besitzt eine Methode setContentPane(...)

Ansonsten muss bei GUI Änderungen zur Laufzeit mindestens ein validate() auf dem Container aufgerufen werden.
 
Zuletzt bearbeitet:
@Blakh: Ziemlich wahrscheinlich ist das so. Wird aber aus dem Kontext nicht deutlich und ist auch nicht gerade objektorientiert.

@SirBaros: Muss es unbedingt immer ein neues JPanel sein? Warum? Denn sonst könnte man z.B. mittels CardLayout zur Laufzeit die angezeigten Komponenten "austauschen"
 
Und wie kann ich bei dem Code von L-extron-X z.b. durch den Button klick ein neues JPanel öffnen und das alte löschen bzw verschwinden lassen? Hab ne neue Interne Klasse erzeugt.
 
Das Ganze noch mal mit einem Teil von deinem Code, etwas objektorientierter und mit CardLayout umgebaut. Das könnte so aussehen:

Das Applet:
Java:
import javax.swing.*;
import javax.imageio.*;
import java.awt.*;
import java.net.*;
import java.io.*;
import java.awt.event.*;


public class PictureApplet extends JApplet implements ActionListener {
   private Image image;
   private TestPanel tp;
   private MyContentPane cp;
   private JPanel cards;

   public void init() {
      setLayout(new BorderLayout());
      try {
         image = ImageIO.read(new URL(getCodeBase(), "Bild.jpg"));
      }
      catch(IllegalArgumentException iae) {
         JOptionPane.showMessageDialog(this, "Grafikdatei nicht gefunden!");
      }
      catch(IOException ioe) {
         JOptionPane.showMessageDialog(this, "Fehler beim Einlesen der Grafikdatei!");
      }
      
      cards = new JPanel(new CardLayout());

      cp = new MyContentPane(this, image);
      cards.add(cp, "MyContentPane");
      
      tp = new TestPanel(this);
      cards.add(tp, "TestPanel");
      
      add(cards, BorderLayout.CENTER);
   }
   
   public void actionPerformed(ActionEvent e) {
      JButton source = (JButton)e.getSource();
      if(source.getText().equals("GEIL")) {
         showMyContentPane();
      }
      else if(source.getText().equals("Klicken!")) {
         showTestPanel();
      }
   }
   
   public void showTestPanel() {
      CardLayout cl = (CardLayout)(cards.getLayout());
      cl.show(cards, "TestPanel");
   }
   
   public void showMyContentPane() {
      CardLayout cl = (CardLayout)(cards.getLayout());
      cl.show(cards, "MyContentPane");
   }

}

Das MyContentPane:
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class MyContentPane extends JPanel {
    private Image image;
    
    public MyContentPane(PictureApplet pa, Image image) {
        this.image = image;
        setLayout(new GridBagLayout());
        JButton b = new JButton("Klicken!");
        b.addActionListener(pa);

        add(b);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (image != null) {
            g.drawImage(image, 0, 0, this);
        }
    }


}

und das TestPanel:
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TestPanel extends JPanel {

    public TestPanel(PictureApplet pa) {
        setLayout(new BorderLayout());
        JButton bt = new JButton("GEIL");
        bt.addActionListener(pa);

        add(bt, BorderLayout.SOUTH);
    }

}

Wenn ich jetzt keine Fehler eingebaut habe, sollte das so funktionieren.
 
Zuletzt bearbeitet:

Zurück
Oben