Richtiges einstellen der size von JPanels

  • Themenstarter Themenstarter Nali_karamba
  • Beginndatum Beginndatum
N

Nali_karamba

Gast
Hallo habe ein problem einem Programm.
Ich fang mal mit der Ausgangssiutation an:
Mein JFrame bekommt ein ContentPane gesetzt

Java:
main_panel=new Main_content_Pane(userlist);
       
        this.setContentPane(main_panel);

dieses content Pane beinhalt ein Splitpane was wieder rum ein splitpane beinhaltet

Java:
Main_content_Pane(ArrayList userlist){
emailListe=new JTable(new Object[0][5],head_rows);
email=new JTextArea();
vertical=new JSplitPane(JSplitPane.VERTICAL_SPLIT,emailListe,email); // erstes SplitPane
postfaeher=new JTree();
horizontal = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,postfaeher,vertical); //zweites SplitPane
this.add(horizontal)

dieses content Pane soll 500,500 sein bzw. wenn der rahmenvergrößert wird soll sich das Main_content_pane entsprechend anpassen.

ich hab nun schon einiges probiert und mit setMinimalSize(), setMaximumSize() und setPreferredSize() rumgespielt desweitern auch mit dem Flowlayout , aber funktioniert tut es immer noch nicht meine Idee ist den untersten componenten (email, emailListe, postfaeher) jeweils größen zuordnen an denen sich die obeeren dann orientieren aber irgendwie klappt das nicht richtig.
habt ihr da ne Idee.

PS: falls ich ausversehen ein unvollständigen Theard gepostet habe diesen bitte löschen 🙂
 
Ein KSKB würde helfen. Wenn man nur einem Panel eine PreferredSize gibt sollte das eigentlich passen, aber ich meine mich zu erinnern, dass JSplitPane da manchmal ein bißchen widerspenstig sind...
 
So hier nun mein KSKB 🙂

Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package bullshit;

import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTree;

/**
 *
 * @author Jens Wipprich ==> jens.wipprich (at) uni-jena.de
 */
public class KSKB extends JFrame {

    public KSKB(){

        main_content panel= new main_content();
        this.setContentPane(panel);
        this.setMinimumSize(new Dimension(550,550));
        this.setVisible(true);
    }


    public class main_content extends JPanel{


        main_content(){
           String []head_rows={"test","test","test","test","test"};
           JTable emailListe=new JTable(new Object[0][5],head_rows);//content 1 für Splitpane "vertical"
           emailListe.setPreferredSize(new Dimension(400,250));
           JTextArea email=new JTextArea();               //content 2 für Splitpane "vertical"
           emailListe.setPreferredSize(new Dimension(400,250));
           JSplitPane vertical=new JSplitPane(JSplitPane.VERTICAL_SPLIT,emailListe,email); 
           //Splitpane vertical ; content 2 für splitpane "horizontal"

           JTree postfaecher=new JTree(); // content 1 für splitpane "horizontal"
           postfaecher.setPreferredSize(new Dimension(100,500));
           JSplitPane horizontal = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,postfaecher,vertical);
//Splitpane "horizontal"
           this.add(horizontal);
       }
    }
 public static void main (String [] args){
    new KSKB();
 }
}


Im Moment hat das content Panel die size (500,500) und die das JFrame (550.550) allerdings wenn der nutzer was verschiebt sieht es jedesmal doof aus. Wie schaffe ich es das sich das content panel entsprechend vergrößert wenn der User das JFrame vergrößert !? Meine Idee wäre mit Rand abstand (Insets) wäre. ?
Bzw. auch für später zu wichtig zu wissen ich kann ich "sperren" das der Nutzer die größe des fensters verändern kann !?

🙂
 
Hm... ???:L Meinst du sowas?
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

//package bullshit;

import java.awt.*;
import javax.swing.*;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTree;

/**
 *
 * @author Jens Wipprich ==> jens.wipprich (at) uni-jena.de
 */
public class KSKB2 extends JFrame {

    public KSKB2(){

        main_content panel= new main_content();
        this.setContentPane(panel);
        this.pack();
        this.setMinimumSize(this.getPreferredSize());
        this.setVisible(true);
    }


    public class main_content extends JPanel{


        main_content(){
           String []head_rows={"test","test","test","test","test"};
           JTable emailListe=new JTable(new Object[0][5],head_rows);//content 1 für Splitpane "vertical"
           emailListe.setPreferredSize(new Dimension(400,250));
           JTextArea email=new JTextArea();               //content 2 für Splitpane "vertical"
           emailListe.setPreferredSize(new Dimension(400,250));
           JSplitPane vertical=new JSplitPane(JSplitPane.VERTICAL_SPLIT,emailListe,email);
           //Splitpane vertical ; content 2 für splitpane "horizontal"

           JTree postfaecher=new JTree(); // content 1 für splitpane "horizontal"
           postfaecher.setPreferredSize(new Dimension(100,500));
           JSplitPane horizontal = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,postfaecher,vertical);
//Splitpane "horizontal"
           this.setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
           this.setLayout(new GridLayout(1,1));
           this.add(horizontal);
       }
    }
 public static void main (String [] args){
    new KSKB2();
 }
}

Größenänderung vermeiden:
frame.setResizeable(false);
 
Ja genau das meinte ich, "horizontal" auf dem JPanel mit nem Layout zulegen und die entsprechende Border zu deklarieren. Mhh hätte ich selber drauf kommen können, dafür hat sich jetzt mein ganzes Verständnis von Panel, Frame und Content Panels erhöht.

DAfür Danke 🙂 :toll:


PS: da ich den Theard als Gast geschrieben habe kann ich den jetzt irgendwie nicht "als erledigt markieren"
 
nun noch ein Problem mit folgendem Beispiel:

Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package bullshit;

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;

/**
 *
 * @author Jens Wipprich ==> jens.wipprich (at) uni-jena.de
 */
public class KSKB2 extends JFrame {


    public KSKB2(){

        this.setContentPane(new panel());
        this.pack();
        this.setMinimumSize(this.getPreferredSize());
        this.setVisible(true);


    }
    public class panel extends JPanel{

        private JLabel Absender=new JLabel();
        private JLabel AbsenderText =new JLabel("Absender :");
        private JLabel Betreff=new JLabel();
        private JLabel BetreffText =new JLabel("Betreff :");
        private JLabel Datum=new JLabel();
        private JLabel DatumText =new JLabel("Datum :");
        private JTextArea email=new JTextArea();

        public panel(){
            createPanel();
        }

        public void createPanel(){
        this.setLayout(new GridBagLayout());
        GridBagConstraints constraints = new GridBagConstraints();
        constraints=makeConstraints(1,1,1,1);
        AbsenderText.setPreferredSize(new Dimension(50,10));
        this.add(AbsenderText,constraints);
        constraints=makeConstraints(2,1,1,1);
        Absender.setPreferredSize(new Dimension(550,10));
        this.add(Absender,constraints);
        constraints=makeConstraints(1,2,1,1);
        BetreffText.setPreferredSize(new Dimension(50,10));
        this.add(BetreffText,constraints);
        constraints=makeConstraints(2,2,1,1);
        Betreff.setPreferredSize(new Dimension(550,10));
        this.add(Betreff,constraints);
        constraints=makeConstraints(1,3,1,1);
        DatumText.setPreferredSize(new Dimension(50,10));
        this.add(DatumText,constraints);
        constraints=makeConstraints(2,3,1,1);
        Datum.setPreferredSize(new Dimension(550,10));
        this.add(Datum,constraints);
        constraints=makeConstraints(1,4,2,1);
        email.setPreferredSize(new Dimension(600,230));
        this.add(email);
    }
    private GridBagConstraints makeConstraints (int gridx , int gridy , int gridwidth , int gridheight){
       GridBagConstraints constraints = new GridBagConstraints();
       constraints.gridx=gridx;
       constraints.gridy=gridy;
       constraints.gridwidth=gridwidth;
       constraints.gridheight=gridheight;
       constraints.insets = new Insets(2,2,2,2);
       return constraints;
    }
    }

    public static void main (String [] args){
        new KSKB2();
    }
}
Es soll dann so aussehen:

Absendertext(1,1,1,1) : Absender(1,2,1,1)
Betrefftext(1,2,1,1) : Betreff(2,2,1,1)
DatumText(1,3,1,1): Datum(2,3,1,1)
------------------>Email(1,4,2,1)<-----------------

in Klammer stehen immer die Zahlen für die constraints beim GridBagLayout (gridx,gridy,gridweight,gridheight) gebraucht werden.

leider funktioniert die ganze Sache nicht wie ich es mir vorstelle da er die Labels Rechts neben die TextArea schreibt anstatt sie darüber zusetzen.

und jetzt die Preisfrage warum !?

Lg
 
Hmpf. Das GridBagLayout ist ein Krampf, sollte man nur da verwenden wo es unbedingt nötig ist :noe:

Lies' dir die Dokus zu den Layouts (und Swing allgemein) durch, sonst wird das nix.
Java:
import java.awt.*;
import javax.swing.*;

public class KSKB3 extends JFrame {

    private JLabel absender=new JLabel();
    private JLabel betreff=new JLabel();
    private JLabel datum=new JLabel();
    private JTextArea email=new JTextArea();

    public KSKB3()
    {
        getContentPane().setLayout(new BorderLayout());
        getContentPane().add(createTitlePanel(), BorderLayout.NORTH);
        email.setPreferredSize(new Dimension(500, 500));
        getContentPane().add(email, BorderLayout.CENTER);

        pack();
        setMinimumSize(this.getPreferredSize());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);


    }

    private JPanel createTitlePanel()
    {
        JPanel titlePanel = new JPanel(new GridBagLayout());
        GridBagConstraints constraints = new GridBagConstraints();

        constraints=makeConstraints(0,0,1,1);
        titlePanel.add(new JLabel("Absender :"),constraints);

        constraints=makeConstraints(1,0,1,1);
        titlePanel.add(absender,constraints);

        constraints=makeConstraints(0,1,1,1);
        titlePanel.add(new JLabel("Betreff :"),constraints);

        constraints=makeConstraints(1,1,1,1);
        titlePanel.add(betreff,constraints);

        constraints=makeConstraints(0,2,1,1);
        titlePanel.add(new JLabel("Datum :"),constraints);

        constraints=makeConstraints(1,2,1,1);
        titlePanel.add(datum,constraints);

        datum.setPreferredSize(new Dimension(500, 20));

        return titlePanel;
    }
    private static GridBagConstraints makeConstraints(
        int gridx , int gridy , int gridwidth , int gridheight)
    {
       GridBagConstraints constraints = new GridBagConstraints();
       constraints.gridx=gridx;
       constraints.gridy=gridy;
       constraints.gridwidth=gridwidth;
       constraints.gridheight=gridheight;
       constraints.insets = new Insets(2,2,2,2);
       return constraints;
    }

    public static void main (String [] args){
        new KSKB3();
    }
}
 
Ja es ist wirklich in Krampf, allerdings denke ich das man damit schon am meisten machen kann und jetzt kommt der Witz des Tages.
Eigentlich funktioniert auch mein Code allerdings hat sich bei mir ein ziemlich dummer Fehler eingeschlichen, weswegen man mich wohl offiziell hauen darf.

Java:
        constraints=makeConstraints(1,4,2,1);
        email.setPreferredSize(new Dimension(600,230));
        this.add(email);

gut wenn man die constraints richtig definiert, schlecht wenn man sie nicht benutzt um die Componete hinzuzufügen. -.-

Java:
        constraints=makeConstraints(1,4,2,1);
        email.setPreferredSize(new Dimension(600,230));
        this.add(email,constraints);

Als nächstes werde ich jetzt noch Borders hinzufügen, bei entsprechenden Problemen würde ich mich hier nochmal melden.
 
Ja das stimmt hab ich auch geändert, irgendwann fällt man damit bestimmt hin wenn mans falsch macht.
hab das ganze projekt jetzt nochmal ein bissel überarbeitet und komme auch so recht gut hin allerdings, hakt noch es noch ein einem einzigen Punkt.

Hier mal erst der Quellcode dazu:

Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package bullshit;


import java.awt.*;
import javax.swing.*;

public class KSKB3 extends JFrame {

    private JLabel Absender=new JLabel();
    private JLabel AbsenderText=new JLabel("Absender :");
    private JLabel Betreff=new JLabel();
    private JLabel BetreffText=new JLabel("Betreff :");
    private JLabel Datum=new JLabel();
    private JLabel DatumText=new JLabel("Datum :");
    private JTextArea email=new JTextArea();

    public KSKB3()
    {
        this.setContentPane(new Panel());
        this.setMinimumSize(this.getPreferredSize());
        this.pack();
        this.setVisible(true);


    }



    public class Panel extends JPanel{

        private TitlePanel titel=new TitlePanel();
        private EMailPanel emailPanel =new EMailPanel();


        public Panel(){
            titel.createTitlePanel();
        titel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        //titel.setPreferredSize(new Dimension(600,60));
        emailPanel.createEMailPanel();
        emailPanel.setPreferredSize(new Dimension(600,220));
        this.setLayout(new BorderLayout());
        this.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
        this.add(titel, BorderLayout.NORTH);
        this.add(emailPanel, BorderLayout.CENTER);
        }


    }
    private static GridBagConstraints makeConstraints(
        int gridx , int gridy , int gridwidth , int gridheight)
    {
       GridBagConstraints constraints = new GridBagConstraints();
       constraints.gridx=gridx;
       constraints.gridy=gridy;
       constraints.gridwidth=gridwidth;
       constraints.gridheight=gridheight;
       constraints.insets = new Insets(2,2,2,2);
       return constraints;
    }




    public class TitlePanel extends JPanel{

        public TitlePanel(){
        }
        public void createTitlePanel(){
        this.setLayout(new GridBagLayout());
        GridBagConstraints constraints = new GridBagConstraints();
        this.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        constraints=makeConstraints(0,0,1,1);
        constraints.anchor=constraints.NORTHWEST;
        AbsenderText.setPreferredSize(new Dimension(100,10));
        this.add(AbsenderText,constraints);
        constraints=makeConstraints(1,0,1,1);
        constraints.fill=constraints.VERTICAL;
        Absender.setPreferredSize(new Dimension(450,10));
        this.add(Absender,constraints);
        constraints=makeConstraints(0,1,1,1);
        BetreffText.setPreferredSize(new Dimension(100,10));
        this.add(BetreffText,constraints);
        constraints=makeConstraints(1,1,1,1);
        constraints.fill=constraints.VERTICAL;
        Betreff.setPreferredSize(new Dimension(450,10));
        this.add(Betreff,constraints);
        constraints=makeConstraints(0,2,1,1);
        DatumText.setPreferredSize(new Dimension(100,10));
        this.add(DatumText,constraints);
        constraints=makeConstraints(1,2,1,1);
        constraints.fill=constraints.VERTICAL;
        Datum.setPreferredSize(new Dimension(450,10));
        this.add(Datum,constraints);
        }

    }



    public class EMailPanel extends JPanel{

        public EMailPanel(){


        }
        public void createEMailPanel(){
            this.setLayout(new GridLayout(1,1));
            this.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
            this.add(email);
        }
    }



    public static void main (String [] args){
        new KSKB3();
    }
}

zu erklärung KSKB3 ist eigentlich ein JPanel was in einem Splitpane liegt dieses liegt in einem anderem Splitpane was in dem JFrame liegt. Allerdings wird man in einem TeilBereich des Progs auch KSKB3 direkt in einem JFrame aufrufen.

So nun zu meinem Problem wie man sieht ist das passt sich das EMailPanel der grösse des JFrames an, ebenso das TitlePanel (was man am schwarzen Rahmen sehr schön sieht), was ich allerdings doof finde ist das der Content von dem TitlePanel sich bei größern des JFrames verschiebt. was nicht so sein sollte, der Content sollte IMMER ganz links stehen und sich nicht verschieben. Wie kann man das realiesieren !?

Lg Jens
 
Lies - mehr - Doku
(und probier' an Minibeispielen rum!)

Java:
    private static GridBagConstraints makeConstraints(
        int gridx , int gridy , int gridwidth , int gridheight, double weightx)
    {
       GridBagConstraints constraints = new GridBagConstraints();
       constraints.gridx=gridx;
       constraints.gridy=gridy;
       constraints.gridwidth=gridwidth;
       constraints.gridheight=gridheight;
       constraints.weightx=weightx;
       constraints.insets = new Insets(2,2,2,2);
       return constraints;
    }




    public class TitlePanel extends JPanel{

        public TitlePanel(){
        }
        public void createTitlePanel(){
        this.setLayout(new GridBagLayout());
        GridBagConstraints constraints = new GridBagConstraints();
        this.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        constraints=makeConstraints(0,0,1,1,0);
        constraints.anchor=constraints.NORTHWEST;
        //AbsenderText.setPreferredSize(new Dimension(100,10));
        this.add(AbsenderText,constraints);
        constraints=makeConstraints(1,0,1,1,1);
        constraints.fill=constraints.VERTICAL;
        //Absender.setPreferredSize(new Dimension(450,10));
        this.add(Absender,constraints);
        constraints=makeConstraints(0,1,1,1,0);
        //BetreffText.setPreferredSize(new Dimension(100,10));
        this.add(BetreffText,constraints);
        constraints=makeConstraints(1,1,1,1,1);
        constraints.fill=constraints.VERTICAL;
        //Betreff.setPreferredSize(new Dimension(450,10));
        this.add(Betreff,constraints);
        constraints=makeConstraints(0,2,1,1,0);
        //DatumText.setPreferredSize(new Dimension(100,10));
        this.add(DatumText,constraints);
        constraints=makeConstraints(1,2,1,1,1);
        constraints.fill=constraints.VERTICAL;
        //Datum.setPreferredSize(new Dimension(450,10));
        this.add(Datum,constraints);
        }

    }
 

Neue Themen


Zurück
Oben