Swing Erste Schritte mit der GUI, viele Probleme

markus99

Bekanntes Mitglied
Hallo erstmal!
Ich arbeite mich schon etwas länger mit einem Buch in Java ein.
Nur beinhaltet diese Lektüre keinerlei GUI-Elemente, leider.

Nun habe ich versucht mal mein erstes Programm mit GUI zu schreiben und scheitere bereits an den einfachsten Sachen.

Wo habe ich hier einen Denkfehler?

Es geht um folgendes:
Es gibt eine Hauptklasse, MainDialog.java.
Diese Hauptklasse soll Dialog-Elemente aus andere Klassen laden, wie z.B. aus der Klasse MainDialogTitleMenu und MainDialogAdapterList.

Edit: Das Hauptproblem mit der JMenuBar habe ich gelöst, es lag an der setLayout(new FlowLayout()); (keine ahnung, bin eben neu). Außerdem habe ich die Positionierung über BorderLayout.PAGE_START wieder aktiviert - und siehe da, es macht ausnahmsweise was ich will. Wenn das nur schon alle Probleme gewesen wären ... Die anderen stehen immer noch hier :)

Problem 1:
JMenuBar! Egal wie ich die implementiere, sie werden immer "zentriert" ausgerichtet, sprich im Vorschau-Dialog werden die Felder auf die größe der Menü-Einträge reduziert und dann auch noch zentriert. Egal ob ich sie in der MainDialog Klasse über ein bestimmtes BorderLayout aufrufe oder dem ganzen seiner Natur überlasse, das Ergebnis ist immer dasselbe. Und ich bekomme es einfach nicht hin die JMenuBar in ihrer Größe zu beeinflussen. Es gibt Methoden für Hintergrundbilder, aber keine um z.B. ein MouseOver(Hover) Effekt farblich anders zu unterlegen? Schande über mich, entweder denke ich zu kompliziert oder gar nicht.

Problem 2:
Ich habe es auch nach X versuchen noch nicht geschafft ein List Objekt zu initialisieren und brauchbar zu machen. Der unten gezeigte Code wurde etwa 50 mal komplett durcheinander auskommentiert, verschmückt, verschönert, auseinandergerissen und wieder auf das Wesentliche gekürzt. Mein Ziel war es ein Listen-Element in der Klasse "MainDialogAdapterList" zu erstellen und dieses über die Hauptklasse "MainDialog" zu laden. Alle weiteren Kernfunktionen sollten dabei in der MainDialogAdapterList stattfinden (ich wollte dort durch eine HashMap mit einem kleinen Out of the Box Erlebnis sämtliche Windows-Netzwerkadapter auslesen). Aber ich bekomme ja nicht mal die Liste hin.

Problem 3:
Wird schon in Problem#1 beschrieben, ich möchte meine Objekte einfach statisch positionieren können, weiß aber nicht wo und wie ich das erreichen kann.
Wenn ich mir Muster von anderen JMenuBar Codes ansehe, dann werden die immer Hauptfenster erstellt und geladen - und sind auch 100% horizintal gestreckt, sowie links oben ausgerichtet. Ich würde gerne die X und Y Koordinaten meiner Objekte selbst bestimmten, so wie deren Größe (es soll ein statisches Fenster werden). Wenn ich diese Methoden auf meinen Objekten anwende, dann verschwinden sie entweder oder es zeigt sich einfach keine Änderung, es ist zum Haareraufen.

Edit: Ich arbeite mit Eclipse

Die MainDialog.java
Java:
import javax.swing.*;
import java.awt.*;

public class MainDialog 
{
	//->Auflösungsermittlung für Zentrierung
	private static int mainDisplayWidth = 500;
	private static int mainDisplayHeight = 500;
	private static int mainDisplayPositionWidth = 0;
	private static int mainDisplayPositionHeight = 0;
	//<-Auflösungsermittlung für Zentrierung
	
	public static void main(String[] args) 
	{
		try
		{
			//Info für das Forum: Es ist egal ob mit oder ohne, alles schon getestet
			//->WebLookAndFeel style
			UIManager.setLookAndFeel(com.alee.laf.WebLookAndFeel.class.getCanonicalName());
			//<-WebLookAndFeel style
		}
		catch ( Throwable e )
		{
			//TODO
		}
		
		MainDialog g = new MainDialog();
	}
	
	public MainDialog()
	{
		//->Auflösungsermittlung für Zentrierung
		Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
		int resolutionWidth = (int) dim.getWidth();
		int resolutionHeight = (int) dim.getHeight();
		mainDisplayPositionWidth = resolutionWidth/2-mainDisplayWidth/2;
		mainDisplayPositionHeight = resolutionHeight/2-mainDisplayHeight/2;
		//<-Auflösungsermittlung für Zentrierung
		
		//-> Dialog-Settings
		MainDialogDetails maindialog = new MainDialogDetails();
		maindialog.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//->Auflösungsermittlung für Zentrierung
		maindialog.setLocation(mainDisplayPositionWidth, mainDisplayPositionHeight);
		maindialog.setSize(mainDisplayWidth, mainDisplayHeight);
		maindialog.setAlwaysOnTop(true);
		maindialog.setResizable(false);
		//<-Auflösungsermittlung für Zentrierung

		//->Titlemenue
		MainDialogTitleMenue menuframe = new MainDialogTitleMenue();
		maindialog.add(menuframe.menuebar,BorderLayout.PAGE_START);
		//<-Titlemenue

		maindialog.setVisible(true);

		//<- Dialog-Settings

	}
}


MainDialogDetails.java
Java:
import javax.swing.*;
import java.awt.*;

public class MainDialogDetails extends JFrame
{
	private static final long serialVersionUID = 526887145372086141L;
	private JLabel maindialogdetails;
		
	public MainDialogDetails()
	{
		super("Title bar");
		setLayout(new FlowLayout());
		//maindialogdetails = new JLabel(""); //Das war die Wurzel allen Übels
		//maindialogdetails.setToolTipText("Beispiel Tooltip");
		add(maindialogdetails);
	}
}


Die MainDialogTitleMenue.java (ja mit e :D)
Java:
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public  class MainDialogTitleMenue implements ActionListener
{
	JMenuBar menuebar = new JMenuBar();
	JMenu datei = new JMenu("Datei");
	JMenu tools = new JMenu("Tools");
	JMenu hilfe = new JMenu("Hilfe");
	
	//Datei
	JMenuItem beenden = new JMenuItem("Beenden");
	//Tools
	JMenuItem optionen = new JMenuItem("Optionen");
	//Hilfe
	JMenuItem ueber = new JMenuItem("Über");
	
	
	public MainDialogTitleMenue()
	{
		menuebar.add(datei);
		menuebar.add(tools);
		menuebar.add(hilfe);
		
		datei.add(beenden);
		tools.add(optionen);
		hilfe.add(ueber);
		
		datei.addActionListener(this);
		tools.addActionListener(this);
		hilfe.addActionListener(this);
		
		beenden.addActionListener(this);
		optionen.addActionListener(this);
		ueber.addActionListener(this);

		menuebar.setFocusable(false);	
       }

       @Override
       public void actionPerformed(ActionEvent object) 
       {
       if (object.getSource() == beenden)
       {   
    	   System.out.println("Beenden wurde angeklickt");
    	   System.exit(0);
       }
       if (object.getSource() == optionen)
       {
    	   System.out.println("Optionen wurde angeklickt");
       }
       if (object.getSource() == ueber)
       {
    	   System.out.println("Über wurde angeklickt");
       }
       }
}


MeinDialogAdapterList.java
Java:
import javax.swing.*;

public class MainDialogAdapterList
{
	JPanel panel = new JPanel();
	public MainDialogAdapterList()
	{
		String subject[] = {"Math", "Computer", "Phisics", "Chemestry"};
		JList<Object> list = new JList<Object>(subject);
		panel.add(list);

	}
}

Vielleicht kann mich ja jemand entwirren :bahnhof:
 
Zuletzt bearbeitet:

theuserbl

Bekanntes Mitglied
Wenn ich mir Muster von anderen JMenuBar Codes ansehe, dann werden die immer Hauptfenster erstellt und geladen - und sind auch 100% horizintal gestreckt, sowie links oben ausgerichtet. Ich würde gerne die X und Y Koordinaten meiner Objekte selbst bestimmten, so wie deren Größe (es soll ein statisches Fenster werden). Wenn ich diese Methoden auf meinen Objekten anwende, dann verschwinden sie entweder oder es zeigt sich einfach keine Änderung, es ist zum Haareraufen.

Also wenn Du eine JMenuBar irgendwo haben willst, dann füge sie einem JComponent zu und adde das JComponent dann irgendwo hin.
 

markus99

Bekanntes Mitglied
Hallo, Danke für deinen Beitrag!
Ich habe meinen ersten Beitrag bereits editiert, die JMenuBar funktioniert wie sie soll, aber es gibt noch genügend andere ungeklärte Probleme und Fragen :)
 

theuserbl

Bekanntes Mitglied
Also für mich ist der Code sehr seltsam.

Normalerweise wird eine MenuBar mit
Java:
JFrame f = new JFrame();
f.setJMenuBar(myMenuBar);
hinzugefügt.

Du fügst aber an MainDialogDetails (welches von JFrame abgeleitet ist) MainDialogTitleMenue hinzu, das noch nicht einmal von JComponent abgeleitet ist. Und das diesem MainDialogTitleMenue bekommt dann plötzlich die Menü-Swing Komponenten. :-/
 

markus99

Bekanntes Mitglied
Ja, ich hatte es mir eigentlich so gedacht:
MainDialog -> MainDialogDetails
MainDialog -> MainDialogTitleBar
MainDialog -> MainDialogAdapterList

(Jetzt nicht verwirren lassen)
Über die Klasse MainDialog erstelle ich ein Objekt von MainDialogDetails mit dem Namen "maindialog".

Über "maindialog" binde ich dann das JMenuBar Objekt ein, mit folgender Zeile:
Java:
MainDialogTitleMenue menuframe = new MainDialogTitleMenue();
maindialog.add(menuframe.menuebar,BorderLayout.PAGE_START);
Wobei "menuebar" eben mein JMenuBar Objekt ist und "menuframe" das Objekt der Klasse MainDialogTitleBar

Und das funktioniert "jetzt" ja auch schon.
 
Zuletzt bearbeitet:

theuserbl

Bekanntes Mitglied
Ich denke mal, Du meintest eher

Java:
import javax.swing.*;
 
public class MainDialogAdapterList extends JPanel
{

    public MainDialogAdapterList()
    {
        String subject[] = {"Math", "Computer", "Phisics", "Chemestry"};
        JList<Object> list = new JList<Object>(subject);
        this.add(list);
 
    }
}
 

markus99

Bekanntes Mitglied
Oh ja, da fängt das nächste Problem an.
Ich habe vor einigen Jahren viel mit MFC C++ gemacht - und immer alles geschafft mit meiner Logik.
Aber in Java bringt mir das bis jetzt gar nichts.

Also, ich möchte am Ende einfach eine Liste mit Zeileneinträgen befüllen (automatisch, beim start). Die Elemente soll man anklicken und später mit einem Button "aktivieren" können (ist jetzt nicht wichtig).

Dazu brauche ich einfach nur ein JList Objekt, oder?

Ich habe circa. 4 Stunden lang versucht solche Listenobjekte zu erstellen und über denselben weg in meine MainDialog.java einzubinden, ohne erfolg.
Die Listen wurden niemals angezeigt.

Und selbst wenn, ich möchte die Liste unbedingt über genaue Positionsangaben (x, y, L, B) selbst definieren, was auch nie funktioniert hat.
Dabei habe ich nicht nur mit JList Versuche angestellt, aber es ging eben alles in die Hose.
Hast du hier eine Empfehlung?
 

markus99

Bekanntes Mitglied
Sooo .. das mit der Liste hab ich nun endlich geschafft.

Ich wusste nicht dass man JLists in JScrolLPane packen muss um die Objekte irgendwie darzustellen oder aufzurufen.

Java:
public class MainDialogAdapterList
{
	String[] words = { "quick", "brown", "hungry", "wild", "silent", "huge" };
	JList wordList = new JList(words);
	JScrollPane scrollPane = new JScrollPane(wordList);
	public MainDialogAdapterList()
	{
	}
}
und
Java:
	MainDialogAdapterList scrollList = new MainDialogAdapterList();
	maindialog.add(scrollList.scrollPane,BorderLayout.WEST);
funktioniert tadellos.
Jetzt muss ich nur noch rausfinden wie ich z.b. das Listen Objekt frei positionieren kann.
 

theuserbl

Bekanntes Mitglied
Hier auf die Schnelle eine geupdatetete Version, die funktioniert:
JLabel müßte noch in einen JScrollPane. Außerdem ist MainDialog nicht der, an dem JMenuBar dranhängt. Aber es zeigt wie es geht.

Java:
import javax.swing.*;
 
public class MainDialogAdapterList extends JPanel
{
 
    public MainDialogAdapterList()
    {
        String subject[] = {"Math", "Computer", "Phisics", "Chemestry"};
        JList<Object> list = new JList<Object>(subject);
        this.add(list);
 
    }
}

Java:
import javax.swing.*;
import java.awt.*;
 
public class MainDialogDetails extends JFrame
{
    private static final long serialVersionUID = 526887145372086141L;
    private JLabel maindialogdetails;
        
    public MainDialogDetails()
    {
        super("Title bar");
        setLayout(new FlowLayout());
        maindialogdetails = new JLabel("");

        // this is short for
        // MainDialogAdapterList myDAL = new MainDialogAdapterList();
        // this.add(myDAL);
        add(new MainDialogAdapterList());

        setJMenuBar(new MainDialogTitleMenue());
        //maindialogdetails.setToolTipText("Beispiel Tooltip");
        add(maindialogdetails);
    }
}

Java:
import javax.swing.*;
import java.awt.*;
 
public class MainDialog 
{
    //->Auflösungsermittlung für Zentrierung
    private static int mainDisplayWidth = 500;
    private static int mainDisplayHeight = 500;
    private static int mainDisplayPositionWidth = 0;
    private static int mainDisplayPositionHeight = 0;
    //<-Auflösungsermittlung für Zentrierung
    
    public static void main(String[] args) 
    {
        try
        {
            //Info für das Forum: Es ist egal ob mit oder ohne, alles schon getestet
            //->WebLookAndFeel style
//            UIManager.setLookAndFeel(com.alee.laf.WebLookAndFeel.class.getCanonicalName());
            //<-WebLookAndFeel style
        }
        catch ( Throwable e )
        {
            //TODO
        }
        
        MainDialog g = new MainDialog();
    }
    
    public MainDialog()
    {
        //->Auflösungsermittlung für Zentrierung
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        int resolutionWidth = (int) dim.getWidth();
        int resolutionHeight = (int) dim.getHeight();
        mainDisplayPositionWidth = resolutionWidth/2-mainDisplayWidth/2;
        mainDisplayPositionHeight = resolutionHeight/2-mainDisplayHeight/2;
        //<-Auflösungsermittlung für Zentrierung
        
        //-> Dialog-Settings
        MainDialogDetails maindialog = new MainDialogDetails();
        maindialog.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //->Auflösungsermittlung für Zentrierung
        maindialog.setLocation(mainDisplayPositionWidth, mainDisplayPositionHeight);
        maindialog.setSize(mainDisplayWidth, mainDisplayHeight);
        maindialog.setAlwaysOnTop(true);
        maindialog.setResizable(false);
        //<-Auflösungsermittlung für Zentrierung
 
        //->Titlemenue
//        MainDialogTitleMenue menuframe = new MainDialogTitleMenue();
///        maindialog.add(menuframe.menuebar/*,BorderLayout.PAGE_START*/); //gibt keinen Unterschied ob mit oder ohne
        //<-Titlemenue
 
        maindialog.setVisible(true);
 
        //<- Dialog-Settings
 
    }
}

Java:
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
public  class MainDialogTitleMenue extends JMenuBar implements ActionListener
{
    JMenu datei = new JMenu("Datei");
    JMenu tools = new JMenu("Tools");
    JMenu hilfe = new JMenu("Hilfe");
    
    //Datei
    JMenuItem beenden = new JMenuItem("Beenden");
    //Tools
    JMenuItem optionen = new JMenuItem("Optionen");
    //Hilfe
    JMenuItem ueber = new JMenuItem("Über");
    
    
    public MainDialogTitleMenue()
    {
        
        datei.add(beenden);
        tools.add(optionen);
        hilfe.add(ueber);
        
        datei.addActionListener(this);
        tools.addActionListener(this);
        hilfe.addActionListener(this);
        
        beenden.addActionListener(this);
        optionen.addActionListener(this);
        ueber.addActionListener(this);
 
        this.setFocusable(false);
        this.add(datei);
        this.add(tools);
        this.add(hilfe);
       }
 
       @Override
       public void actionPerformed(ActionEvent object) 
       {
       if (object.getSource() == beenden)
       {   
           System.out.println("Beenden wurde angeklickt");
           System.exit(0);
       }
       if (object.getSource() == optionen)
       {
           System.out.println("Optionen wurde angeklickt");
       }
       if (object.getSource() == ueber)
       {
           System.out.println("Über wurde angeklickt");
       }
       }
}
 

Volvagia

Top Contributor
...das Listen Objekt frei positionieren kann.

Tu das keines falls. Objekte werden auf unterschiedlichen Plattformen (vielleicht sogar unterschiedlichen OS-Designs, habs aber nie getestet) unterschiedlich dagestellt. Bei Swing ist der Unterschied zwar nicht so gravierend, aber immer noch vorhanden. Die Komponentenpositionen MÜSSEN (nicht wirklich umbedingt aber für ein gutes immer funktionierendes Programm MÜSSEN) von einen 3. Komponenten (LayoutManager) live errechnet werden.

Und die unterschiedliche Darstellung ist nur 1 Grund. Das Berechnen der Abstände etc. wird z. B. ein Haufen Arbeit und Änderungen kannst du dann auch gleich vergessen.

Eine JList muss nicht umbedingt in eine ScrollPane, nur falls du scrollen können willst. Swing ist übrigens nicht Thread-Safe.


btw. würde ich dir raten nicht von jeden Component zu erben sondern sie direkt zu erzeugen. Sonst hast du dutzende Klassen bei denen du nicht mehr durchblickst und irgendwo fliegen Referenzen durchs ganze Programm. Favour Composition over Inheritance. Hab ich anfangs auch immer gemacht, wird schrecklich.

Ich denke der Hover-Effekt wird vom Look and Feel geregelt. Dabei kannst du zwar teilweiße Werte verändern, ist aber nichts für einen (GUI-)Anfänger.
 
Zuletzt bearbeitet:

theuserbl

Bekanntes Mitglied
Jetzt muss ich nur noch rausfinden wie ich z.b. das Listen Objekt frei positionieren kann.

Weiß garnicht, ob ich es sagen soll.
Also eigentlich sucht man sich dann einen geigneten LayoutManager raus.

"Frei Positionieren" geht aber vor allem durch
Java:
setLayout(null);
MainDialogAdapterList scrollList = new MainDialogAdapterList();
scrollList.setBounds(100,50);
scrollList.setLocation(10,50);
add(scrollList);

Und jetzt gehe ich in Deckung, weil ich einen Neuling aufs NullLayout hingewiesen habe.


Grüße
theuserbl
 

markus99

Bekanntes Mitglied
@theuserbl

Ich danke dir vielmals für deine Mühen, deinen Code habe ich gesichert :)
Auch die PDF hat meinem Verständnis der ganzen Sache auch sehr geholfen!

Wobei es jetzt auch so funktioniert wie ich es mir vorher dachte.

Mein aktuelles Problem ist wie volvagia (zelda? :D) anspricht: Die Positionierung der Liste!
volvagia, ich habe ein statisches Fenster, das Programm selbst soll auch nur auf Windows laufen.

Insofern ist es halb so wild denk ich.
Das Look and Feel ist recht ansprechend und sieht wirklich sehr gut aus, nur möchte ich Objekte lieber individuell gestalten (ich denke als Anfänger sollte man das auch).

Wie das ungefähr funktioniert habe ich bereits festgestellt, aber es ist wirklich sehr komplex.
Es werden Standartmethoden überschrieben oder ergänzt.
Ich habe eigentlich auch kein Problem damit, wenn es etwas Anfängerfreundlicher erklärt wird.

Immerhin habe ich bereits meine halbe GUI, die eigentliche Programmierung der Kernfunktionen ist für mich kein Problem.


Zurück zu meiner JList!
Ich habe in der MainDialogAdapterList nun folgendes:
Java:
public class MainDialogAdapterList
{

	String[] words = { "quick", "brown", "hungry", "wild", "silent", "huge" };
	JList wordList = new JList(words);
	JScrollPane scrollPane = new JScrollPane(wordList);

	public MainDialogAdapterList()
	{
		scrollPane.setPreferredSize(new Dimension(400,200));
	}
}

und binde das Ganze mit

Java:
maindialog.add(scrollList.scrollPane,BorderLayout.WEST);

in meiner MainDialog Klasse ein.
Funktioniert!

Bis auf die Tatsache, dass es ohne "BorderLayout.WEST" nicht funktioniert - und mit auch nur horizontal.
Die Liste wird ganz links oben positioniert, zieht sich bis ganz nach unten. Aber die Breite wird durch setPreferredSize einwandfrei übernommen.

Nun brauche ich einen Anhaltspunkt um die Liste an einem bestimmten Punkt zu erstellen.
 

markus99

Bekanntes Mitglied
Java:
setLayout(null);
MainDialogAdapterList scrollList = new MainDialogAdapterList();
scrollList.setBounds(100,50);
scrollList.setLocation(10,50);
add(scrollList);

Funktioniert nicht :eek:

maindialog.add(scrollList.scrollPane,BorderLayout.WEST);
Ohne BorderLayout.WEST wird gar nichts angezeigt.
und
Mit BorderLayout.WEST wird gar nichts angezeigt.
setBounds benötigt 4 Integer Werte (X, Y, ?länge?, ?breite?)
wofür dann setLocation?

Übrigens "nur" setBounds _oder_ setLocation funktioniert mit "BorderLayout.WEST" _oder_ ohne auch nicht.

Wenn ich "nur" setLayout(null); verwende, funktioniert es mit "BorderLayout.WEST" oder ohne irgendetwas auch nicht (bleibt leer, keine objektanzeige bis auf meine geliebte jmenubar).
 
Zuletzt bearbeitet:

Volvagia

Top Contributor
Du bist mir sympatisch. :toll:

Das ist die Anordnungsstrategie des BorderLayouts. Oben und Unten wird nach der Pref. Size in der Höhe gestreckt und durch die ganze Fensterbreite gezogen, Links und Rechts wird nach der Pref. Size die Breite festgelegt und über die ganze Höhe gezogen (- der Höhe der oberen/unteren Komponenten) und der Teil in der Mitte (CENTER oder garkein Parameter) wird über den restlichen Bereich in der Mitte gestreckt.

Wenn sich das Fenster vergrößert sollte ja auch die Liste sich vergrößern, oder? Sonst hast du darunter ungenutzen Platz.
 

markus99

Bekanntes Mitglied
Wieso wird mit setBounds der Startbereich sowie die Größe angegeben, wenn der Startpunkt selbst auch in der setLocation steht?
Es funktioniert außerdem nicht!

Sobald ich scrollPane.setLayout(null); verwende, wird die JList einfach nicht mehr angezeigt.

Ahhh alles klar, ein Problem hat sich soeben erledigt.
Ich bin immer von der scrollPane ausgegagen, ich denke man kann hier auf das JList Objekt direkt verweisen :D

Nun wird die Liste mit

Java:
		wordList.setLayout(null);
		wordList.setBounds(20,20,150,150);
		wordList.setLocation(20,20);
	}

immer auf 100% * 100% maximiert. (egal ob mit oder ohne borderlayouts!)

@volvagia
Ich verwende eine fixe Fenstergröße, es soll im Endeffekt mehr eine art Tool werden, später dann auch mit anderen kleinen Tools über ein TrayMenu abrufbar :)
 

Volvagia

Top Contributor
Du musst dem Component, auf dem du die Dinge hinzufügst den LayoutManager setzen, nicht dem der hinzugefügt wird.

setLocation kannst du entfernen, setBounds ist setLocation und setSize in einem.
 

markus99

Bekanntes Mitglied
Also nochmal

Wenn ich das Objekt der JList mit BorderLayout.WEST hinzufüge, dann wird es Links angeordnet und ist von der Breite her genau so groß wie der Längste Text darin.

In der Klasse mit dem JList Objekt habe ich folgendes zugewiesen:
Java:
		wordList.setLayout(null); //Wird angenommen? keine Ahnung
		wordList.setBackground(Color.GRAY); //Wird definitiv angenommen, Hintergrund wird grau
		wordList.setBounds(50,50,150,150); //wird total ignoriert

Wenn ich nun das JList Objekt in meiner Hauptklasse OHNE BorderLayout.WEST hinzufüge, dann wird das JList Objekt einfach maximiert und im kompletten Dialog gestreckt.
 

theuserbl

Bekanntes Mitglied
So muß es heißen:

Java:
		setLayout(null);
		wordList.setBackground(Color.GRAY);
		wordList.setBounds(50,50,150,150);


Du hattest ja auch ganz am Anfang schon mal an mehreren Stellen
Java:
 setLayout(new FlowLayout());
geschrieben. Da wird einer von denen nun stattdessen auf null gesetzt.
 

Volvagia

Top Contributor
Du musst dem LayoutManager dem Ding (vermutlich ein JPanel) zuweißen, auf das du den Komponenten hinzufügst, nicht dem Komponenten (JList oder JScrollPane), dem du hinzufügst. setBounds wird nicht ignoriert, das BorderLayouts des Komponenten wo die Liste oder das ScrollPane drinnenliegt überschreibt es nur wieder.
 

theuserbl

Bekanntes Mitglied
Ach ja, und nicht vergessen, es am Ende zu adden:
Java:
		setLayout(null);
		wordList.setBackground(Color.GRAY);
		wordList.setBounds(50,50,150,150);
                add(wordList);
 

markus99

Bekanntes Mitglied
@volvagia

Ich verwende bisher eigentlich nur ein JFrame Objekt, das ist sozusagen das Hauptfenster.
Wenn ich hier mit setLayout(new FlowLayout()); arbeite, dann wird meine JMenuBar Objekt nicht mehr angezeigt, also habe ich es einfach auskommentiert.

Gerade nochmal getestet!
Mit setLayout(null); in meinem Haupt-JFrame kann ich endlich die Liste frei positionieren.
Aber leider schießt mir das wie oben erwähnt die JMenuBar ins Nirvana ...

Diese hatte ich so aufgerufen:
Java:
		MainDialogTitleMenue menuframe = new MainDialogTitleMenue();
		maindialog.add(menuframe.menuebar/*,BorderLayout.PAGE_START*/); //gerade auskommentiert
		//<-Titlemenue

GROßES EDIT: Funktioniert!
Konnte das JMenuBar Objet auch direkt über setLocation und setBounds ansteuern und ausrichten, super!
 
Zuletzt bearbeitet:

Volvagia

Top Contributor
Der JMenuBar musst du auch die Position/Größe setzen, sonst bleibt sie 0/0/0/0. Du kannst aber versuchen sie mit setJMenuBar hinzuzufügen, weiß aber nicht ob sich das mit dem NullLayout verträgt.
 

theuserbl

Bekanntes Mitglied
Aber leider schießt mir das wie oben erwähnt die JMenuBar ins Nirvana ...

Dann - so wie Volvagia schon sagte - ein JPanel dazwischen setzen:



Java:
        JPanel myPanel = new JPanel();
        myPanel.setLayout(null);
        wordList.setBackground(Color.GRAY);
        wordList.setBounds(50,50,150,150);
        myPanel.add(wordList);
        add(myPanel);
 

markus99

Bekanntes Mitglied
Ach mist, zu spät editiert, zuviel Zeit mit der schönen auffälligen Formatierung verbracht :D

Ich danke dir und theuserbl herzlichst für diese sehr ausgeweitete Lehrstunde und Einführung in die GUI Entwicklung mit Java!
Weiters kann ich mir gut vorstellen, dass ich mit dem soeben erlangten Wissen alles umsetzen kann was ich mir so gedacht habe :)

Wenn ich es jetzt noch schaffe die JMenuBar Elemente mit anderen Hover/Action farben zu verzieren, dann habe ich praktisch alles was erreichen wollte erreicht.

Ausgezeichnetes Forum, ausgezeichnete User!
Hier werd ich mich sicher noch öfters anstellen!
 

Volvagia

Top Contributor
[OT]Und das nächste Mal zeigt dir theuserbl, dass man keine Zeit mit Tabulatoren verschwenden muss da der Quelltext auch ohne hervorragend ausgeführt wird. :)[/OT]
 

markus99

Bekanntes Mitglied
Danke Danke!

Ich habe mich mittels Forenfunktion für alle eure hilfreichen Beiträge bedankt, falls ihr auf darauf steht :)
Den Thread lasse ich vorerst noch 1, 2 Tage als "unerledigt" stehen, falls sich noch jemand die Zeit nimmt mir das mit den Farben in meine noch nicht sehr ausgeprägten Fähigkeiten zu hämmern.
 

Volvagia

Top Contributor
Rufe die Methode auf, nach dem du das LnF gesetzt hast:

Java:
public static void printLnFColorKeys() {
	Set<Entry<Object, Object>> entries = UIManager.getLookAndFeelDefaults().entrySet();
	for (Entry<Object, Object> entry : entries) {
		if (entry.getValue() instanceof Color) {
			String key = entry.getKey().toString();
			Color c = (Color) entry.getValue();
			
			int rgb = c.getRGB();
			System.out.println(key + " - r: " +  ((rgb >> 16) & 0xff) +
					" g: "+ ((rgb >> 8) & 0xff) +
					" b: " + (rgb & 0xff));
		}
	}
}

Das gibt dir alle Schlüssel mit den dazugehörenden Farbwerten aus. Such raus, welche es warscheinlich ist und setze dann die neue Farbe mit

Java:
UIManager.put(Schlüssel, Farbe);

z. B.

Java:
UIManager.put("PasswordField.foreground", Color.GREEN);

Das würde die Vordergrundfarbe der JPasswordFields standartgemäß auf Grün setzen. Bin es mal ganz schnell durchgegangen, gibt ein "Menu.selectionBackground" beim Standart LnF. Probiers mal damit. Allerdings sind nicht alle Schlüssel bei allen LnF vorhanden.

[EDIT]MenuItem.selectionBackground[/EDIT]
 
Zuletzt bearbeitet:

Volvagia

Top Contributor
Erweiterung (Erbung) von der Klasse die angegeben wird. Eine der Grundlage der OO Programmierung, hattest du in C++ sicher auch schon. Ansonst geht sicher jedes Buch darauf ein.

Bei mir funktioniert es damit problemlos. (So fern ich dich richtig verstanden habe)
 

Anhänge

  • bild.png
    bild.png
    1,9 KB · Aufrufe: 27
Zuletzt bearbeitet:

markus99

Bekanntes Mitglied
Achso, dachte da kam noch was wesentliches zum UIManager :)

Java:
		UIManager.put("MenuItem.background", Color.red);
funktioniert übrigens!


Java:
		UIManager.put("MenuItemSelected.background", Color.red); (?)
jedoch nicht - bleibt Standart Java-Blau.
Alle anderen funktionieren auch nicht bzw. haben keinen Effekt auf das JMenuBar Objekt.

Aber ich hab verstanden in welche Richtung das geht!
Per Google Suche habe ich auch direkt eine Methode gefunden die mir alle möglichen color keys hierzu ausgeben kann (siehe Java UIManager color keys | A list of UIManager color key values | devdaily.com).

Ich glaube da werde ich morgen bestimmt die richtigen finden, Tausend Dank nochmal! :)
 

markus99

Bekanntes Mitglied
Ja, danke, verschrieben!
Aber funktionieren tut bis dato. nur der Standard-Background, ohne MouseOver.
Wie geschrieben macht das nichts, ich weiß jetzt dank dir wo ich suchen muss! :)

Edit zu deinem Edit: Es funktioniert ja auch, nur die MouseOver Farbänderung bleibt auf default, der Standart-Hintergrund wird erfolgreich mit rot ersetzt


Haben andere damit wirklich keine Probleme oder setze nur ich hier auf ein Extrawürstl :lol:
Es gibt auch sonst kaum Suchergebnisse hierzu.

Edit2: Hier gibts gute Einträge dazu:
How to change System colors of swing?

Ich nutze bisher
Java:
		UIManager.put("MenuItem.background", Color.red); //Standard Hintergrund in Untermenüs
		UIManager.put("MenuItem.foreground", Color.white); //Textfarbe in Untermenüs
		UIManager.put("MenuItem.selectionBackground", Color.black); //Hintergrund wenn markiert in Untermenüs
		UIManager.put("MenuItem.selectionForeground", Color.white); //Text wenn markiert in Untermenüs
		UIManager.put("MenuItem.border", Color.BLACK); //~Rand wenn markiert in Untermenüs
 
Zuletzt bearbeitet:

markus99

Bekanntes Mitglied
Hallo wieder!
Wie oben erwähnt funktioniert es bereits genau so :)

Wobei es noch einige optische Mängel gibt.
So wird z.B. nicht das komplette Feld eingefärbt/per Hover geändert, links, oben, unten bleiben etwa 2px in der breite weiß(systemcolor).

Aber dafür habe ich (glaube ich) gestern schon etwas gesehen, womit man auch 2-zeilige Inhalte erstellen kann (mitsammt Größenangabe ect.).

Edit: Anhang angehängt, oben sind 2(oder3) Pixelfrei, unten 1(oder2) Pixel
 

Anhänge

  • temp.png
    temp.png
    3,6 KB · Aufrufe: 31
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Erste Schritte mit GUI - Fileverarbeitung, Listener,... AWT, Swing, JavaFX & SWT 10
M Erstellen eines Hilfe-Fenster bzw"Erste-Schritte" AWT, Swing, JavaFX & SWT 2
S Erste Schritte mit SWING AWT, Swing, JavaFX & SWT 7
R Erste Schritte mit Swing AWT, Swing, JavaFX & SWT 3
H JTable - erste Schritte und Machbarkeitsüberlegung AWT, Swing, JavaFX & SWT 8
8 Installation von SWT und erste Schritte AWT, Swing, JavaFX & SWT 3
M JavaFX TableView nur erste Zeile editable machen und gelb markieren AWT, Swing, JavaFX & SWT 0
R javafx erste application AWT, Swing, JavaFX & SWT 12
L Die erste Grafikprogrammierung AWT, Swing, JavaFX & SWT 1
I Erste Desktop Software - blutiger Anfänger AWT, Swing, JavaFX & SWT 4
N JavaFX Erste Versuche mit Data-Binding AWT, Swing, JavaFX & SWT 11
Kenan89 Java FX GUI Hilfe für erste Java FX App AWT, Swing, JavaFX & SWT 8
J Das erste Projekt und ein Haufen von Fragen. Der SudokuReader. AWT, Swing, JavaFX & SWT 4
D Erste Knoten des JTrees bei Start offen AWT, Swing, JavaFX & SWT 8
P Erste Versuche einer Grafischen Oberfläche AWT, Swing, JavaFX & SWT 8
H JTree - nach Auswahl aus JFileChooser wird nur der erste Knoten angezeigt AWT, Swing, JavaFX & SWT 3
dl85hej meine erste Oberfläche AWT, Swing, JavaFX & SWT 3
E JTable nur die erste Spalte auswählbar? AWT, Swing, JavaFX & SWT 4
G JTable erste zeile fixieren wie in excel? AWT, Swing, JavaFX & SWT 3
B JTable erste Zeile aktiv AWT, Swing, JavaFX & SWT 6
L Erste Spalte eines JTables soll nicht editierbar sein. AWT, Swing, JavaFX & SWT 7
S Projekt: Meisterschaft - Abspeichern bereits gemachter Schritte AWT, Swing, JavaFX & SWT 2
F Schritte AWT, Swing, JavaFX & SWT 3
B viele JPanels auf JLayeredPane -> to SVG? AWT, Swing, JavaFX & SWT 15
H Viele ActionListener (MouseListener) - Performance AWT, Swing, JavaFX & SWT 24
L Ein Actionlistener für ein Textfeld, anstatt viele Actionlistener für ein Textfeld AWT, Swing, JavaFX & SWT 7
A JavaFX Sehr viele Exceptions bei Taschenrechner mit JavaFx AWT, Swing, JavaFX & SWT 2
M If für viele TextFields AWT, Swing, JavaFX & SWT 7
kaoZ Swing JMenuBar, Preferences, Properties... und viele andere lustige Dinge (Best Practice) AWT, Swing, JavaFX & SWT 15
K Viele Textfield mit Hilfe eines MousListener leeren - möglich? AWT, Swing, JavaFX & SWT 8
propra 2D-Grafik Beliebig viele Objekte auf einer Zeichenfläche zeichnen AWT, Swing, JavaFX & SWT 15
L unbestimmt viele JComboBox und ItemListener dazu erstellen AWT, Swing, JavaFX & SWT 2
P 2D-Grafik Viele Bilder zu einem Video AWT, Swing, JavaFX & SWT 3
Dit_ Wenn viele NebenFenster zum Locationsetzen das HauptFenster brauchen AWT, Swing, JavaFX & SWT 2
P SWT Composite und viele Labels AWT, Swing, JavaFX & SWT 10
D Zu viele repaints() AWT, Swing, JavaFX & SWT 17
R JTable für sehr viele Daten sehr langsam AWT, Swing, JavaFX & SWT 20
G Viele Fehler beim zeichen AWT, Swing, JavaFX & SWT 5
Z zu viele prozesse AWT, Swing, JavaFX & SWT 2
G zu viele/große BufferedImage führt zu Java heap space AWT, Swing, JavaFX & SWT 5
D Wie viele Pixel welches Icon? AWT, Swing, JavaFX & SWT 4
TheJavaKid Lösung für zu Viele JMenuItems. AWT, Swing, JavaFX & SWT 4
T viele Canvas auf einem Panel und das GUI schmiert ab AWT, Swing, JavaFX & SWT 6
Starchild Beliebig viele Knöpfe AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben