LayoutManager Main layout auf andere Class Dateien verweisen?

Doppelherz

Mitglied
Moin Leute,
finde grad echt gar nicht einen Beispielcode zu folgendem Befehl und hoffe auf eure Hilfe 🙂

Ich möchte ein Layout basteln mit North, West und so. Und in mein North wollte ich ein Logo einfügen. Komplizierterweise möchte ich das nicht in meine Layoutdatei sondern in eine externe Javadatei auslegen und darauf zugreifen. Wie macht man sowas denn geschickt?
 
Was hast du vor?? Was ist denn eine Layout-Datei. Und Layouts werden auch nicht auf Classes angewendet.

Wenn du einen ähnlichen Aufbau in allen Panels willst (z.b. immer oben ein Logo), dann mach dir eine Abstrakte Klasse von der dann alle Panels erben müssen.
 
Öhm, ich kann das nur kompliziert erklären wie ich mir das gedacht habe. Ich hab in eclipse eine .Java Klasse, in der die Main ist. Diese Datei soll nur für das grobe Layout und das Schließen über das X in der Ecke gut sein. Und mit groben Layout meine ich dieses Borderlayout mit North, Center usw. Und in den einzelnen Panels sollen andere .Java Dateien aufgerufen werden. West soll zum beispiel eine Navigation Java Datei aufrufen, North eine Java Datei, in der einfach nur ein Jpeg als Background anzeigt. Und so soll dann aus dem layout über andere Dateien mein mehr oder minder schönes Progrämmchen gestaltet werden 🙂

Java:
contentPane.setLayout(new BorderLayout());
	  
// Hier fehlt wohl was	  
	  
	  contentPane.add(LOGO, BorderLayout.NORTH);
	  contentPane.add(NAVIGATION, BorderLayout.WEST);
	  contentPane.add(MAIN, BorderLayout.CENTER);
	  
	  setContentPane(contentPane);
 
Zuletzt bearbeitet:
Dann mach doch einfach eine Klasse die das Layout erstellt und die packst du in ein JFrame.

willst du zur Laufzeit den MAIN-Part austauschen?? wenn nein, mach wie ich es dir gesagt habe. Du machst eine abstrakte Klasse, die das Layout macht und die instanzierst du dann und setzt den MAIN-Part
 
Hab die Klasse, die das Layout erstellt, gebastelt und rufe sie über JFrame auf. Nur weiß ich halt nicht, wie ich in dem layout auf andere Klassen aus anderen Dateien zugreifen kann 🙁 Ich zeig einfach mal den gesamten Code:

So sieht meine GUI.java aus:
Java:
package eShop.local.ui.gui;

import java.awt.*;
import java.io.IOException;
import java.awt.Window;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

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

public class eShopGUI extends JFrame {

public eShopGUI() {
	  super("Musicstore");
	  
	  JPanel contentPane = new JPanel();
	  
	  contentPane.setLayout(new BorderLayout());
	  
// LOGO verweist auf eine Logo.java im selben Ordner ( Zeigt ein Bild )
// NAVIGATION verweist auf eine Navi.java im selben Ordner ( Zeigt eine Navigation )
// CENTER verweist auf eine Center.java im selben Ordner ( Zeigt sämtlichen Krams )

	  contentPane.add(LOGO, BorderLayout.NORTH);
	  contentPane.add(NAVIGATION, BorderLayout.WEST);
	  contentPane.add(CENTER, BorderLayout.CENTER);
	  
	  setContentPane(contentPane);  
  }
  
  public static void main (String[] args){
	  JFrame rahmen = new eShopGUI();
	  WindowListener listener = new WindowAdapter() {
		  public void windowClosing(WindowEvent we){
			  System.exit(0);
		  }
	  };
	  
	  rahmen.addWindowListener(listener);
	  rahmen.setSize(600, 800);
	  rahmen.setVisible(true);
  }
  
}

und so sieht bisher meine Logo.java aus:
Java:
package eShop.local.ui.gui;
import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class Logo extends JFrame{
private static final String FILENAME = "logo.jpg";

@SuppressWarnings("deprecation")
public static void main(String args[]) { new Logo().show();}
private static final int sizex = 600;
private static final int sizey = 108;

public Logo(){
try {
Image im = ImageIO.read(new File(FILENAME));
ImagePanel panel = new ImagePanel(im);
JScrollPane pane = new JScrollPane(panel);
pane.setBounds(0,0,sizex,sizey);
getContentPane().add(pane);
this.setSize(sizex,sizey);
} catch (IOException e) { 
	System.out.println("musicstore Logo kann nicht angezeigt werden. Logo-Datei nicht gefunden!");
	}
}

public class ImagePanel extends JPanel {

private Image im;
public ImagePanel(Image im) { super(); this.im = im; }
public void paint(Graphics g) { if (im != null) { g.drawImage
(im,0,0,this); } }
public void setBounds() { setBounds(0,0,im.getWidth
(this),im.getHeight(this)); }
}
}
 
Deine Klasse Logo als JFrame ist überflüssig. Nimm einfach nur das ImagePanel und packe es in den NORTH deines eShopGUI-JFrame.

Was genau du mit deiner Layout-Klasse meinst kann ich immer noch nicht ganz nachvollziehen!!
 
Dass Logo von JFrame erbt macht in dem Zusammenhang keinen Sinn. Entweder Logo direkt von JPanel oder JScrollPane (?? willst da wirklich eine ScrollPane) erben lassen oder in der Klasse eine Methode implementieren, die das imagePanel oder die ScrollPane zurück gibt.

Je nach dem, dann in Deiner GUI Klasse ein Objekt von Logo erzeugen und entweder dieses Objekt oder das was die Methode zurückgibt in das Layout einfügen.

Ansonsten:
- bei Swing Komponenten überschreibt man die paintComponent(Graphics g) anstelle der paint(Graphics g)
- ein bisschen was zu LayoutManagern und Oberflächenprogrammieren lesen
 
Wo genau liegt jetzt dein Problem?

Du hast eine Datei ImagePanel.java die nicht weiter ist als JPanel wo du das Image lädst und zeichnest.
Dann hast du noch dein Gui.java wo du im konstruktor oder sonstwo in den North-Bereich eine Instanz deines ImagePanels legst. Fertig!
 
Ich weiß aber nicht wie
Das ist aber eine Grundlage, die man beherrschen sollte, bevor man mit GUI Programmierung anfängt. ;-)
Hier mal ein zwei Bsp Klassen/Dateien. Hab's allerdings nicht getestet, ob das so funktioniert wie ich mir's gedacht habe. Aber es zeigt wie man in einer Klasse ein Objekt einer anderen Klasse erzeugt.
Java:
import ...
public class GUI extends JFrame {
	MyComponent comp;
	
	public GUI() {
		comp = new MyComponent();
		comp.setPreferredSize(new Dimension(123, 30));
		this.getContentPane().add(comp, BorderLayout.NORTH);
	}
	
	public static void main(String[] s) {
		GUI gui = new GUI();
		gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		gui.setBounds(0, 0, 200, 200);
		gui.setLocationRelativeTo(null);
		gui.setVisible(true);
	}
}
Java:
import...
public class MyComponent extends JPanel {
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.setColor(Color.RED);
		g.fillRect(5, 5, 100, 20);
	}
}
 
Ja klasse, nach und nach wird das hier was. Und ja, es sind sicherlich die Grundkenntnisse bei GUI, aber das ist auch die erste, die ich baue ^^ Nun meckert der aber bei dem zweiten Punkt rum, wenn ich die Navigation über diesen Weg einbauen will:

Java:
          logo = new Logo();
	  logo.setPreferredSize(new Dimension(800, 100));
	  this.add(logo, BorderLayout.NORTH);
	  navi = new Navi();
	  this.add(navi, BorderLayout.WEST);
bei this.add wird das add rot 🙁
 

Zurück
Oben