LookAndFeel auf Gui Layout (externe Klasse) zugreifen

Redclipse

Mitglied
Hi Leute,

wie der Titel schon sagt möchte ich einen GUI Layout in Java (Eclipse) erstellen.

Einleitend:
- Für meine Studienarbeit soll ich ein Flugbuchungssystem erstellen
- ich möchte ein Design für mehrere Screens verwenden
- ich bitte euch mal die JPG Datei im Anhang zu öffnen



Bild:
- auf dem Bild sieht man mein Layout (mit Qualitätsverlust dank Paint :)) so wie ich es mir
ungefähr vorstelle
- Die Grün umkreisten Felder sind JLabels, die ich individuell übergeben möchte
- Die türkisen Rechtecke stellen Panels dar, die ich auch individuell übergeben möchte

Problem:
- da ich in Java, was Klassen betrifft nicht so fit bin benötige ich Eure Hilfe bei der Umsetzung.

Frage:
- Ist es möglich, dass ich eine Klasse erstelle mit dem Layout. Dieses Layout beinhaltet den Container im Hintegrund, das darauf liegende Panel mit Design und die Positionen (Größe) der übergebenen Labels, Panels.
- Kann ich viele verschiedene Klassen erstellen und dafür dieses Design verwenden? Ich möchte nur die Textfelder für jedes einzelne Screen Übergeben und den Transparenten Panel mit Inhalt, sowie den durchsichtigen Panel mit den Buttons.

Wie mache ich das am besten?
Vielen Dank im Voraus
 

javimka

Top Contributor
Ich würde dir empfehlen, Layouts zu kombinieren.
Aus deiner Zeichnung heraus, sehe ich z.B. auf den ersten Blick ein Hauptpanel mit einem BorderLayout. Im NORTH Teil kommt ein Panel mit "Willkommen" und dem Text rechts. In den SOUTH Teil kommt ein Panel mit den beiden Buttons (vielleicht ein EmptyBorder drumherum). In den mittleren CENTER Teil kommt ein Panel, das z.B. ein BoxLayout haben könnte in dem dann "Induvidual Airline" und des weisse Feld enthalten sind. Die Texte sind natürlich alle austauschbar.
Um das Bild im Hintergrund zu zeichnen, liesst du es mit der Klasse ImageIO ein und übergibst es dann deinem Hauptpanel. Das Hauptpanel ist natürlich eine eigene Klasse, die von JPanel erbt und wo du paintComponent(Graphics g) überschreibst. In diesem paintComponent, muss dann das Bild mit g.drawImage gezeichnet werden.
 

KrokoDiehl

Top Contributor
Spontan würde ich sagen, dass du dir eine abstrakte Klasse machst, die von JPanel erbt und darauf alles layoutest, bzw. alle grundsätzlichen Dinge dort erstellst. Via Getter / Setter / etc. kannst du dann die jeweiligen Texte und Teile setzen. Etwa so:

Java:
public abstract class BasicBookingPanel extends JPanel
{
    protected JLabel lblTitle   = null;
    protected JLabel lblWelcome = null;
    //...

    protected JPanel pnlMain    = null;
    protected JPanel pnlButtons = null;        

    // Konstruktor(en) und Layouting ...

    public void setWelcomeText(String welcomeText)
    {
        lblWelcome.setText(welcomeText);
    }

    public void setMainPanel(JPanel mainPanel)
    {
        //altes MainPanel entfernen
        if (pnlMain != null)
            this.remove(pnlMain);

        pnlMain = mainPanel;
        this.add(pnlMain, LayoutContraints); // je nach LayoutMgr
    }

    // usw.
}

Das mal so als Anreiz. Es ist an vielen Stellen sicherlich noch ausbaufähig ;)

Warum abstrakt? Ich habe dein Vorhaben so verstanden, dass du aufbauend auf dieser Basis mehrere (konkrete) Ansichten ableiten willst, daher halte ich das Prinzip der abstrakten Klasse hier für angebracht.

Wenn du solche Ansichten dann hast, kannst du sie z.B. in einem JFrame wie folgt benutzen:
Java:
BasicBookingPanel view = new ConcreteBookingPanel();
view.set ...

JFrame mainWindow = new JFrame("Mein tolles Fluch- ...äh, Flugbuchungssystem");
mainWindow.add(view, BorderLayout.CENTER);
mainWindow.pack();
...
 

Redclipse

Mitglied
Hi Leute danke für Eure Antworten.
Also ich verwende ein Null Layout. Und setze die größen + Positionen.
Ich möchte eine Klasse erstellen die auf mein Layout zugreift. Als übergabe soll er die 3 individuellen texte geben, den transparenten panel, und den ButtonPanel.
So dass ich immer dieses Layout verwende, aber individuell für mein persönliches Screen anpasse.

Hier mein Code:
(Ich weiß die Struktur etc. ist nicht fein, an manchen Stellen muss ich noch einiges verbessern)


[Java] package gui;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

/**...
* Login Version 1.0
*
* Das Layout zum Flugbuchungssystem
*
* */

public class Layout extends JFrame{
//Komponenten die benötigt werden (Variablen deffinieren)
Container backContainer; //Hintergrund in grau
JPanel LayoutPanel; //Panel auf dem Hintergrund mit Bild
JPanel IndividualPanel; //Transparenter Panel
JPanel ButtonPanel; //Panel für die Buttons

JLabel LayoutText, LayoutStrich, LayoutHelp, LayoutHeadline, LayoutBackground, LayoutBackground2;

public Layout() {
//Container bestimmen, Layout und Hintergrundfarbe setzen
backContainer = getContentPane();
backContainer.setLayout(null);

//LayoutPanel bestimmen, Layout setzen, Rahmen und Hintergrundfarbe setzen, dem Container hinzufügen
LayoutPanel = new JPanel();
LayoutPanel.setLayout(null);
LayoutPanel.setBackground(new Color(230,230,200));
LayoutPanel.setBorder(new SoftBevelBorder(SoftBevelBorder.RAISED, Color.red.darker(), Color.red));
backContainer.add(LayoutPanel);
LayoutPanel.setBounds(5,5,784,585);

//Komponenten erstellen
LayoutText = new JLabel("Willkommen");
LayoutHelp = new JLabel("Hilfe");
LayoutStrich = new JLabel("___________________________________________________________________" +
"___________________________________________");
LayoutHeadline = new JLabel("Individual Airline 2009");

//Schriftarten setzen
LayoutText.setFont(new Font("SansSerif", Font.PLAIN,18));
LayoutHelp.setFont(new Font("SansSerif", Font.ITALIC, 12));
LayoutHeadline.setFont(new Font("Calligraphic", Font.BOLD, 40));
LayoutHeadline.setHorizontalAlignment(SwingConstants.LEFT);
LayoutHeadline.setForeground(Color.white);

//Farben setzen
LayoutText.setForeground(Color.white);
LayoutHelp.setForeground(Color.blue);
LayoutStrich.setForeground(Color.red.darker());

//Positionen bestimmen und dem LayoutPanel hinzufügen
LayoutText.setBounds(7,5,500,35);
LayoutPanel.add(LayoutText);

LayoutHelp.setBounds(750,17, 50, 15);
LayoutPanel.add(LayoutHelp);

LayoutStrich.setBounds(7, 15, 800, 20);
LayoutPanel.add(LayoutStrich);

LayoutHeadline.setBounds(18,85,784,200);
LayoutPanel.add(LayoutHeadline);


// Individuellen Panel erstellen und transparent machen:
IndividualPanel = new Transparent(0.5f); //aus Transparent Klasse
IndividualPanel.setBounds(20,210,745,315); //Position, größe
IndividualPanel.setBorder(BorderFactory.createLineBorder(Color.red.darker())); //Rahmen
LayoutPanel.add(IndividualPanel); //dem Panel hinzufügen

//Button Panel erstellen
ButtonPanel = new JPanel();
ButtonPanel.setLayout(null);
ButtonPanel.setBounds(20,530, 745,50);
ButtonPanel.setBackground(Color.white);
ButtonPanel.setOpaque(false);
LayoutPanel.add(ButtonPanel);


// Notlösung für Hintergrundbild (im JPanel)
Icon Background = new ImageIcon("flugzeug11.jpg"); // weitere: flugzeug11.jpg , flugzeug, Background,
LayoutBackground = new JLabel(Background);
LayoutBackground.setBounds(2,2,781,582);
LayoutPanel.add(LayoutBackground);


/** Hier endet das Layout, ab jetzt beginnt die Füllung des individuellen und des Button panels */

//Button für "ButtonPanel" erstellen:
JButton Next = new JButton("Weiter");
Next.setFont(new Font("SansSerif", Font.BOLD,14));
Next.setBounds(590,5,100,30);
ButtonPanel.add(Next);


}
public static void main(String[] args) {
Layout fenster = new Layout();
fenster.setTitle("Hauptmenu");
fenster.setSize(800,625);
fenster.setLocationRelativeTo(null);
fenster.setVisible(true);
fenster.setResizable( false );
fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

}
[/code]
 

KrokoDiehl

Top Contributor
Was genau ist denn die Frage?

Generell rate ich aber von Null-Layouts ab, auch wenn es zu Beginn mit den absoluten Angaben einfacher aussieht. Aber was ist z.B. wenn das Fenster vergrößert/verkleinert wird? Was wenn du einen Text setzt, der viel größer ist, alls der JLabel Platz hat, usw. ... Null-Layouts stoßen schnell an ihre Grenzen und dann muss man manuell eingreifen, was definitiv nicht bequemer ist ;)

javimka hat z.B. schon ein paar Hinweise genannt, wie man es auch mit (kombinierten) LayoutManagern hinbekommt.
Tendentiell solltest du deinen Vorgabe-Frame (willst du wirklich einen Frame oder eher ein Panel?) allgemeiner aufbauen. Z.B. dein LayoutPanel in eine extra Klasse packen und dann via Getter + Setter die Texte / Objekte verfügbar machen (so wie in meinem ersten Beispiel).
 

Redclipse

Mitglied
Hi hab jetzt nochmals versucht es so zu machen wie du es beschrieben hast (mit der abstrakten Klasse.) Jedoch habe ich Probleme beim aufrufen dieser Klasse.
Habe jetzt noch nicht viel gemacht... nur paar kleinigkeiten zum testen.

meine abstrakte Layout Klasse:
Java:
package guiNeu;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

public abstract class Layout extends JPanel{
    // Komponente, die von anderen Klassen individuell übergeben werden
	protected JLabel lblTitle = null;
    protected JLabel lblWelcome = null;
    protected JLabel lblHelp = null;
    
    protected JPanel pnlMain    = null;
    protected JPanel pnlButtons = null;        
 
    
    public void setWelcomeText(String welcomeText)
    {
    	lblWelcome.setText(welcomeText);
    	lblWelcome.setForeground(Color.red);
    }
    
    public void setHelpText(String helpText)
    {
    	lblHelp.setText(helpText);
    	lblHelp.setForeground(Color.blue);
    }
    
    public void setTitleText(String titleText)
    {
    	lblTitle.setText(titleText);
    	lblTitle.setForeground(Color.white);
    }
 
    public void setMainPanel(JPanel mainPanel)
    {
        //altes MainPanel entfernen
        if (pnlMain != null)
            this.remove(pnlMain);
 
        pnlMain = mainPanel;
        this.add(pnlMain); // je nach LayoutMgr
    }
    	
    public void setButtonPanel(JPanel buttonPanel)
    {
    	//altes ButtonPanel entfernen
    	if (pnlButtons != null)
    		this.remove(pnlButtons);
    	
    	pnlButtons = buttonPanel;
    	this.add(pnlButtons);
    }
    
    /**----------------------  Beginn des Layouts --------------------*/
    
    protected JPanel pnlBackground; 		//Hintergrund
    protected JPanel pnlLayout;				//Das Layout Panel
    
    public Layout(){
    	
    	//Background Panel erstellen (in grau)
    	pnlBackground = new JPanel();
    	pnlBackground.setLayout(null);
    	pnlBackground.setBackground(Color.gray.brighter());		
    	pnlBackground.setBounds(0,0,800,600);
    	
    	//Layout Panel erstellen (auf dem BackgroundPanel)
		pnlLayout = new JPanel();
		pnlLayout.setLayout(null);	
		pnlLayout.setBackground(new Color(230,230,200));		
		pnlLayout.setBorder(new SoftBevelBorder(SoftBevelBorder.RAISED, Color.red.darker(), Color.red));
		pnlBackground.add(pnlLayout);	
		pnlLayout.setBounds(5,5,784,585);
		
		//Übergebene Panels & Labels ins Layout einbinden
		pnlLayout.add(lblWelcome);
		pnlLayout.add(lblTitle);
		pnlLayout.add(lblHelp);
		lblWelcome.setBounds(20,20,200,100);
		lblTitle.setBounds(100,300, 200,100);
    	lblHelp.setBounds(300,300,200,100);
    	
    	
    }
    
}

meine Beispiel Klasse mit der ich Layout aufrufen will und Werte übergeben will
Java:
package guiNeu;
import java.awt.*;
import javax.swing.*;

public class Beispiel extends JFrame{
	
	Layout view = new test();				// Fehlermeldung
	test.setWelcomeText("hallo");			// Fehlermeldung
	test.setTitleText("hey");				// Fehlermeldung
	test.setHelpText("Hilfe...");			// Fehlermeldung
	
	
	public static void main(String[] args) {
		Beispiel fenster = new Beispiel();
		fenster.setTitle("Hauptmenu");
		fenster.setSize(800,625);
		fenster.setLocationRelativeTo(null);
		fenster.setVisible(true);
		fenster.setResizable( false );
		fenster.add(view);					// Fehlermeldung
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
	}
	
}
 

KrokoDiehl

Top Contributor
Abstrakte Klassen dienen eher der Konzeption. Du kannst von ihnen keine Instanz bilden, sondern nur erben:
Java:
abstract class AbstractThing
{
}

class Thing extends AbstractThing
{
}

AbstractThing instance = new AbstractThing(); // das geht nicht, weil abstrakt
AbstractThing instance = new Thing(); // das geht
Für dein Beispiel kannst du das Wörtchen "abstract" weglassen. Mit abstrakter Klasse ist die Idee, dass du eine Basisklasse mit dem grundlegenden Layout verfasst, und dann von ihr konkrete Erben anlegst:
Java:
public abstract class BookingPanel; // abstrakte Oberklasse mit grundlegendem Layout
public class WelcomePanel extends BookingPanel; // konkrete Impl. vom Willkommensbildschirm
public class FlightSelection extends BookingPanel; // konkrete Impl. der Flugauswahl
...
Musst du selbst entscheiden, ob du das brauchst/willst oder ob dir eine nicht-abstrakte Klasse genügt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Welches Java Layout sollte ich verwenden? AWT, Swing, JavaFX & SWT 3
S Layout - Problem AWT, Swing, JavaFX & SWT 1
D Layout einer scene mit ListView Elementen und Zwei Textfeldern AWT, Swing, JavaFX & SWT 1
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
melaniemueller Layout wechseln über RadioButtons AWT, Swing, JavaFX & SWT 4
E LayoutManager Welcher Layout-Mix löst mein Problem? AWT, Swing, JavaFX & SWT 3
J Swing Hilfe bei Layout AWT, Swing, JavaFX & SWT 2
R Layered Layout AWT, Swing, JavaFX & SWT 1
E showAndWait is not allowed during animation or layout processing Memory FX AWT, Swing, JavaFX & SWT 2
newJavaGeek Grid-Layout problem AWT, Swing, JavaFX & SWT 7
E Swing Layout während der Laufzeit anpassen AWT, Swing, JavaFX & SWT 3
P JavaFX Zugriff auf Fenster/Layout-Container in eigenen Klassen AWT, Swing, JavaFX & SWT 5
R Layout Manager null und Component wird nicht hinzugefügt AWT, Swing, JavaFX & SWT 3
S Kann javafx.scene.layout.VBoxBuilder nicht importieren AWT, Swing, JavaFX & SWT 3
OSchriever Layout über Radiobuttons ändern AWT, Swing, JavaFX & SWT 4
B Swing Probleme mit dem Layout AWT, Swing, JavaFX & SWT 1
Hatsi09 JButton text layout AWT, Swing, JavaFX & SWT 9
I JavaFX - festes Layout AWT, Swing, JavaFX & SWT 1
S JavaFX TableView einzelne Zelle Layout zuweisen AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing Zwei gleichgroße Panels in einem Scrollpane mit Layout AWT, Swing, JavaFX & SWT 9
Neumi5694 Swing Card-Layout, Fokus AWT, Swing, JavaFX & SWT 2
kilopack15 Interface mit Layout verknüpfen AWT, Swing, JavaFX & SWT 2
Y Layout/Ausrichtungsprobleme AWT, Swing, JavaFX & SWT 4
T JavaFX Custom Layout AWT, Swing, JavaFX & SWT 5
A GUI Layout AWT, Swing, JavaFX & SWT 11
A Layout-Manager, JScrollPane, ... Chaos AWT, Swing, JavaFX & SWT 5
L wie Layout-Grid in JXPanel anzeigen? AWT, Swing, JavaFX & SWT 5
L Eigene Component Layout AWT, Swing, JavaFX & SWT 4
Soloeco LayoutManager Wie und welches Layout nutze ich am Besten? AWT, Swing, JavaFX & SWT 13
M LayoutManager Modalen JDialog ein Layout zuweisen AWT, Swing, JavaFX & SWT 3
M LayoutManager Layout reagiert nicht auf Constraints AWT, Swing, JavaFX & SWT 4
IsSchoGuat LayoutManager Layout-Containergrösse AWT, Swing, JavaFX & SWT 4
F GridBag Layout AWT, Swing, JavaFX & SWT 1
Z Absolutes Layout / Kontrolle über Anordnung AWT, Swing, JavaFX & SWT 3
M Mehrere Jpanel in einem JScrollPane (Layout) AWT, Swing, JavaFX & SWT 2
M Layout-Probleme unter Swing AWT, Swing, JavaFX & SWT 5
D LayoutManager GUI skalieren und deren Komponenten mit Grid(Bag)Layout-Manager. AWT, Swing, JavaFX & SWT 5
J ComboBoxModel addElement verändert Layout AWT, Swing, JavaFX & SWT 8
E Probelm mit Layout AWT, Swing, JavaFX & SWT 1
B Hilfe welches Layout brauch ich AWT, Swing, JavaFX & SWT 4
P Tipps für GUI-Layout AWT, Swing, JavaFX & SWT 2
M Passender Layout-Manager AWT, Swing, JavaFX & SWT 3
M LayoutManager Layout zur Laufzeit ändern AWT, Swing, JavaFX & SWT 8
N Swing Zweifarbiges Layout für den Filechooser AWT, Swing, JavaFX & SWT 12
B LayoutManager Card Layout AWT, Swing, JavaFX & SWT 2
E Angehängtes Layout, aber wie? AWT, Swing, JavaFX & SWT 12
1 Eigenes Layout schreiben AWT, Swing, JavaFX & SWT 4
B SWT layout invalidieren in SWT? AWT, Swing, JavaFX & SWT 4
R Welchen Layout Manager/ Wie strukturieren? AWT, Swing, JavaFX & SWT 14
J Layout: oben 20% unten 80% AWT, Swing, JavaFX & SWT 12
T Layout für Listendarstellung AWT, Swing, JavaFX & SWT 3
F LayoutManager Null-Layout unter Linux im TreeCellEditor AWT, Swing, JavaFX & SWT 3
K Eclipse Layout (Gimp Layout, Tiled Layout...) AWT, Swing, JavaFX & SWT 4
C LayoutManager Passendes Layout gesucht AWT, Swing, JavaFX & SWT 2
M Layout funktioniert nicht AWT, Swing, JavaFX & SWT 3
dzim Layout von Panes in JFX2 AWT, Swing, JavaFX & SWT 17
H Layout Idee AWT, Swing, JavaFX & SWT 8
M Swing Dynamisches Layout AWT, Swing, JavaFX & SWT 10
P Swing welchen Layout Manager verwenden AWT, Swing, JavaFX & SWT 9
J LayoutManager Komponentenaustausch zerschießt Layout AWT, Swing, JavaFX & SWT 4
F Layout-Problem AWT, Swing, JavaFX & SWT 2
K Gui Layout Frage AWT, Swing, JavaFX & SWT 5
B Anderen Layout-Manager verwenden AWT, Swing, JavaFX & SWT 17
E Null-Layout - Wie geht es ohne? AWT, Swing, JavaFX & SWT 19
Furtano AWT mehrere Bilder in einen Frame zeichnen + Layout Manager AWT, Swing, JavaFX & SWT 10
L Swing dynamisches Image-Panel in Layout einbinden AWT, Swing, JavaFX & SWT 10
D Bild in JPanel verschiebt Layout. Wie fixieren? AWT, Swing, JavaFX & SWT 9
GUI-Programmer Wieder ne Layout Frage AWT, Swing, JavaFX & SWT 11
GUI-Programmer LayoutManager Kurze Layout Frage - eine komponente mittig? AWT, Swing, JavaFX & SWT 5
D Problem mit 3-Spalten Layout AWT, Swing, JavaFX & SWT 17
ARadauer Wenig Material zum Thema: Design, Layout, Usability von Swing Anwendungen AWT, Swing, JavaFX & SWT 11
S LayoutManager Welcher LayoutManager für dieses zweispaltige Layout? AWT, Swing, JavaFX & SWT 13
G LayoutManager Layout welches von Links nach rechts anordnet mit TOP Alignment! AWT, Swing, JavaFX & SWT 5
A Best practice für konkretes Layout AWT, Swing, JavaFX & SWT 10
G LayoutManager Layout für Spalten AWT, Swing, JavaFX & SWT 8
A Layout/JPanelgröße AWT, Swing, JavaFX & SWT 6
S pack() bei null-Layout AWT, Swing, JavaFX & SWT 10
C SWT Tabellen-Layout in StyledText? AWT, Swing, JavaFX & SWT 6
J LayoutManager Welchen Layout/Design-Manager? AWT, Swing, JavaFX & SWT 4
R Swing Layout setzen AWT, Swing, JavaFX & SWT 3
L Layout automatische Anpassung umgehen? AWT, Swing, JavaFX & SWT 5
A Problem mit Layout-Manager AWT, Swing, JavaFX & SWT 11
J Button Layout anpassen AWT, Swing, JavaFX & SWT 22
H LayoutManager Layout mit GridBagLayout machbar? AWT, Swing, JavaFX & SWT 6
B Buttongröße im Layout AWT, Swing, JavaFX & SWT 4
B LayoutManager Layout Problem AWT, Swing, JavaFX & SWT 14
O LayoutManager Layout entwerfen AWT, Swing, JavaFX & SWT 3
A diverse Layout-Fragen AWT, Swing, JavaFX & SWT 4
F LayoutManager Eigenes Layout die Lösung?! AWT, Swing, JavaFX & SWT 4
dzim SWT Layout mit Sections aus Eclipse Forms AWT, Swing, JavaFX & SWT 17
F JScrollPane verwirft Layout von JPanel AWT, Swing, JavaFX & SWT 2
C LayoutManager Layout und vergrößern des Frames AWT, Swing, JavaFX & SWT 5
E Swing Runde Buttons / Position eines Obj. im Layout AWT, Swing, JavaFX & SWT 7
S Swing UI-Elemente ordnen sich ungewollt in einer Reihe (ohne Layout) AWT, Swing, JavaFX & SWT 5
A Ungewollte Layout änderungen AWT, Swing, JavaFX & SWT 3
A Suche: Eclipse-GUI-Layout AWT, Swing, JavaFX & SWT 5
E JPanel mit Null Layout entfernt Buttons AWT, Swing, JavaFX & SWT 11
N Swing Layout positionieren AWT, Swing, JavaFX & SWT 2
B Methode setzt nicht das Layout in einer if-Abfrage AWT, Swing, JavaFX & SWT 13
H LayoutManager Dynamisches Layout AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben