Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ist das hier möglich, ohne das null-Layout oder den GridBag-Layout-Manager zu benutzen?
Diese GUI hatte ich für ein Projekt von mir im Kopf, habe sie hier einmal mit Visual Studio erstellt. Es geht mir hierbei nicht um die einzelnen Komponenten, sondern einen großen Deknanstoß, WIE man hier die Layoutmanager verschachteln müsste.
So soll das Ganze aussehen:
a: BorderLayout.SOUTH
b: alle Komponenten auf ein JPanel mit FlowLayout (oder BorderLayout (Textfeld WEST, Button1 CENTER, Button2 EAST). JPanel BorderLayout.CENTER
c und c1: auf ein JPanel mit BorderLayout (WEST (GroupBox1) und EAST (GroupBox2)). JPanel auf JFrame (BorderLayout.NORTH)
Ich habe also immer einzelne Teile zu einem zusammengefasst, die in einer Spalte sind oder eine andere Gemeinsamkeit haben/zusammen gehören.
Okay, danke.
Aber wie ist das mit der GroupBox1? Das ist ja auch ein JPanel, aber wie ordne ich das an?
GridLayout geht nicht, FlowLayout wüsst ich auch nicht wie. BorderLayout geht ja auch nicht.
Ohne GridBagLayout? Dann würde ich ein BorderLayout nehmen, den mittleren Bereich mit dem Label füllen und den südlichen mit einem Panel das ein GridLayout hat und zwei Buttons trägt.
Eigentlich wollte ich erst einmal etwas Übung mit den anderen Layouts kriegen^^
Und außerdem habe ich bisher nur Schlechts über das GridBagLayout gehört
Habe versucht, das jetzt einmal umzusetzen.
Das Ergebnis ist aber irgendwie ernüchternd und nicht das, was ich mir vorgestellt habe:
Hierbei ist oben links im JPanel viel zu viel Platz.
Außerdem ist von der Mitte nach unten viel zu wenig Abstand zwischen den JPanels und am Rand. Habe versucht, das mit setH/Vgaps etc. auszubügeln, aber ohne Erfolg.
Außerdem sieht man die JProgressBar kaum, auch sie hat zu wenig Abstand. Abhilfe? =/
Java:
public class GUI extends JFrame
{
private Server server;
private Image icon;
//Components
private JButton startServer;
private JButton stopServer;
private JLabel serverState;
private JScrollPane boundClients;
private JButton refreshList;
private JTextField picturePath;
private JButton selectPicturePath;
private JButton changeDesktop;
private JProgressBar progress;
//Listener
private ButtonListener buttonListener = new ButtonListener(this);
public GUI()
{
super("RemoteDesktopChange");
//Icon settings
URL res = this.getClass().getResource("icon.png");
Image image = Toolkit.getDefaultToolkit().getImage(res);
setIconImage(image);
//Component initializing
startServer = new JButton("Start server");
startServer.addActionListener(buttonListener);
stopServer = new JButton("Stop server");
stopServer.addActionListener(buttonListener);
serverState = new JLabel("Server state: offline");
serverState.setHorizontalAlignment(SwingConstants.CENTER);
String[] listContent = {"Hermann-PC", "Martin-PC", "Slughorn-PC", "Röhrenvogelkanone-PC"};
boundClients = new JScrollPane(new JList(listContent));
refreshList = new JButton("Refresh");
refreshList.addActionListener(buttonListener);
picturePath = new JTextField("Select a file");
selectPicturePath = new JButton("Durchsuchen");
selectPicturePath.addActionListener(buttonListener);
changeDesktop = new JButton("Change!");
changeDesktop.addActionListener(buttonListener);
progress = new JProgressBar();
//Frame settings
getContentPane().add(createMainPanel()); //Draws the panel containing all components
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationByPlatform(true);
setSize(300, 300);
pack();
setResizable(false);
setVisible(true);
}
/**
* Sets all sub-panels with their respective
* components and compounds them into one.
*/
private JPanel createMainPanel()
{
JPanel mainPanel = new JPanel(new BorderLayout());
BorderLayout bl = new BorderLayout();
bl.setVgap(10);
JPanel northPanel = new JPanel(bl);
//NorthPanel
JPanel serverPanel = new JPanel(new BorderLayout());
JPanel innerLabelPanel = new JPanel(new BorderLayout());
innerLabelPanel.add(serverState, BorderLayout.CENTER);
JPanel innerButtonPanel = new JPanel(); //FlowLayout
innerButtonPanel.add(startServer);
innerButtonPanel.add(stopServer);
serverPanel.add(innerLabelPanel, BorderLayout.NORTH);
serverPanel.add(innerButtonPanel, BorderLayout.SOUTH);
serverPanel.setBorder(BorderFactory.createTitledBorder("Server"));
JPanel clientSelectionPanel = new JPanel(new BorderLayout());
clientSelectionPanel.add(boundClients, BorderLayout.NORTH);
clientSelectionPanel.add(refreshList, BorderLayout.SOUTH);
clientSelectionPanel.setBorder(BorderFactory.createTitledBorder("Bound clients"));
northPanel.add(serverPanel, BorderLayout.WEST);
northPanel.add(clientSelectionPanel, BorderLayout.EAST);
//CenterPanel
JPanel changeDesktopPanel = new JPanel(); //FlowLayout
changeDesktopPanel.add(picturePath); //Left
changeDesktopPanel.add(selectPicturePath); //Center
changeDesktopPanel.add(changeDesktop); //Right
changeDesktopPanel.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED));
//Compound all
mainPanel.add(northPanel, BorderLayout.NORTH);
mainPanel.add(changeDesktopPanel, BorderLayout.CENTER);
mainPanel.add(this.progress, BorderLayout.SOUTH);
return mainPanel;
}
}
(wenn ihr schlechten Codestil entdeckt, bitte melden )
PS: Das Ganze soll übrigens ein kleines Projekt in Gedenken an meinen Kumpel werden; immer, wenn ich mit Freunden bei ihm bin, ändern wir seinen Desktophintergrund in irgendwas Bescheuertes (z.B. Pokémon oder Gollum, Barbie, ...) und es ist immer wieder lustig. Jetzt wollte ich ein Programm schreiben, mit dem ich auch bequem von hier aus den Hintergrund ändern kann^^ Und damit ich das Ganze steuern kann, diese GUI.
HGaps und VGaps sind schon richtig:
[java=73] JPanel mainPanel = new JPanel(new BorderLayout(6, 6));[/code]
Außerdem solltest Du beim BorderLayout möglichst immer den CENTER-Bereich bedecken, denn das ist der einzige der seine Größe in zwei Dimensionen anpassen kann:
[java=96]northPanel.add(clientSelectionPanel, BorderLayout.CENTER); [/code]
Hierbei ist oben links im JPanel viel zu viel Platz.
@jason: Genau, das meinte ich, war halt nur schon so spät ^^
Diesen Abstand meine ich noch. Habe das umgesetzt, was du, Ebenius, mir empfohlen
hast. Der Abstand zwischen den Panels ist jetzt gut, totz- und dem bleibt ↑ dieser Abstand immer gleich.