Layout Schwierigkeiten

Status
Nicht offen für weitere Antworten.

Wildcard

Top Contributor
Schon länger her das ich Swing Layout Manager verwendet habe, währe also dankbar wenn mir von euch jemand helfen könnte das hinzubekommen. (André zB gibt doch so gerne Codebeispiele :wink: )
Mein Layout soll in etwa so aussehen:
Code:
+Panel1
---------------------------------
|key			    	      value |
|                               |
|key                      value |
|                         value |
|                               |
|key                      value |
|                         value |
---------------------------------

+Panel2
---------------------------------
|key			    	      value |
|                               |
|key                      value |
|                         value |
|                               |
|key                      value |
|                         value |
---------------------------------

-Panel3 (eingeklappt)
---------------------------------
---------------------------------

+Panel4
---------------------------------
|key		                value |
|                               |
|key                      value |
|                         value |
|                               |
|key                      value |
|                         value |
---------------------------------

Ein key soll also beliebige viele Values haben können die oben am Key ausgerichtet sind.
Weiterhin sollen die Panels beliebig groß und einklappbar sein.
Für die Panels anzuordnen bräuchte ich ein vertikales FlowLayout das es leider nicht gibt.
Ich hab es mit BoyLayout versucht, jedoch versucht BoxLayout immer den ganzen Platz zu verwenden anstatt
den unteren Bereich freizulassen...

Wenn also jemand eine idee für das Panel-Layout oder das Key-Value Layout hat:
immer her damit :wink:

Thx, für Vorschläge

PS: optimal währe es übrigens wenn man das je nach Platzbedarf auf zwei Spalten aufteilen könnte, aber das wird vermutlich etwas schwierig ???:L
 

kaie

Bekanntes Mitglied
Hier eine "Quickhack"-Lösung. Sieht noch nicht wahnsinnig toll aus, erfüllt aber ihren Zweck. Die Optik zu verbessern ist dann Deine Aufgabe! :)

Code:
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.border.*;

public class FoldablePanel extends JPanel implements ActionListener
{
    // -------------------------------------------------------------------------
    //
    // Attribute
    //
    // -------------------------------------------------------------------------
    private JLabel        text;
    private JToggleButton toggle = new JToggleButton("\u25bc");
    private Component     buffer;

    // -------------------------------------------------------------------------
    //
    // Konstruktor
    //
    // -------------------------------------------------------------------------
    public FoldablePanel(String text, boolean folded)
    {
        this.text = new JLabel(text);
        setLayout(new BorderLayout());
        JPanel p = new JPanel(new BorderLayout());
        p.add(this.text, "Center");
        p.add(toggle, "East");
        add(p, "North");
        toggle.setMargin(new Insets(0, 0, 0, 0));
        toggle.setFont(new Font("Arial", Font.PLAIN, 10));
        toggle.addActionListener(this);
        setBorder(new EtchedBorder());
    }

    public FoldablePanel(String titel, String[] key,
            String[] value)
    {
        this(titel,true);
        JPanel k = new JPanel(new GridLayout(0, 1));
        JPanel v = new JPanel(new GridLayout(0, 1));
        for (int i = 0; i < key.length; i++)
        {
            k.add(new JLabel(key[i]));
            JLabel l = new JLabel(value[i]);
            l.setBorder(new LineBorder(Color.black));
            l.setBackground( new Color(255,255,200) );
            l.setOpaque(true);
            v.add(l);
        }
        JPanel p2 = new JPanel(new BorderLayout());
        p2.add(k, "West");
        p2.add(v, "Center");
        add(p2,"Center");
    }

    // -------------------------------------------------------------------------
    //
    // Hauptmethode zum Testen
    //
    // -------------------------------------------------------------------------
    public static void main(String[] args)
    {
        JFrame f = new JFrame("Beispiel für faltbare Panels");
        
        JPanel p = new JPanel();
        p.setLayout(new BoxLayout(p,BoxLayout.Y_AXIS));
        p.add( new FoldablePanel("Person 1", new String[]{"Vorname","Nachname","Alter","Beruf"}, new String[]{"Peter","Mustermann","32","Programmierer"}));
        p.add( new FoldablePanel("Person 2", new String[]{"Vorname","Nachname","Alter","Beruf"}, new String[]{"Petra","Mustermann","27","Hausfrau"}));
        p.add( new FoldablePanel("Person 3", new String[]{"Vorname","Nachname","Alter"}, new String[]{"Paul","Mustermann","7"}));

        f.add(p,"North");
        f.pack();
        f.setLocationRelativeTo(null);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
    }

    // -------------------------------------------------------------------------
    //
    // Methode zum "Falten" des Panels
    //
    // -------------------------------------------------------------------------
    public void actionPerformed(ActionEvent ae)
    {
        if (toggle.isSelected())
        {
            buffer = getComponent(1);
            remove(buffer);
            toggle.setText("\u25b2");
        } else
        {
            add(buffer, "Center");
            toggle.setText("\u25bc");
        }
        revalidate();
    }
}

Der Trick für das "vertikale Flowlayout" ist einfach ein BoxLayout in den Norden eines BorderLayouts zu packen. Wenn Du das dann noch in ein GridLayout packst, kannst Du auch mehrere Spalten nebeneinander haben.

Hoffe geholfen zu haben!
 

Wildcard

Top Contributor
kaie hat gesagt.:
Der Trick für das "vertikale Flowlayout" ist einfach ein BoxLayout in den Norden eines BorderLayouts zu packen.
Spitzen Idee, so passt's :applaus:
Muss zu meiner Schande gestehen das ich mittlerweile mit den verhaßten SWT LayoutMangern besser klar komme :?

Vielen Dank
 

André Uhres

Top Contributor
Wildcard hat gesagt.:
..André zB gibt doch so gerne Codebeispiele :wink:
Aha :D . Na dann stell ich einfach auch mal meine Version rein.
Es ist eine Verschachtelung nur von Flow- und BorderLayout:
Code:
/*
 * ShowHideDetailsDemo.java
 */
package layout;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
public class ShowHideDetailsDemo extends JFrame {
    private JScrollPane scrollingInfo;
    private InfoPanel infoPanel;
    public ShowHideDetailsDemo() {
        super("ShowHideDetailsDemo");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400,300);
        setLocationRelativeTo(null);
        //Info Panel:
        infoPanel = new InfoPanel(180, 65, 23);//width, keywidth, lineheight
        infoPanel.add( "Person 1",//titel
                new String[]{"Vorname","Nachname","Alter","Beruf"},//keys
                new String[]{"Peter","Mustermann","32","Programmierer"});//values
        infoPanel.add( "Person 2",//titel
                new String[]{"Vorname","Nachname","Alter","Beruf"},//keys
                new String[]{"Petra","Mustermann","27","Hausfrau"});//values
        infoPanel.add( "Person 3",//titel
                new String[]{"Vorname","Nachname","Alter"},//keys
                new String[]{"Paul","Mustermann","7"});//values
        scrollingInfo = new JScrollPane(infoPanel);
        scrollingInfo.setPreferredSize(new Dimension(200, 200));
        scrollingInfo.setHorizontalScrollBarPolicy(
                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        getContentPane().add(scrollingInfo, BorderLayout.WEST);
    }
    public static void main(final String args[]) {new ShowHideDetailsDemo().setVisible(true);}
}
class InfoPanel extends JPanel{
    private InfoPanel infoPanel;
    private int infoPanelWidth;
    private int keyWidth;
    private int lineHeight;
    public InfoPanel(int infoPanelWidth, int keyWidth, int lineHeight){
        this.infoPanelWidth = infoPanelWidth;
        this.lineHeight = lineHeight;
        this.keyWidth = keyWidth;
        infoPanel = this;
    }
    public Dimension getPreferredSize(){
        Component[] components = getComponents();
        int infoPanelHeight = 0;
        for (int i = 0; i < components.length; i++) {
            infoPanelHeight += ((SummaryDetailPanel)components[i]).getSummaryHeight();
            infoPanelHeight += ((SummaryDetailPanel)components[i]).getDetailHeight();
            infoPanelHeight += ((FlowLayout)this.getLayout()).getVgap();
        }
        return new Dimension(infoPanelWidth, infoPanelHeight);
    }
    public void add(String titel, String[] keys, String[] values) {
        add(new SummaryDetailPanel(titel, keys, values));
    }
    class SummaryDetailPanel extends JPanel{
        private JPanel summary;
        private DetailPanel detailPanel;
        private JToggleButton detailButton;
        public SummaryDetailPanel(String titel, String[] keys, String[] values){
            setLayout(new BorderLayout());
            //Summary:
            summary = new JPanel();
            summary.setBackground(Color.LIGHT_GRAY);
            summary.add(new JLabel(titel));
            detailButton = new JToggleButton("Hide", true);
            detailButton.setFont(detailButton.getFont().deriveFont(10f));
            detailButton.setPreferredSize(new Dimension(34,15));
            detailButton.setMargin(new Insets(0,0,0,0));
            summary.add(detailButton);
            add(summary, BorderLayout.CENTER);
            //Detail:
            detailPanel = new DetailPanel();
            for (int i = 0; i < keys.length; i++) {
                detailPanel.add(keys[i], values[i]);
            }
            add(detailPanel, BorderLayout.SOUTH);
            //Listener:
            detailButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    detailButtonActionPerformed(evt);
                }
            });
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    detailButton.doClick();
                }
            });
        }
        private void detailButtonActionPerformed(ActionEvent evt) {
            detailPanel.setVisible( !detailPanel.isVisible() );
            detailButton.setText(detailPanel.isVisible()?"Hide":"Detail");
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    infoPanel.scrollRectToVisible(getBounds());
                    revalidate();
                }
            });
        }
        public int getSummaryHeight() {return summary.getHeight();}
        public int getDetailHeight() {
            return detailPanel.isVisible()?(int)detailPanel.getHeight():0;
        }
        class DetailPanel extends JPanel{
            private int detailPanelWidth, detailPanelHeight; 
            public DetailPanel(){
                detailPanelWidth = infoPanelWidth;
                detailPanelHeight = lineHeight;
            }
            public Dimension getPreferredSize(){
                return new Dimension(detailPanelWidth, detailPanelHeight);
            }
            private void add(String key, String value) {
                super.add(new DetailLine(key, value));
            }
            class DetailLine extends JPanel{
                private JPanel keyPanel, valuePanel;
                public DetailLine(String key, String value){
                    setLayout(new BorderLayout());
                    setPreferredSize(new Dimension(infoPanelWidth,lineHeight));
                    keyPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
                    keyPanel.setPreferredSize(new Dimension(keyWidth,lineHeight));
                    valuePanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
                    keyPanel.add(new JLabel(key));
                    JLabel valueLabel = new JLabel(value);
                    valueLabel.setBorder(new LineBorder(Color.black));
                    valueLabel.setBackground( new Color(255,255,200) );
                    valueLabel.setOpaque(true);
                    valuePanel.add(valueLabel);
                    add(keyPanel, BorderLayout.WEST);
                    add(valuePanel, BorderLayout.CENTER);
                    detailPanelHeight += lineHeight;
                }
            }
        }
    }
}
 

Tobias

Top Contributor
SwingX hat ein VerticalLayout. Und eine JXCollapsiblePane. Damit baue ich gerade etwas ganz ähnliches...

mpG
Tobias
 

jakob

Aktives Mitglied
Hallo zusammen,

danke fuer die tollen Codebeispiele. Wie kann ich den Auf/Zuklappvorgang langsamer gestalten? Also nicht pop auf pop zu sondern ein langsames gleichmaessiges Hoch- und Runterfahren.

Bin auf Antworten gespannt.

Liebe Gruesse,
Jakob
 
Status
Nicht offen für weitere Antworten.
Ä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