Bild auf JApplet zeichnen

2.OhneNamen

Mitglied
Ich versuche seit Stunden mit verschiedensten Ansätzen ein Bild auf ein JApplet zu zeichnen, mittels Label ist das ja einfach, aber ich hätte es gerne mit der paint oder paintcomponent
[Java]
import java.applet.*;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class Nightbegins extends JPanel {

private static Icon[] Blau = {new ImageIcon("C:/Users/Manfred/Desktop/2.png")};
private static int b = 0;
private static int c = 0;



public static void main(String[] args)
{

run ();

}

public static void run () {
final int d = 0;

final JFrame meinFenster = new JFrame("N");
meinFenster.setTitle("JScrollPane Beispiel");
meinFenster.setSize(500,500);
meinFenster.setLocationRelativeTo(null);
meinFenster.setTitle("ShutTheWar EVOLUTION");
meinFenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JLabel bild = new JLabel(Blau );
bild.setBounds(250,250,10,10);

final Applet BildFenster = new Applet();
BildFenster.setBounds(0, 0, 10000, 10000);

JButton knopf = new JButton ("2");
knopf.setBounds(0, 0, 200, 50);
JButton knopf2 = new JButton ("1");
knopf2.setBounds(200, 0, 200, 50);
knopf.addActionListener(new ActionListener(){

public void actionPerformed(final ActionEvent e) {
int a = (int) (Math.random()*4+1);
if (a==1) {

}
else {
if (a==2){

}
else {
if (a==3){

}
else {

}
}
}
}
});



final JPanel panel = new JPanel();
panel.setBackground(Color.WHITE); panel.setLayout(null);
int v=ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS;
int h=ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS;
panel.setPreferredSize(new Dimension(10000, 10000 ));

JScrollPane scrollPane = new JScrollPane (panel,
v,
h);
knopf2.addActionListener(new ActionListener(){
public void actionPerformed(final ActionEvent e) {
int x = (int) (Math.random()*50+1);
int y = (int) (Math.random()*50+1);
int c = 1 + d;
int d = c;




}
});
BildFenster.add(new Zeichne());

panel.add(bild);
panel.add(knopf);
panel.add(knopf2);
panel.add(BildFenster);
meinFenster.setVisible(true);
meinFenster.getContentPane().add(scrollPane);


}
}

class Zeichne extends JApplet{
ImageIcon Gelb;
Image img1;
Image das;
Dimension Dimension;
MediaTracker TR = new MediaTracker (this);


public void paint(Graphics g){

Graphics2D g2 = (Graphics2D) g;

MediaTracker TR = new MediaTracker (this);
TR.addImage(das,0);
das = getImage(getCodeBase(), "f1.jpg");
setBounds(100, 100, 100, 100);
g.drawImage(img1, 200, 200, 200, 200, this);
repaint();

}
}
[/code]
Das ganze soll später einmal mehr werden, deswegen die scrollpane
 
Nein. Du fügst das JApplet dem Applet hinzu, das Applet aber nirgends. Keine Ahnung was du vorhast, aber wiederspricht das Hinzufügen eines Applets auf ein Fenster nicht dem Sinn eines Applets?
 
Ich habe das applet ja dem panel hinzugefügt ? Wo muss ich das hinzufügen?
Du verwurschelst hier einges. Entweder man entwickelt ein Applet (welches im Browser läuft) oder ein Applikation (z.B. in einem JFrame). Aber man steckt kein JApplet in einen JFrame oder eine seiner Komponenten.

Dann überschreibt man nach Möglichkeit weder die paint(Graphics) von JApplet oder JFrame. Sondern man erbst z.B. von JPanel und überschreibt dessen paintComponent(Graphics). Hierin lädt man auch keine Bilder (diese lädt man einmalig ausserhalb) sondern sieht zu dass der Code in der paint... möglichst schnell abgearbeitet werden kann.
Und schon gar nicht ruft man in der paint
Code:
repaint()
auf!
 
Warum?
Das funktioniert doch super.

Java:
package org.javaforum;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class PaintExample {
	public static void main(String[] args) {
		final BufferedImage img = createBufferedImage();
		
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				buildGui(img);				
			}
		});
	}
	private static void buildGui(final BufferedImage image) {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		frame.add(new JPanel() {
			protected void paintComponent(Graphics g) {
				super.paintComponent(g);
				g.drawImage(image, 0, 0, null);
			}
		});
		
		frame.setSize(200, 200);
		frame.setVisible(true);
	}

	private static BufferedImage createBufferedImage() {
		BufferedImage img = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
		Graphics g = img.getGraphics();
		g.setColor(Color.BLACK);
		g.drawOval(0, 0, img.getWidth(), img.getHeight());
		g.drawLine(30, 10, 30, 30);
		g.drawLine(69, 10, 69, 30);
		g.drawLine(10, 55, 90, 55);
		g.dispose();
		return(img);
	}
}
 
Warum?
Das funktioniert doch super.

Java:
package org.javaforum;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class PaintExample {
	public static void main(String[] args) {
		final BufferedImage img = createBufferedImage();
		
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				buildGui(img);				
			}
		});
	}
	private static void buildGui(final BufferedImage image) {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		frame.add(new JPanel() {
			protected void paintComponent(Graphics g) {
				super.paintComponent(g);
				g.drawImage(image, 0, 0, null);
			}
		});
		
		frame.setSize(200, 200);
		frame.setVisible(true);
	}

	private static BufferedImage createBufferedImage() {
		BufferedImage img = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
		Graphics g = img.getGraphics();
		g.setColor(Color.BLACK);
		g.drawOval(0, 0, img.getWidth(), img.getHeight());
		g.drawLine(30, 10, 30, 30);
		g.drawLine(69, 10, 69, 30);
		g.drawLine(10, 55, 90, 55);
		g.dispose();
		return(img);
	}
}

ich werde eine zeit lang brauchen um das zu verstehen, aber so könnte ich das irgendwie zum funktionieren bringen.
danke
 
Ich weiß wirklich nichtmehr was ich noch alles ausprobieren soll
das Applet habe ich jetzt weggelassen, zeichnen soll am Panel auch möglich sein aber es funktioniert nichts was ich ausprobiere
Eine antwort mit einer veränderten Version meines Bsp wäre sehr nett, hier nochmal wie ich es jetzt habe :
Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker; 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.awt.Toolkit;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
        
public class Nightbegins extends JPanel {
    
    private static Icon[] Blau = {new ImageIcon("C:/Users/Manfred/Desktop/2.png")};    
    private static int b = 0;
    private static int c = 0;
    
 

    public static void main(String[] args)
    {
        
     run ();   

    }
    
    public static void run () {
         
        final JFrame meinFenster = new JFrame("N");
        meinFenster.setTitle("JScrollPane Beispiel");
        meinFenster.setSize(500,500);
        meinFenster.setLocationRelativeTo(null);
        meinFenster.setTitle("ShutTheWar EVOLUTION");
        meinFenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
        final JLabel bild = new JLabel(Blau [b]);
        bild.setBounds(250,250,10,10); 
              
        final JPanel panel = new JPanel();
        panel.setBackground(Color.WHITE);  panel.setLayout(null);
        int v=ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS; 
        int h=ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS; 
        panel.setPreferredSize(new Dimension(10000, 10000 ));
      
        JScrollPane scrollPane = new JScrollPane (panel, 
            v,
            h);   
            
        panel.add(new Zeichne());
        panel.add(bild);
        meinFenster.setVisible(true);
        meinFenster.getContentPane().add(scrollPane);
    
        
        }
    }
    

    class Zeichne extends JPanel{
        
                Image das;
                MediaTracker TR = new MediaTracker (this);
                 
         public void init() {

                 TR.addImage(das,0);
                 das = Toolkit.getDefaultToolkit().getImage("f1.jpg");
                 setBounds(100, 100, 100, 100);
                }

        public void paintComponent(Graphics g){
            super.paintComponent(g);
                 g.drawImage(das, 200, 200, 200, 200, this);
     
       }
}
 
Zuletzt bearbeitet:
mein Post oben ist jetzt gekürzt, das meiste hier unnötige draußen
Sicher?
Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;


public class SimpleDraw {
	public static void main(String[] s) {
		new SimpleDraw();
	}
	
	public SimpleDraw() {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setBounds(0, 0, 200, 200);
		frame.add(new DrawingPanel());
		frame.setVisible(true);
	}
	
	class DrawingPanel extends JPanel {
		private Image img;
		
		public DrawingPanel() {
			this.setBackground(Color.WHITE);
			// zu Demozwecken einfach ein System Icon geladen
			img =  ((ImageIcon)UIManager.getIcon("OptionPane.informationIcon")).getImage();
		}
		
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			if (img!=null)
				g.drawImage(img, 10, 10, null);
		}
	}
}
 
Jetzt funkioniert es bei mir, danke.
Aber eine Frage habe ich noch, wieso wird das Bild bei
Java:
frame.add(new Zeichne());
angezeigt und bei
Java:
panel.add(new Zeichne());
nicht?
 
Vorm hinzufügen.
Das musst du doch bei jedem Komponenten der auf einen Null-Layout-Parent sitzt machen. Das JFrame hat das BorderLayout, das streckt den Mittelteil einfach über das gesamte ContentPane, falls keine Seitenteile hinzugefügt wurden.
 

Zurück
Oben