Moin,
ich würde sehr gerne Objekte einem Panel zu weisen, aber bekomme das nicht hin, einen bestimmten Ort auszuwählen, wo die
einzelnen Objekte erscheinen sollen. Habe es mit Borderlayout versucht, aber dort kann ich ja auch nur North,South,West auswählen und das ist auch nicht so das wahre, ich würde gerne bestimmen wo diese einzelnen Objekte erscheinen, damit die auch einen Sinn ergeben.
{
public void actionPerformed(ActionEvent event)
{
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.add(new Label("Test Label 1: "),BorderLayout.NORTH);
panel.add(new Label("Diese Schrift soll neben Test Label 1 stehen"));
panel.add(new Label("Test Label 2"));
panel.add(new Label("Diese Schrift soll neben Test Label 2 stehen"));
panel.add(new Label("Test Label 3:"));
panel.add(new Label("Diese Schrift soll neben Test Label 3 stehen"));
panel.add(new TextArea("Das ist ein Text", 11, 35, TextArea.SCROLLBARS_NONE));
JOptionPane.showMessageDialog(null,panel,"Test",JOptionPane.INFORMATION_MESSAGE);
}
}
Die Test Label 1,2,3 sollen unter einander stehen, die dazu gehörigen Labels daneben.
Die Labels sollen außerdem über der Text Area stehen.
Vermutlich ne Kombination aus BorderLayout, FlowLayout und/oder Gridlayout.
Aber schau dir einfach mal die verlinkte Seite an, das sollte alle Fragen klären.
[quote=Unregistered]Und welches würdest du für mein Vorhaben empfehlen?[/quote]Für mich sieht das nach [JAPI]GroupLayout[/JAPI] aus, oder das gute alte JGoodies/FormLayout wäre angebracht…
Mit dem GridBagLayout bekommst du so ziemlich fast alles hin, was du möchtest. Es sieht zwar anfangs etwas kompliziert aus, aber wenn man sich da mal etwas reingearbeitet hat, ist es ziemlich einfach und mächtig. In einem Raster kannst du deine Komponenten platzieren und ausrichten.
[quote=Camino]Mit dem GridBagLayout bekommst du so ziemlich fast alles hin, was du möchtest.[/quote]Das stimmt.
Trotzdem rate ich davon ab.
Warum?
Die Elemente auf Deiner Oberfläche haben eine gewisse Struktur. Manche gehören in einem Block zusammen, andere sind davon unabhängig. Das GBL verleitet dazu, diese Struktur zu ignorieren und erschwert damit spätere Refactorings, wenn man beispielsweise einen solchen logischen Block von Komponenten in eine eigene Klasse auslagern will.
Es ist immer gut sich so früh wie möglich Gedanken über die Strukturen des Programms zu machen. Nach meiner Erfahrung ist die Aussage: “Das kann ich säter noch machen” in dem meisten Fällen falsch.
Ich habe das mal mit einem GridLayout versucht, es kommt meinem Ziel sehr nahe.
Zur Zeit sieht es so aus:
Mein Ziel sieht aber so aus:
Den Code bis jetzt sieht so aus:
{
public void actionPerformed(ActionEvent event)
{
JPanel panel = new JPanel( new GridLayout(0,2));
panel.add(new Label("Test Label 1 "));
panel.add(new Label("Die Schrift soll neben Test Label 1 stehen"));
panel.add(new Label("Test Label 2"));
panel.add(new Label("Die Schrift soll neben Test Label 2 stehen"));
panel.add(new Label("Test Label 3"));
panel.add(new Label("Die Schrift soll neben Test Label 3 stehen"));
panel.add(new TextArea("Hier soll ein Text drinne stehen.", 11, 35, TextArea.SCROLLBARS_NONE));
JOptionPane.showMessageDialog(null,panel,"Test",JOptionPane.INFORMATION_MESSAGE);
}
}```
Wie gesagt, man kann die LayoutManager auch mischen. Ich würde es in etwa so machen (in der Annahme, dass die TextArea mitwachsen soll):
public class Main
{
public static void main(String[] args)
{
JFrame frame = new JFrame("Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container contentPane = frame.getContentPane();
contentPane.setLayout(new BorderLayout());
// create the labels
JPanel headPanel = new JPanel();
headPanel.setLayout(new BoxLayout(headPanel, BoxLayout.Y_AXIS));
headPanel.add(createLabelValueRow("Test Label 1", "Die Schrift soll neben Test Label 1 stehen"));
headPanel.add(createLabelValueRow("Test Label 2", "Die Schrift soll neben Test Label 2 stehen"));
headPanel.add(createLabelValueRow("Test Label 3", "Die Schrift soll neben Test Label 3 stehen"));
// create the text area
JTextArea textArea = new JTextArea();
// create the button
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
buttonPanel.add(new JButton("Ok"));
// add components to the content pane
contentPane.add(headPanel, BorderLayout.NORTH);
contentPane.add(textArea, BorderLayout.CENTER);
contentPane.add(buttonPanel, BorderLayout.SOUTH);
frame.pack();
frame.setVisible(true);
}
private static JPanel createLabelValueRow(String label, String value)
{
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout(FlowLayout.LEFT));
JLabel l = new JLabel(label);
panel.add(l);
JLabel v = new JLabel(value);
v.setFont(v.getFont().deriveFont(Font.PLAIN));
panel.add(v);
return panel;
}
}
Statt der Kombination BoxLayout und FlowLayout kann man auch das GridBagLayout verwenden.