Image im Panel neu zeichnen

Kai Cierpka

Grünschnabel
Einen schönen guten Tag.
Ich habe ein Problem mit meinem implementierten Interface. Ich lade ein Bild (Image) und will über Buttons dieses in der Größe verändern und anschließend neu zeichnen. Und hier liegt das Problem: Es wird nicht nur das Image neu gezeichnet sondern alle Elemente (Buttons usw.) im Frame. Sorry für meine schlecht Erklärung.^^ Ich füge hier mal Bilder ein damit man sich das besser Vorstellen kann.

Code:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.TitledBorder;


class Schlachtfeld extends JPanel{ 

	MediaTracker    mt=new MediaTracker(this); 
	Image Gelände = getToolkit().getImage("E:/Uni Dateien/Diplomarbeit/Bilder Diplom/terrain-large_Java.jpg"); 
	int x1=100, y1=100, x2=250, y2=250; 
		
	public Schlachtfeld(){ 
		mt.addImage(Gelände, 0); 
		try { mt.waitForID(0); } catch(Exception e) { } 
	} 
 
	public void paintComponent(Graphics g) {
		super.paintComponents(g);
		g.drawImage(Gelände,x1,y1,x2,y2,this);
	}
	
	public void setSize_Image(int x, int y){
		x2 = x;
		y2 = y;
		repaint();
	}
}

public class RoboterAuswahl extends JFrame{

		
		static int width=600;
		static int high=500;
		static int Button_high=25;
		static int Button_width=90;
		static int Button_Abstand=20;
		static int Button_top_Abstand=80;
		static int Textfield_high=200;
	    static int Textfield_width=100;	
		static int X_Schlachtfeld;
		static int Y_Schlachtfeld;
	    static int X_Wert;
	    static int Y_Wert;
	    
	    
	    static String winClassName = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
		static Dimension D;
		
		static JTabbedPane Register;
		static RoboterAuswahl Auswahl;
		
		static JPanel 	panel_Roboter,panel_Regeln;	
		
		public static void main(String [] args){
			Hauptfenster();
		}
		
		class CMeinWindowLauscher extends WindowAdapter{
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}
		}
		
		class CMeinActionLauscher implements ActionListener{
			public void actionPerformed(ActionEvent e){
			}
		}
		
		public static void Hauptfenster(){
			Auswahl=new RoboterAuswahl("Auswahl der Roboter");
			try {
			    UIManager.setLookAndFeel(
			      UIManager.getSystemLookAndFeelClassName() );
				} catch( Exception e ) { e.printStackTrace(); }
			SwingUtilities.updateComponentTreeUI(Auswahl);
			D = Toolkit.getDefaultToolkit().getScreenSize()  ;
			Auswahl.  setLocation  ( (D.width-width) / 2,(D.height-high) / 2 );
			Auswahl.pack();
			Auswahl.setSize(width,high);
			Auswahl.setResizable(false);
			Auswahl.show();
		}
		
				
			RoboterAuswahl(String titel){
			
			super(titel);
			
			JPanel panel_Roboter= new JPanel();
			JPanel panel_Regeln= new JPanel();
			JPanel panel_Button= new JPanel();
			final Schlachtfeld panel_Schlachtfeld = new Schlachtfeld();
			
			getContentPane().setLayout(new BorderLayout());
			
			Register=new JTabbedPane();
			
//			---------------------Registerkarte Roboter---------------------------
			panel_Roboter.setLayout(null);
				
			JLabel Info=new JLabel(" Hier folgt die Beschreibung");
			Info.setLocation(100,300);
			Info.setSize(400,90);
			Info.setBorder( new TitledBorder ("Beschreibung des Roboters"));
			panel_Roboter.add(Info);	
			
			JLabel Ueberschrift=new JLabel("Wähle deinen Roboter für die Schlacht");
			Ueberschrift.setLocation(10,2);
			Ueberschrift.setSize(200,50);
			panel_Roboter.add(Ueberschrift);			
			
			JButton Add=new JButton("Add");
			Add.setLocation(width/2-Button_width/2,Button_top_Abstand);
			Add.setSize(Button_width,Button_high);
			panel_Roboter.add(Add);
			
			JButton Add_all=new JButton("Add_all");
			Add_all.setLocation(width/2-Button_width/2,Button_top_Abstand+Button_high);
			Add_all.setSize(Button_width,Button_high);
			panel_Roboter.add(Add_all);
			
			JButton Remove=new JButton("Remove");
			Remove.setLocation(width/2-Button_width/2,Button_top_Abstand+(2*Button_high)+(3*Button_Abstand));
			Remove.setSize(Button_width,Button_high);
			panel_Roboter.add(Remove);
			
			JButton Remove_all=new JButton("Remove_all");
			Remove_all.setLocation(width/2-Button_width/2,Button_top_Abstand+3*(Button_high+Button_Abstand));
			Remove_all.setSize(Button_width,Button_high);
			panel_Roboter.add(Remove_all);
		
			File path=new File("E:/");
			File files[]=path.listFiles();
						
			JList List_Robot = new  JList ( files );
			List_Robot.setLocation(20,60);
			List_Robot.setSize(Textfield_width,Textfield_high);
			List_Robot.setBorder( new TitledBorder("Klassen"));
		
			panel_Roboter.add(List_Robot);
			
			List_Robot.addMouseListener(new MouseAdapter(){
				public void mouseClicked(MouseEvent e){
					if(e.getClickCount()==1){
						System.out.println(((JList)e.getSource()).locationToIndex(e.getPoint()));
					}
						
				}
			});
			
			File path1=new File("C:/");
			File files1[]=path1.listFiles();
			
			JList Auswahl_Roboter = new  JList ( files1 );
			Auswahl_Roboter.setLocation(140,60);
			Auswahl_Roboter.setSize(Textfield_width,Textfield_high);
			Auswahl_Roboter.setBorder( new TitledBorder("Packages"));
			panel_Roboter.add(Auswahl_Roboter);
			
			final String Roboter_Daten[] ={""};
			JList Roboter_Add = new  JList ( Roboter_Daten );
			Roboter_Add.setLocation(400,60);
			Roboter_Add.setSize(Textfield_width,Textfield_high);
			Roboter_Add.setBorder( new TitledBorder("Roboter"));
			panel_Roboter.add(Roboter_Add);
								
			Register.addTab("Roboter",panel_Roboter);
//			---------------------Registerkarte Schlachtfeld---------------------------

			panel_Schlachtfeld.setLayout(null);
			
			JButton Größe600=new JButton("600x600");
			Größe600.setLocation(Button_Abstand,Button_Abstand);
			Größe600.setSize(Button_width,Button_high);
			panel_Schlachtfeld.add(Größe600);
			
			JButton Größe800=new JButton("800x800");
			Größe800.setLocation(Button_Abstand+Button_width,Button_Abstand);
			Größe800.setSize(Button_width,Button_high);
			panel_Schlachtfeld.add(Größe800);
			
			JButton Größe1000=new JButton("1000x1000");
			Größe1000.setLocation(Button_Abstand+2*Button_width,Button_Abstand);
			Größe1000.setSize(Button_width,Button_high);
			panel_Schlachtfeld.add(Größe1000);
			
			JButton Größe1500=new JButton("1500x1500");
			Größe1500.setLocation(Button_Abstand+3*Button_width,Button_Abstand);
			Größe1500.setSize(Button_width,Button_high);
			panel_Schlachtfeld.add(Größe1500);
			
			JButton Größe2000=new JButton("2000x2000");
			Größe2000.setLocation(Button_Abstand+4*Button_width,Button_Abstand);
			Größe2000.setSize(Button_width,Button_high);
			panel_Schlachtfeld.add(Größe2000);
			
			JButton Größe5000=new JButton("5000x5000");
			Größe5000.setLocation(Button_Abstand+5*Button_width,Button_Abstand);
			Größe5000.setSize(Button_width,Button_high);
			panel_Schlachtfeld.add(Größe5000);
		
			JSlider Slider_Hori=new JSlider(400,5000);
			Slider_Hori.setOrientation(JSlider.HORIZONTAL);
			Slider_Hori.setLocation(150,370);
			Slider_Hori.setSize(300,20);
		
						  
			JSlider Slider_Verti=new JSlider(400,5000);
			Slider_Verti.setOrientation(JSlider.VERTICAL);
			Slider_Verti.setLocation(450,70);
			Slider_Verti.setSize(20,300);
					
			
			panel_Schlachtfeld.add(Slider_Verti);
			panel_Schlachtfeld.add(Slider_Hori);
		
			Register.addTab("Schlachtfeld",panel_Schlachtfeld);
				
//---------------------Registerkarte Regeln---------------------------
			panel_Regeln.setLayout(null);
			Register.addTab("Regeln",panel_Regeln);
			
			
//			---------------------Untere Buttonreihe---------------------------
			panel_Button.setLayout(new GridLayout(1,5,10,10));
			
			JButton back=new JButton("Zurück");
			panel_Button.add(back);
			JButton next=new JButton("Weiter");
			panel_Button.add(next);
			JLabel blank1=new JLabel("");
			panel_Button.add(blank1);
			JButton battle=new JButton("Battle starten");
			panel_Button.add(battle);
			JButton cancel=new JButton("Cancel");
			panel_Button.add(cancel);
					
			getContentPane().add("South",panel_Button);
			
			
			getContentPane().add(Register);
			addWindowListener(new CMeinWindowLauscher());
			
			
			List_Robot.addMouseListener(new MouseAdapter(){
				public void mouseClicked(MouseEvent e){
					if(e.getClickCount()==1){
						
						System.out.println(((JList)e.getSource()).locationToIndex(e.getPoint()));
					}
						
				}
			});
			
//			---------------------ActionListener Untere Buttonleiste---------------------------			
			cancel.addActionListener(new CMeinActionLauscher());
		    cancel.addActionListener( new ActionListener() {
		          public void actionPerformed(ActionEvent e) {
		          System.exit(0);
		          }
			} );
		    		  
		    back.addActionListener(new CMeinActionLauscher());
         	back.addActionListener( new ActionListener() {
		    	public void actionPerformed(ActionEvent e) {
		    		int tab=Register.getSelectedIndex();
		    		if(tab>=1)
		    		Register.setSelectedIndex(tab-1);
		    		((JPanel)Register.getSelectedComponent()).requestDefaultFocus();
		    	}
		    } );
         	next.addActionListener(new CMeinActionLauscher());
 		    next.addActionListener( new ActionListener() {
 		    	public void actionPerformed(ActionEvent e) {
 		    		int tab=Register.getSelectedIndex();
 		    		if(tab<2)
 		    		Register.setSelectedIndex(tab+1);
 		    		((JPanel)Register.getSelectedComponent()).requestDefaultFocus();
 		    	}
 		    } );
         	
//			---------------------ActionListener Auflösungsbuttons---------------------------
         	
         	Größe600.addActionListener(new CMeinActionLauscher());
         	Größe600.addActionListener( new ActionListener() {
		          public void actionPerformed(ActionEvent e) {
		          X_Wert=600;
		          Y_Wert=600;
		          getX_Schlachtfeld();
		          getY_Schlachtfeld();
		          }
			} );
		    Größe800.addActionListener(new CMeinActionLauscher());
		    Größe800.addActionListener( new ActionListener() {
		          public void actionPerformed(ActionEvent e) {
		            X_Wert=800;
			        Y_Wert=800;
			        getX_Schlachtfeld();
			        getY_Schlachtfeld();
			        panel_Schlachtfeld.setSize_Image(X_Wert,Y_Wert);
			        //panel_Schlachtfeld.repaint();
		          }
			} );
		    Größe1000.addActionListener(new CMeinActionLauscher());
		    Größe1000.addActionListener( new ActionListener() {
		          public void actionPerformed(ActionEvent e) {
		            X_Wert=1000;
			        Y_Wert=1000;
			        getX_Schlachtfeld();
			        getY_Schlachtfeld();
		          }
			} );
		    Größe1500.addActionListener(new CMeinActionLauscher());
		    Größe1500.addActionListener( new ActionListener() {
		          public void actionPerformed(ActionEvent e) {
		            X_Wert=1500;
			        Y_Wert=1500;
			        getX_Schlachtfeld();
			        getY_Schlachtfeld();
		          }
			} );
		    Größe2000.addActionListener(new CMeinActionLauscher());
		    Größe2000.addActionListener( new ActionListener() {
		          public void actionPerformed(ActionEvent e) {
		            X_Wert=2000;
			        Y_Wert=2000;
			        getX_Schlachtfeld();
			        getY_Schlachtfeld();
		          }
			} );
		    Größe5000.addActionListener(new CMeinActionLauscher());
		    Größe5000.addActionListener( new ActionListener() {
		          public void actionPerformed(ActionEvent e) {
		            X_Wert=5000;
			        Y_Wert=5000;
			        getX_Schlachtfeld();
			        getY_Schlachtfeld();
			     }
			} );
		   		        
		}
		
		public int getX_Schlachtfeld(){
			X_Schlachtfeld=X_Wert;
			System.out.println(X_Schlachtfeld);
			return X_Schlachtfeld;
		}
		
		public int getY_Schlachtfeld(){
			Y_Schlachtfeld=Y_Wert;
			System.out.println(Y_Schlachtfeld);
			return Y_Schlachtfeld;
		}
				
		public void actionPerformed(ActionEvent e){
			int tab=Register.getSelectedIndex();
			tab=(tab>=Register.getTabCount()-1?0:tab+1);
			Register.setSelectedIndex(tab);
			((JPanel)Register.getSelectedComponent()).requestDefaultFocus();
		}
}

Es folgen zwei Bilder meines Problems.

Danke im vorraus und sorry für diesen schreckligen Post (ist meine erster).
 

Anhänge

  • Java_1.jpg
    Java_1.jpg
    33,7 KB · Aufrufe: 240
  • Java_2.jpg
    Java_2.jpg
    34,1 KB · Aufrufe: 226
Zum einen sieht es aus als ob die Buttons für die Größe da doppelt gemalt werden.
Sowas kam bei mir schon mal vor und konnte dadurch behoben werden, das die Komponente darunter ein setOpaque(false) bekommen hat.
Deine JSlider haben ja eine feste Position, daher bleiben sie einfach da wo sei sind.
Die könnte man auch mit nem anderen Layout an die Ränder verteilen.

Wenn man mit den JSlidern allerdings das BIld scrollen soll, wäre es besser, wenn du eine JScrollPane benutzt in die du das gesamte Bild legst.
Dann wären die Scrollbalken wenn nötig vorhanden.
 

Neue Beiträge

Zurück