Applet läuft nicht, Applet in Webseite einbinden

Xtr3m3 Lucky

Mitglied
Schönen guten Tag,

Ich weis dieses Thema hört sich wie ein typischer Anfängerfehler an, aber so leicht ist es diesmal leider nicht. Ich will ein Applet zum Bestellen von einem Produkt auf einer Webseite hochladen. Allerdings erhalte ich Diverse Fehlermeldungen bzw. kam es beim debuggen vor, das das Applet einfach nur ein weißes Feld darstellte und nichts weiter passierte. Ich stelle den Code nun hier zur Verfügung. Ich möchte anmerken das ich normalerweise nicht so schnell aufgebe und an einem Projekt dranbleibe, aber ich bin nun seit ca. 2 Wochen daran ohne das es vorangeht und mein Auftraggeber wird langsam ungeduldig. Ausserdem möchte ich schon im vorraus anmerken das ich sehr wohl weis das Klassennamen groß geschrieben werden 🙂

Dies ist mein HauptProgramm:

Java:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.swing.*;
import javax.swing.UIManager.LookAndFeelInfo;

public class hauptprogramm extends JApplet implements Runnable{


	private static final long serialVersionUID = 1L;
	private Thread tireStyle;
	private JTextField schrift;
	private Checkbox fett,kursiv;
	private JComboBox größe,font,anzahl;
	private DefaultComboBoxModel boxmodel;
	private JButton color,buy;
	private ButtonGroup buttongroup;
	private JLabel label,vorschau;
	private JPanel panel;
	private JFrame bestellen;
	private Font mainfont;
	private int weite,höhe;
	
	File[] files;
	Graphics hintergrund;
	Image background,buffer;
	
	static Color farbe=new Color(255, 255, 255);
	Color test=new Color(255,255,255);
	
	public hauptprogramm(){
		try {
		    for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
		        if ("Nimbus".equals(info.getName())) {
		            UIManager.setLookAndFeel(info.getClassName());
		            break;
		        }
		    }
		} catch (Exception e) {
		    // If Nimbus is not available, you can set the GUI to another look and feel.
		}
	}
	public void start()
	  {
	    this.tireStyle = new Thread(this);
	    this.tireStyle.start();
	    showStatus("started");
	  }

	  public void init()
	  {
	    if (this.tireStyle == null) {
	      start();
	    }
	    else
	    {
	      stop();
	    }
	    this.createGui(); 
	    this.createPane();
	  }

	public void createGui(){
		 try
		    {
			
			  URL url = new URL(getDocumentBase(), "tirestyle.jpg");
		      this.background = getToolkit().getImage(url);
		     
		      MediaTracker track = new MediaTracker(this);
		      track.addImage(this.background, 0);
		      track.waitForID(0);
		      this.weite = this.background.getWidth(null);
		      this.höhe = this.background.getHeight(null);
		      
		      setSize(this.weite, this.höhe);

		    }
		    catch (InterruptedException e)
		    {
		      System.out.println("Laden des hintergrundes unterbrochen");
		    }
		 	catch (MalformedURLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		
		
	}
	
	public void createPane(){
		
		String [] größen={"small","medium","big"};
		String [] numbers={"1","2","3","4"};
		boxmodel=new DefaultComboBoxModel();
		
		
		File file = new File(".\\fonts");  
		files = file.listFiles();  

		 for (int fileInList = 0; fileInList < files.length; fileInList++)  
		 {  
			String tt=files[fileInList].toString();
			int zahl=tt.lastIndexOf("\\");
			String wort=tt.substring(zahl);

			boxmodel.addElement(files[fileInList].toString().substring(zahl+1)); 
		
}  


		this.add(panel=new JPanel());
		panel.setLayout(null);
		panel.setSize(this.weite,this.höhe);
		
		panel.add(schrift=new JTextField("Beispiel"));
		panel.add(font=new JComboBox(boxmodel));
		panel.add(color=new JButton("Farbe"));
		panel.add(größe=new JComboBox(größen));
		panel.add(buy=new JButton("Bestellen"));
		panel.add(fett=new Checkbox("Fett"));
		panel.add(kursiv=new Checkbox("Kursiv"));
		panel.add(vorschau=new JLabel());
		panel.add(anzahl=new JComboBox(numbers));
		
		schrift.setBounds(69,201,265,30);
		font.setBounds(25,75,120,20);
		color.setBounds(155,75,100,20);
		größe.setBounds(265,75,100,20);
		buy.setBounds(265,100,100,30);
		fett.setBounds(30,105,50,20);
		kursiv.setBounds(90,105,55,20);
		vorschau.setBounds(35,260,330,100);
		anzahl.setBounds(155,105,100,20);
		anzahl.setSelectedIndex(3);
		
		color.addActionListener(new Farbe());
		buy.addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent arg0) {
			
				String size=(String) größe.getSelectedItem();
				String font=(String) boxmodel.getSelectedItem();
				boolean isfett= fett.getState();
				boolean iskursiv=kursiv.getState();
				int numbers=anzahl.getSelectedIndex();

				bestellen b= new bestellen(font,farbe,size,isfett,iskursiv,numbers);
				
				
			}
		});
		

		panel.add(label=new JLabel(new ImageIcon(".\\tirestyle.jpg")));
		label.setSize(this.höhe,this.weite);
		
	}
	public void aktualisiere(){
		
		int auswahl=font.getSelectedIndex();
		
		if(farbe.equals(test)){
			vorschau.setOpaque(true);
			vorschau.setBackground(Color.black);
		}
		else{
			vorschau.setOpaque(false);
			vorschau.setBackground(Color.white);
		}
		try {

			mainfont = Font.createFont(Font.TRUETYPE_FONT, files[auswahl]);

			if(fett.getState()==true&&kursiv.getState()==true){
				
				Font anzeige=mainfont.deriveFont(Font.ITALIC + Font.BOLD,30);
				vorschau.setFont(anzeige);
			
			}
			else if(fett.getState()==true){
				Font anzeige = mainfont.deriveFont(Font.BOLD, 30);
				vorschau.setFont(anzeige);
			}
			else if(kursiv.getState()==true){
				Font anzeige= mainfont.deriveFont(Font.ITALIC,30);
				vorschau.setFont(anzeige);
			}
			else{
				Font anzeige = mainfont.deriveFont(Font.PLAIN, 30);
				vorschau.setFont(anzeige);
			}
			
			
			
		} catch (FontFormatException e) {

		} catch (IOException e) {

		}

		vorschau.setForeground(farbe);
		vorschau.setText(schrift.getText());
	}
	
	public void run() {


		while(true){
			
			try{
				Thread.sleep(200);

				this.aktualisiere();
				this.repaint();
				
			}
			catch(Exception e){
				
			}
		}
	
		
	}
	 public void paint(Graphics g)
	  {
		 panel.updateUI();
		
	  }

}

Ich hoffe das soweit alles verständlich ist. In einem Ordner Fonts liegen hunderte .ttf Schriftarten, die in das Model der Combobox geladen werden und dann jeweils auf das Label angewendet werden, eine Auswahlmöglichkeit für die Farbe bietet folgende Klasse:

Java:
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JColorChooser;


public class Farbe implements ActionListener{

	
	public void actionPerformed(ActionEvent arg0) {
		
		Color c = JColorChooser.showDialog(null, 
	            "Farbauswahl", null);
		
		hauptprogramm.farbe=c;
	}

}

Hier ist noch die Klasse zum bestätigen der bestellung, befor dann in einer finalen und noch nicht fertiggestellten Klasse eine E-Mail an unseren Bestellservice gesendet wird:

Java:
import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;


public class bestellen extends JFrame{

	private static final long serialVersionUID = -1557892580855415976L;
	JLabel color;
	JTextArea ausgabe;
	JButton okay,abbrechen;
	
	public bestellen(String schrift,Color farbe, String größe, boolean fett, boolean kursiv, int anzahl){
		
		anzahl++;
		int Preis=7;
		this.setSize(400,400);
		this.setLocationRelativeTo(null);
		this.setTitle("Bestellung abschicken");
		this.setLayout(null);
		
		this.add(ausgabe=new JTextArea());
		this.add(okay=new JButton("Bestellen"));
		this.add(abbrechen=new JButton("Abbrechen"));
		
		ausgabe.setBounds(20,20,350,250);
		ausgabe.setEditable(false);
		okay.setBounds(20,300,100,20);
		abbrechen.setBounds(270,300,100,20);
		
		ausgabe.setText("Ihre Bestellung lautet wie folgt:\n\n" +
				"Schriftzug:" + schrift +"\n"+
				"Größe: " + größe + "\n" +
				"Anzahl: " + anzahl + "\n\n" +
				"Der Preis beträgt " + anzahl*Preis + " Euro.\n" +
				"Bitte Überweisen Sie das Geld an:\n"+
				"Kontodaten 1\n"+
				"Kontodaten 2 \n"+
				"Bankdaten\n\n" +
				"Als Überweisungsgrund geben Sie bitte ihre Adresse an.\n"+
				"Mit einem Klick auf Bestellen senden Sie den Auftrag ab,\n"+
				"nach erhalt des Geldes senden wir Ihnen Ihr Produkt");
		
		this.setVisible(true);
		
	}
}

Mir ist klar das das keine leichte Kost ist und wahrscheinlich erstmal von euch selbst kompiliert werden muss, befor ich Antworten erhalte. Zum Ausführen muss noch das Bild im Anhang in den Projektordner.


Beim debugging habe ich schon die Pfade zum Hintergrundbild geändert, da ich eine Acess Violation bekam, als ich den Pfad mit System.getProperty("user.dir"); abfragen wollte.

Das Aplett habe ich mit einer Batch File aus diesem Forum signiert, das hat auch nichts geholfen.
Ich habe alle möglichen Arten, ein Applet in eine Webseite einzubinden, ausprobiert, manche kamen weiter als andere, bei manchen bekam ich nur ein weißes Bild. Das Applet steht wirklich nur auf HTML Content, ohne ContentManagment System oder Websprachen.

Das Hintergrundbild ist sowohl AUF dem Applet, als auch auf dem Panel, eine Folge meiner anfänglichen double-Bufferung, die ich so übernommen habe.

Ich bin mit den Nerven am Ende, mein Auftraggeber sitzt mir im Nacken und ich habe noch mehr zu tun als 24/7 an einem Applet zu schreiben....
Ich bin auch gerne bereit, hier im Forum den anderen Usern mit Rat und Tat zur Seite zu stehen, allerdings MUSS ich diesen Auftrag fertig bekommen oder ich werde die nächsten Monate hungern....
(okay, das war übertrieben 😀)

L-ectron-X, kannst du mir aus meiner misslichen Lage helfen=? Natürlich bin ich auch dankbar für Antworten aller anderen User 🙂
 
Zuletzt bearbeitet von einem Moderator:
Ziemlich übler Chaoscode, aber man kann was daraus machen. Reichlich Stolpersteine hast du dir da eingebaut.
Nachdem ich den Code etwas umgestellt habe, kann ich zumindest schon mal im AppletViewer die Komponentenanordnung sehen.
Wozu brauchst du den extra Thread, der alle 200 ms neu zeichnet?
Wo liegen die Font-Dateien? Auf dem Server? Im Moment versuchst du nämlich die Fonts auf dem Client zu suchen...


Links ein Bild, nach dem ich dein Applet etwas umgebaut/bereinigt/verbessert habe. (Models noch nicht eingebunden)
Rechts ein Bild, nach dem ich den Pfad zu den Fonts (hier Systemfonts) in deinen Code eingesetzt habe.
Noch keine Spur von einem Hintergrundbild.
 

Anhänge

  • Buildup.jpg
    Buildup.jpg
    24,4 KB · Aufrufe: 38
  • tirestyle.jpg
    tirestyle.jpg
    24 KB · Aufrufe: 33
Zuletzt bearbeitet:
hallo, erstmal vielen dank

Das Neuzeichnen ist im Prinzip überflüssig, da hast du recht. Es war noch aus der vorherigen Version drin.
die Fonts liegen alle in einem Ordner namens Fonts im gleichen Verzeichnis auf dem Server. Zuerst hatte ich tatsächlich versucht, mit System.getProperty die Fonts zu suchen, bis ich realisiert habe, das ich damit den User-Pc durchsuche. Als momentanen Stand bekomme ich eine ClassNotFound Exception, ich glaube es mangelt an der Richtigen einbindung des Applets auf der Webseite. Vielleicht könntest du ja mal versuchen, das Applet in eine blanke Html Seite einzubinden. Ich bin für jeden Tipp dankbar.

MFG,
Xtr3m3 Lucky
 
Ich brauche noch gar nicht versuchen, das Applet einzubinden, wenn deine Version nur im AppletViewer läuft.
Bring den Code in Ordnung, poste nicht irgendwelche alten, nicht mehr relevanten Codeversionen von "letzter Woche", dann können wir das Applet einbinden.

Backslashes funktionieren nur unter Windows. Stelle deinen Code mal auf Slash um.
 

Zurück
Oben