Swing Bedienelemente ordnen sich automatisch neu an

SteveT

Mitglied
Hallo,
jedes Mal, wenn man das Fenster maximiert, bzw. minimiert, werden die Bedienelemte automatisch neu in eine horizontale Linie angeordnet. Wie kann ich diesen Fehler beheben?
Java:
package programm;

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.border.LineBorder;

import org.xml.sax.SAXNotSupportedException;

public class Main {

    static JPanel mainpanel;
    static JMenuItem neuesp;
    static JMenuItem sploeschen;
  
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        JFrame mainframe = new JFrame();
        mainframe.setBounds(250, 70, 900, 500);
        mainpanel = new JPanel();
        mainpanel.setBackground(Color.gray);
        mainpanel.setLayout(null);
        mainframe.add(mainpanel);

        JMenuBar bar = new JMenuBar();
        bar.setBounds(0, 0, 1366, 23);
        mainpanel.add(bar);

        JMenu datei = new JMenu("Datei");
        datei.setFont(new Font("SansSerif", Font.PLAIN, 16));
        JMenuItem btausw = new JMenuItem("Backing Track auswählen");
        datei.add(btausw);
        bar.add(datei);

        JMenu spuren = new JMenu("Spuren");
        spuren.setFont(new Font("SansSerif", Font.PLAIN, 16));
        neuesp = new JMenuItem("Neue Spur");
        spuren.add(neuesp);

        sploeschen = new JMenuItem("Spur(en) löschen");
        spuren.add(sploeschen);
        bar.add(spuren);
      
        mainframe.setVisible(true);
      
        Spuren.clickhandler();
    }

}

Java:
package programm;

import java.awt.Component;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JMenuBar;
import javax.swing.JSlider;
import javax.swing.event.ChangeListener;

public class Spuren {
  
    static int anz = 5;
  
    static int n = 0;
    static int y = 0;
  
    static JMenuBar[] audiobar = new JMenuBar[anz];
  
    static JButton[] play = new JButton[anz];
    static JButton[] pause = new JButton[anz];
    static JButton[] mute = new JButton[anz];
    static JButton[] rec = new JButton[anz];
    static JButton[] begin = new JButton[anz];
    static JButton[] close = new JButton[anz];
    static JButton[] stop = new JButton[anz];
    static JButton[] replay = new JButton[anz];
  
    static JSlider[] audioslider = new JSlider[anz];
    static JSlider[] volumeslider = new JSlider[anz];
  
    static JLabel[] titel = new JLabel[anz];
    static JLabel[] tracklaenge = new JLabel[anz];
  
    public static void clickhandler(){
      
        Main.neuesp.addActionListener(new ActionListener() {
          
            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                audiobar[n] = new JMenuBar();
                audiobar[n].setBounds(5, 25+98*y, 1355, 90);
                Main.mainpanel.add(audiobar[n]);

                play[n] = new JButton();
                play[n].setBounds(5, 29, 50, 28);
                audiobar[n].add(play[n]);
              
                pause[n] = new JButton();
                pause[n].setBounds(60, 29, 50, 28);
                audiobar[n].add(pause[n]);

                mute[n] = new JButton();
                mute[n].setBounds(115, 29, 50, 28);
                audiobar[n].add(mute[n]);

                rec[n] = new JButton();
                rec[n].setBounds(5, 60, 50, 28);
                audiobar[n].add(rec[n]);

                stop[n] = new JButton();
                stop[n].setBounds(60, 60, 50, 28);
                audiobar[n].add(stop[n]);

                begin[n] = new JButton();
                begin[n].setBounds(115, 60, 50, 28);
                audiobar[n].add(begin[n]);
              
                replay[n] = new JButton();
                replay[n].setBounds(210, 0, 50, 27);
                audiobar[n].add(replay[n]);
              
                close[n] = new JButton();
                close[n].setBounds(5, 0, 50, 27);
                audiobar[n].add(close[n]);

                titel[n] = new JLabel("titel shshsh");
                audiobar[n].add(titel[n]);

                tracklaenge[n] = new JLabel("10:20");
                audiobar[n].add(tracklaenge[n]);

                audioslider[n] = new JSlider();
                audioslider[n].setBounds(170, 38, 700, 30);
                audiobar[n].add(audioslider[n]);
              
                volumeslider[n] = new JSlider();
                volumeslider[n].setBounds(170, 38, 700, 30);
                audiobar[n].add(volumeslider[n]);

                Main.mainpanel.repaint();
              
                n++;
                y++;
            }
        });
    }

}

Schonmal Danke für die Hilfe!
 
Zuletzt bearbeitet von einem Moderator:
Wie sollten sie sich den anordnen?
Warum verwendest du ein JMenuBar als Container für Buttons und Labels? Schon mal daran gedacht das eine JMenuBar ein LayoutManager benutzt um alle Menüpunkte horizontal hintereinander anzuordnen?
Du solltest eher ein JPanel (mit entsprechenden LayoutManager) dafür verwenden. (Und vermeide es ein "null"-Layout zu verwenden)

Das einzige mal wo "static" in deinem Code vorkommen sollte wäre (in diesem Fall) in der main-Methode, alle anderen solltest du versuchen wegzubekommen -> objektorientierte Programmierung.
Normalerweise wird eine JMenuBar einem JFrame hinzugefügt, siehe auch die entsprechende Methode: https://docs.oracle.com/javase/7/docs/api/javax/swing/JFrame.html#setJMenuBar(javax.swing.JMenuBar)
 
Danke für die Tipps!
Eine JMenuBar als Container zu benutzen ist zwar nicht die eleganteste Lösung, aber es erfüllt ihre optischen und funktionellen Zwecke.
Was ist verkehrt daran ein null-Layout null zu verwenden?
 

Zurück
Oben