GridBagLayout mit 50%iger Verteilung der Spaltenbreite

prätorianer

Grünschnabel
Hallo Forum,

ich habe ein Problem mit dem GridBagLayout.

Ich möchte mein Dialogfenster mit jeweils 50% rechts/links aufteilen. Im linken Bereich befindet sich eine Liste mit Schülern. Im rechten Bereich die Bearbeitungsfelder des Schülers. In der letzten, untersten Zeile des GridBagLayout wird ein JPanel mit zwei Schaltern über alle Spalten gedehnt (ich hab das mal grün eingefärbt). Siehe Bild Editor.jpg

Editor.JPG

Auf den ersten Blick schaut das schon recht gut aus. Problematisch wird es jedoch bei einer Größenänderung des Fensters. Siehe Bild Editor1.jpg

Editor1.JPG

Ich habe dann mit eigenstädigen JPanel's für die linke und die rechte Seite experimentiert und auch hier den JPanels etwas Farbe gegeben. Siehe Bild Editor3.jpg

Editor3.JPG

Mit editor3.jpg komme ich meinem gewünschten Layout schon recht nah. Auch wenn der Makel nur geringfügig ist bzw. erscheint... wie bekomme ich das JLabel der Note auf die gleiche Höhe wie die JList mit der Schülerliste? Zur Zeit ist das leider auf Höhe des JLabel's der Schülerliste.

Ich bin für jeden Hinweis und Tipp dankbar. Wenn benötigt reiche ich gerne den Quellcode nach.

Vielen Dank im voraus. Es grüßt


prätorianer
 
Muss das unbedingt eine 50:50 Aufteilung sein? Weil das erste Bild sieht doch ganz gut aus. Wahrscheinlich sind nur die Costraints nicht ganz optimal gesetzt, was die Auswirkungen beim Ändern der Größer erklären würde.

Und mit zwei neben einander liegenden Panels kannst du das nicht wirklich beinflussen, nein. Dazu musst du das wirklich an einem Raster ausrichten, anders gehts nicht, da es ja sonst keinen Bezug gibt.
 
OT: Und wenn du nicht schon bereits zuviel Aufwand betrieben hast, einfach das GridBagLayout in die Tonne treten und dafür TableLayout verwenden. Weil dieses hatte ich in fünf Minuten verstanden :p
 
Beim ersten Punkt zur 50/50 Aufteilung solltest du mit weightx ein bisschen herumexpermientieren.

Code:
GridBagConstraints c = new GridBagConstraints();
c.weightx = 0.5; //ein wert von 0 bis 1

für das Gleichstellen des JLabels solltest du mit den insets arbeiten.

Code:
GridBagConstraints c = new GridBagConstraints();
c.insets = new Insets(top, left, bottom, right); //ein wert von 0 bis 1

Falls dein Fenster sich mit den Textfields zu groß skaliert, kann es daran liegen, dass du wahrscheinlich die ganze Spalte der Tabelle füllst.

Code:
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;

Es kann beim Gridbaglayout auch gerne zu bugs kommen, da wie man bei dir sieht die Elemente ihr Größe verändern wenn sie möglicherweise vergrößert oder verkleinert werden, was dazu führen kann, dass die Elemente sprunghaft größer oder kleiner werden. Diesem kann mit einem Setzen einer minimalgröße entgegengewirkt werden.

Code:
Object.setPreferredSize(new Dimension(x,y));
Object.setMinimumSize(new Dimension(x,y));

Du solltest Preferred und MinimumSize setzen, da es beim setzen von nur einer Eigenschaft dann zu Problemen in der Darstellung kommen kann.
 
Hallo,

zunächst möchte ich mich für euere Unterstützung bedanken.

@slowfly:
Vielen Dank für deinen Hinweis. Das TableLayout kannte ich bisher noch nicht. Hierzu noch eine Frage. Wie verbinde ich mehrere Zellen spalten- bzw. zeilenweise? Das würde ich z.B. bei der Schülerliste benötigen, da sie über 2 Spalten und mindestens 3 Zeilen gedehnt werden muss.

@Akeshihiro, @Jungspund:
Zu Beginn dachte ich, eine 50%ige Verteilung wäre mit Java und Swing einfacher realisierbar... ich habe nun auch ein wenig mit den Constraints herumexperimentiert. (siehe Editor1.jpg und Editor2.jpg)

Editor1.JPG

Editor2.JPG

Leider skalieren die Steuerelemente bei einer Größenänderung des Fensters immer noch nicht wie gewünscht.

Die JLabel und JTextField Steuerelemente in der ersten Zeile verteilen sich wie folgt:
10% 40% 10% 40%

In der zweiten Zeile habe ich 2 JLabel mit einer Verteilung von:
50% 50%

In der dritten Zeile befindet sich eine JList, ein JLabel und ein JTextArea mit der Verteilung:
50% 10% 40%

@Jungspund:
Deinen Vorschlag mit dem Setzten der minimalen und der empfohlenen Größe habe ich versucht. Allerdings handelt es sich dabei um eine statische Angabe der Größe des Steuerelementes, oder? Wünschenswert wäre eine dynamische, prozentuale Größenangabe. Geht das mit Dimension überhaupt?

Habt ihr noch eine Idee was man machen könnte?

Hier der Quellcode:
Code:
  /**
   * Erstellt die Benutzeroberflaeche mit den Steuerelementen.
   */
  private void setGUI() {
    
    this.getContentPane().setLayout(new GridBagLayout());
    
    // Klassen lesen
    klassenLesen();
    
    // Schaltflaeche: Speichern
    btnSpeichern = new JButton("Speichern");
    btnSpeichern.addActionListener(new ActionListener() {
      
      @Override
      public void actionPerformed(ActionEvent e) {
        noteSpeichern();
      }
    });

    // Schaltflaeche: Abbrechen
    btnAbbrechen = new JButton("Abbrechen");
    btnAbbrechen.addActionListener(new ActionListener() {

      @Override
      public void actionPerformed(ActionEvent arg0) {
        closeDialog();
      }
    });

    // Schaltflaechen mit einheitlicher Groesse
    btnSpeichern.setPreferredSize(btnAbbrechen.getPreferredSize());
    
    // Hauptpanel des Editors fuer umlaufenden Rahmen
    JPanel jPanelEditor = new JPanel(new GridBagLayout());
    
    // JPanel fuer das linke und rechte JPanel
    //JPanel panelEditor = new JPanel(new GridLayout(1, 2));
    //panelEditor.setBackground(Color.CYAN);
    
    // JPanel fuer den linken Bereich
    //JPanel panelEditorLinks = new JPanel(new GridBagLayout());
    //panelEditorLinks.setBackground(Color.BLUE);
    
    // JPanel fuer den rechten Bereich
    //JPanel panelEditorRechts = new JPanel(new GridBagLayout());
    //panelEditorRechts.setBackground(Color.YELLOW);
    
    // linkes und rechtes JPanel dem Editor-Panel hinzufuegen
    //panelEditor.add(panelEditorLinks);
    //panelEditor.add(panelEditorRechts);
    
    jPanelEditor.add(new JLabel("Klasse: "),
        new GridBagConstraints(0, 0, 1, 1, 0.10, 0.0, 
            GridBagConstraints.WEST, 
            GridBagConstraints.NONE, 
            new Insets(0, 0, 0, 0), 0, 0));

    cboKlassen = new JComboBox<Klasse>(vecKlassenvektor);
    cboKlassen.addActionListener(new ActionListener() {
      
      @Override
      public void actionPerformed(ActionEvent arg0) {        
        aktualisiereAuswahlElemente();
      }
    });
    
    jPanelEditor.add(cboKlassen,
        new GridBagConstraints(1, 0, 1, 1, 0.40, 0.0, 
            GridBagConstraints.WEST, 
            GridBagConstraints.HORIZONTAL, 
            new Insets(0, 0, 0, 0), 0, 0));

    // Faecher der Klasse lesen
    klassefaecherLesen();
    
    // Schueler der Klasse lesen
    klasseschuelerLesen();
    
    jPanelEditor.add(new JLabel("Fach: "),
        new GridBagConstraints(2, 0, 1, 1, 0.10, 0.0, 
            GridBagConstraints.WEST, 
            GridBagConstraints.NONE, 
            new Insets(0, 10, 0, 0), 0, 0));

    cboFaecher = new JComboBox<Fach>(vecFachvektor);
    cboFaecher.addActionListener(new ActionListener() {
      
      @Override
      public void actionPerformed(ActionEvent e) {
        aktualisiereNotenElemente();
      }
    });
    
    jPanelEditor.add(
        cboFaecher,
        new GridBagConstraints(3, 0, 1, 1, 0.40, 0.0,
            GridBagConstraints.WEST, 
            GridBagConstraints.HORIZONTAL,
            new Insets(0, 0, 0, 0), 0, 0));

    lstSchueler = new JList<Schueler>(vecSchuelervektor);
    lstSchueler.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    /*
    lstSchueler.setPreferredSize( new Dimension(200, 150));
    lstSchueler.setMinimumSize(new Dimension(200, 150));
    */
    lstSchueler.addListSelectionListener(new ListSelectionListener() {
      
      @Override
      public void valueChanged(ListSelectionEvent e) {
        aktualisiereNotenElemente();
      }
    });

    // die Scrollbar der Schuelerliste
    JScrollPane scrollerSchueler = new JScrollPane(lstSchueler);
    // immer sichtbar
    scrollerSchueler.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

    jPanelEditor.add(
        new JLabel("Schülerliste: "),
        new GridBagConstraints(0, 1, 2, 1, 0.50, 0.0,
            GridBagConstraints.WEST, 
            GridBagConstraints.HORIZONTAL,
            new Insets(5, 0, 0, 0), 0, 0));
    
    jPanelEditor.add(
        new JLabel(""),
        new GridBagConstraints(2, 1, 2, 1, 0.50, 0.0,
            GridBagConstraints.WEST, 
            GridBagConstraints.HORIZONTAL,
            new Insets(5, 10, 0, 0), 0, 0));
    
    jPanelEditor.add(
        scrollerSchueler,
        new GridBagConstraints(0, 2, 2, 6, 0.50, 1.0,
            GridBagConstraints.WEST, 
            GridBagConstraints.BOTH,
            new Insets(0, 0, 0, 0), 0, 0));
    
    jPanelEditor.add(
        new JLabel("Noten: "),
        new GridBagConstraints(2, 2, 1, 1, 0.10, 0.0,
            GridBagConstraints.WEST, 
            GridBagConstraints.NONE,
            new Insets(0, 10, 0, 0), 0, 0));
    
    txtNoten = new JTextArea("");
    txtNoten.setEnabled(false);
    txtNoten.setLineWrap(true);
    txtNoten.setWrapStyleWord(true);
    
    JScrollPane scrollerNoten = new JScrollPane(txtNoten);
    // immer sichtbar
    scrollerNoten.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    //scrollerNoten.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    
    jPanelEditor.add(
        scrollerNoten,
        new GridBagConstraints(3, 2, 1, 3, 0.40, 1.0,
            GridBagConstraints.WEST, 
            GridBagConstraints.BOTH,
            new Insets(0, 0, 0, 0), 0, 0));

    jPanelEditor.add(
        new JLabel("Durchschnitt: "),
        new GridBagConstraints(2, 5, 1, 1, 0.10, 0.0,
            GridBagConstraints.WEST, 
            GridBagConstraints.NONE,
            new Insets(5, 10, 0, 0), 0, 0));

    txtNotendurchschnitt = new JTextField("");
    txtNotendurchschnitt.setEnabled(false);
    txtNotendurchschnitt.setBorder(BorderFactory.createLineBorder(Color.GRAY));
    jPanelEditor.add(
        txtNotendurchschnitt,
        new GridBagConstraints(3, 5, 1, 1, 0.40, 0.0,
            GridBagConstraints.WEST, 
            GridBagConstraints.HORIZONTAL,
            new Insets(5, 0, 0, 0), 0, 0));

    // ActionListener fuer JRadioButtons
    ActionListener al = new ActionListener() {
      
      @Override
      public void actionPerformed(ActionEvent e) {
        String strNote = e.getActionCommand();
        try {
          iNote = Integer.parseInt(strNote);
        } catch (NumberFormatException e1) {
          //e1.printStackTrace();
          iNote = 0;
        }
      }
    };
    
    // JRadioButtons fuer Notenvergabe 
    // Note: 1
    btnEins.setMnemonic(KeyEvent.VK_1);
    btnEins.setActionCommand("1");
    btnEins.setSelected(true);
    btnEins.addActionListener(al);
    
    // Note: 2
    btnZwei.setMnemonic(KeyEvent.VK_2);
    btnZwei.setActionCommand("2");
    btnZwei.addActionListener(al);
    
    // Note: 3
    btnDrei.setMnemonic(KeyEvent.VK_3);
    btnDrei.setActionCommand("3");
    btnDrei.addActionListener(al);
    
    // Note: 4
    btnVier.setMnemonic(KeyEvent.VK_4);
    btnVier.setActionCommand("4");
    btnVier.addActionListener(al);
    
    // Note: 5
    btnFuenf.setMnemonic(KeyEvent.VK_5);
    btnFuenf.setActionCommand("5");
    btnFuenf.addActionListener(al);
    
    // Note: 6
    btnSechs.setMnemonic(KeyEvent.VK_6);
    btnSechs.setActionCommand("6");
    btnSechs.addActionListener(al);
    
    // Radio Buttons gruppieren
    notenGruppe.add(btnEins);
    notenGruppe.add(btnZwei);
    notenGruppe.add(btnDrei);
    notenGruppe.add(btnVier);
    notenGruppe.add(btnFuenf);
    notenGruppe.add(btnSechs);
    
    JPanel notenPanel = new JPanel(new GridLayout(0, 1));
    notenPanel.add(btnEins);
    notenPanel.add(btnZwei);
    notenPanel.add(btnDrei);
    notenPanel.add(btnVier);
    notenPanel.add(btnFuenf);
    notenPanel.add(btnSechs);
    
    jPanelEditor.add(notenPanel,
        new GridBagConstraints(3, 6, 1, 2, 0.40, 1.0, 
            GridBagConstraints.WEST, 
            GridBagConstraints.BOTH, 
            new Insets(5, 0, 0, 0), 0, 0));
    
    // JPanel fuer Schaltflaechen im unteren Bereich des Dialogfensters
    JPanel panelUnten = new JPanel(new FlowLayout());
    //panelUnten.setBackground(Color.GREEN);
    
    panelUnten.add(btnAbbrechen);
    panelUnten.add(btnSpeichern);
    
    // Editor-Panel dem Dialogfenster hinzufuegen
    this.getContentPane().add(jPanelEditor, 
        new GridBagConstraints( 0, 0, 1, 1, 1.0, 1.0, 
            GridBagConstraints.WEST,
            GridBagConstraints.BOTH, 
            new Insets( 5, 10, 5, 10), 0, 0));
    
    // JPanel mit den Schaltfaechen dem Dialogfenster hinzufuegen
    this.getContentPane().add(panelUnten,
        new GridBagConstraints(0, 1, 4, 1, 1.0, 0.0, 
            GridBagConstraints.SOUTH, 
            GridBagConstraints.HORIZONTAL, 
            new Insets(0, 0, 0, 0), 0, 0));

  } // setUI

Es grüßt

prätorianer
 

Neue Beiträge

Zurück