Swing: Unterschied zwischen den Versionen
(9 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 9: | Zeile 9: | ||
Deswegen werden hier nur wenige wesentliche Elemente von Swing benannt. | Deswegen werden hier nur wenige wesentliche Elemente von Swing benannt. | ||
Swing | '''Swing sollte man AUF JEDEN FALL mit einem geeigneten Plugin entwickeln, z.B. dem [http://download.eclipse.org/windowbuilder/WB/integration/4.4/ '''WindowBuilder'''] für Eclipse.'''<br/> | ||
Damit hat man dann eine grafische Entwicklungsoberfläche, in der man die Swing-Elemente "zusammenklicken" kann. | |||
=Container= | =Container= | ||
Zeile 57: | Zeile 58: | ||
* Das <code>JFrame</code>-Objekt enthält als Attribut ein Objekt, das von <code>JPanel</code> <u>erbt</u>. | * Das <code>JFrame</code>-Objekt enthält als Attribut ein Objekt, das von <code>JPanel</code> <u>erbt</u>. | ||
* Dieses Objekt wird dem <code>JFrame</code> hinzugefügt. | * Dieses Objekt wird dem <code>JFrame</code> hinzugefügt. | ||
** WICHTIG: dafür muss <u>'''<code>this.getContentPane().add(...)</code>'''</u> aufgerufen werden!!! | |||
'''Beispiel:''' | '''Beispiel:''' | ||
<code> | <code> | ||
import javax.swing.JFrame; | import javax.swing.JFrame; | ||
Zeile 79: | Zeile 81: | ||
public static void main(String[] args) { | public static void main(String[] args) { | ||
MainFrame sf = new MainFrame(); | |||
} | } | ||
} | } | ||
</code> | </code> | ||
''Die Klasse <code>SimplePanel</code> ist hier nur für Demo-Zwecke aufgeführt. '' | ''Die Klasse <code>SimplePanel</code> ist hier nur für Demo-Zwecke aufgeführt. '' | ||
<code> | <code> | ||
import java.awt.BorderLayout; | import java.awt.BorderLayout; | ||
Zeile 100: | Zeile 102: | ||
} | } | ||
} | } | ||
</code> | </code> | ||
=Events und Listener= | =Events und Listener= | ||
Zeile 115: | Zeile 117: | ||
Beispiel: | Beispiel: | ||
<code> | <code> | ||
import java.awt.event.ActionEvent; | import java.awt.event.ActionEvent; | ||
import java.awt.event.ActionListener; | import java.awt.event.ActionListener; | ||
Zeile 145: | Zeile 147: | ||
} | } | ||
private void vergroessern(){ | // diese Methode soll ausgefuehrt werden, wenn der Button geklickt wird. | ||
'''<u>private void vergroessern(){</u>''' | |||
this.setSize(this.getWidth()+10, this.getHeight()+10); | this.setSize(this.getWidth()+10, this.getHeight()+10); | ||
} | } | ||
Zeile 153: | Zeile 156: | ||
} | } | ||
} | } | ||
</code> | </code> | ||
=JOptionPane= | =JOptionPane= | ||
Zeile 166: | Zeile 169: | ||
** <code>JOptionPane.CANCEL_OPTION</code> | ** <code>JOptionPane.CANCEL_OPTION</code> | ||
** Die Rückgaben überprüft man z.B. so: | ** Die Rückgaben überprüft man z.B. so: | ||
<code> | <code> | ||
int gewaehlt = JOptionPane.showConfirmDialog(null, "Nochmal?"); | int gewaehlt = JOptionPane.showConfirmDialog(null, "Nochmal?"); | ||
if(gewaehlt == JOptionPane.YES_OPTION) | if(gewaehlt == JOptionPane.YES_OPTION) | ||
Zeile 174: | Zeile 177: | ||
else | else | ||
{...} | {...} | ||
</code> | </code> |
Aktuelle Version vom 23. Januar 2022, 18:19 Uhr
Swing ist eine Java-Bibliothek, mit der man Benutzeroberflächen bauen kann.
Es lohnt sich nicht mehr zu tief in Swing einzusteigen, weil es ab Java 1.8 die neue Bibliothek JavaFX gibt, die mehr Funktionalität hat (z.B. Integration von Stylesheets) und sich u.a. auch für die Entwicklung von Benutzeroberflächen für Apps eignet.
Allerdings ist Swing immer noch geeignet, wenn man mal "ganz schnell" eine grafische Oberfläche für ein Programm braucht!
Deswegen werden hier nur wenige wesentliche Elemente von Swing benannt.
Swing sollte man AUF JEDEN FALL mit einem geeigneten Plugin entwickeln, z.B. dem WindowBuilder für Eclipse.
Damit hat man dann eine grafische Entwicklungsoberfläche, in der man die Swing-Elemente "zusammenklicken" kann.
Container
In Container kann man andere Oberflächenelemente reinpacken. Sie brauchen deswegen ein definiertes Layout.
Man kann auch Container in andere Container packen (Ausnahme: JFrame).
JFrame
: Ein Fenster, das oben eine blaue Leiste hat für die Überschrift und das man schließen kann. EinenJFrame
braucht man immer, weil JFrames selbstständig auf dem Bildschirm erscheinen können; alle anderen Elemente müssen in einenJFrame
reingepackt werden.JPanel
: Ein Container, der eigentlich unsichtbar ist;JPanel
dienen dazu, andere Elemente zusammenzufassen.JScrollPane
: Ein Container, der Scrollbars bereitstellt, wenn der Inhalt zu groß ist, um ihn ganz im Container darzustellen.
wichtige Methoden
add(...)
: fügt ein Element hinzu.remove(...)
: entfernt ein Element.removeAll()
: entfernt alle Elemente.setSize(int width, int height)
revalidate()
: wenn man dem Container ein neues Element hinzugefügt hat, dann muss man diese Methode aufrufen, damit der Container seine Größe anpasst. Am besten ruft man direkt danachrepaint()
(s.u.) auf.repaint()
: sorgt dafür, dass der Container neu gezeichnet wird.setVisible(boolean pVisible)
setLayout(...)
; z.B.setLayout(new BorderLayout());
- für JFrame:
getContentPane()
: gibt den eigentlichen Inhalt desJFrame
zurück. - für JFrame:
setContentPane(...)
: Platziert ein Element imJFrame
. Vorsicht:add(...)
funktioniert fürJFrame
nicht! (Das ist nicht grade intuitiv, ist aber leider so.)
Layout
Jeder Container braucht ein Layout, in dem festgelegt wird, wie die Elemente im Container angeordnet werden.
BorderLayout
: DasBorderLayout
legt fünf Regionen fest:BorderLayout.CENTER
,BorderLayout.NORTH
,BorderLayout.SOUTH
,BorderLayout.WEST
,BorderLayout.EAST
. In jeder der fünf Regionen kann nur ein Element platziert werden; das kann aber auch einJPanel
oder ein andere Container sein.AbsoluteLayout
: Dieses Layout ermöglicht es einem, die Elemente an Positionen zu platzieren, die man durch Koordinaten angibt (bzw. mit dem WindowBuilder zieht man die Komponenten an die passende Stelle.) Das ist praktisch, wenn man sicher weiß, dass die Elemente eine feste Größe haben.BoxLayout
:BoxLayout
ermöglicht, mehrere Elemente nebeneinander (X_AXIS
) oder untereinander (Y_AXIS
) zu platzieren.
Components
JLabel
: einzeilige Schrift; nicht editierbar.JTextField
: einzeiliges Textfeld; editierbar.JTextArea
: mehrzeiliges Textfeld; editierbar. Um Text in mehreren Zeilen anzuzeigen, muss man als Zeilenumbruch "\n" einbauen.JButton
: ein Button. Um das Klicken abzufangen, muss an den Button einActionListener
angehängt werden; das macht man am besten mit dem WindowBuilder.JCheckbox
undJRadioButton
: wichtig, um von vielen Möglichkeiten mehrere auszuwählen. Bei derJCheckbox
kann man in der Regel mehrere anklicken; denJRadioButton
benutzt man, wenn man von vielen Möglichkeiten nur eine wählen darf. Dafür müssen dieJRadioButtons
zu einerButtonGroup
hinzugefügt werden.
wichtige Methoden
setText(String pText)
getText()
isSelected()
nur für JCheckbox und JRadioButton
Eine Benutzeroberfläche sichtbar machen
"Selbstständig lebensfähig" ist von den genannten Klassen nur die Klasse JFrame
.
D.h. wenn man eine Oberfläche sichtbar machen will, dann muss man am besten alles in einen JFrame
packen.
Dafür bietet sich folgendes Verfahren an:
- Das
JFrame
-Objekt enthält als Attribut ein Objekt, das vonJPanel
erbt. - Dieses Objekt wird dem
JFrame
hinzugefügt.- WICHTIG: dafür muss
this.getContentPane().add(...)
aufgerufen werden!!!
- WICHTIG: dafür muss
Beispiel:
import javax.swing.JFrame;
public class MainFrame extends JFrame{
private SimplePanel simplePanel;
public MainFrame() {
//simplePanel erzeugen
simplePanel = new SimplePanel();
//simplePanel hinzufuegen
this.getContentPane().add(simplePanel);
// mit pack kann man die Groesse des JFrame auf das notwendige Mass bringen
this.pack();
// sichtbar machen.
this.setVisible(true);
}
public static void main(String[] args) {
MainFrame sf = new MainFrame();
}
}
Die Klasse SimplePanel
ist hier nur für Demo-Zwecke aufgeführt.
import java.awt.BorderLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class SimplePanel extends JPanel {
private JLabel dasLabel;
public SimplePanel(){
this.setLayout(new BorderLayout());
dasLabel = new JLabel("test: dasLabel");
this.add(dasLabel, BorderLayout.CENTER);
}
}
Events und Listener
Events werden ausgelöst, wenn in der grafischen Oberfläche eine Eingabe o.ä. passiert. Das "klassische" Event ist das Klicken eines JButton
.
Um auf ein Event zu reagieren, muss man an die entsprechende Komponente (z.B. den JButton
) einen Listener
hinzugefügt; dieser "hört zu", ob ein Event ausgelöst wird.
Standard-Beispiel für einen JButton
:
- Hier wird ein
ActionListener
hinzugefügt; - dieser hat die Methode
public void actionPerformed(ActionEvent e)
. - diese Methode wird aufgerufen, wenn der
JButton
geklickt wird. - D.h. in die Methode
public void actionPerformed(ActionEvent e)
schreibt man rein, was passieren soll, wenn derJButton
geklickt wird!
Beispiel:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class ButtonFrame extends JFrame{
JButton derButton;
public ButtonFrame() {
derButton = new JButton("groesser machen");
// dem JButton einen ActionListener hinzufuegen
// (der ActionListener ist in diesem Fall anonym)
derButton.addActionListener(new ActionListener(){
// diese Methode wird aufgerufen, wenn ein ActionEvent fuer den Button ausgeloest wurde.
public void actionPerformed(ActionEvent e) {
// hier jetzt die Methode aufrufen, die dann ausgefuehrt werden soll.
vergroessern();
}
});
this.getContentPane().add(derButton);
this.pack();
this.setVisible(true);
}
// diese Methode soll ausgefuehrt werden, wenn der Button geklickt wird.
private void vergroessern(){
this.setSize(this.getWidth()+10, this.getHeight()+10);
}
public static void main(String[] args) {
ButtonFrame bf = new ButtonFrame();
}
}
JOptionPane
JOptionPane
dient dazu, kleine Fenster aufzumachen, z.B. um eine Bestätigung oder Eingabe vom Nutzer abzufragen. Die Abarbeitung der aufrufenden Methode wartet so lange, bis der Nutzer das Fenster durch OK oder Abbrechen zugemacht hat.
wichtige Methoden
JOptionPane.showInputDialog(String pFrage)
: Fragt eine Texteingabe vom Nutzer ab. Gibt einenString
zurück.JOptionPane.showMessageDialog(Component parentComponent, String pMessage)
: Informiert den Nutzer über irgendetwas.parentComponent
kannnull
sein. Gibtvoid
zurück.JOptionPane.showConfirmDialog(Component parentComponent, String pFrage)
: Fragt nach einer Bestätigung (Ja, Nein, Abbrechen).parentComponent
kannnull
sein. Gibtint
zurück. Die möglichen Rückgaben sind:JOptionPane.YES_OPTION
JOptionPane.NO_OPTION
JOptionPane.CANCEL_OPTION
- Die Rückgaben überprüft man z.B. so:
int gewaehlt = JOptionPane.showConfirmDialog(null, "Nochmal?");
if(gewaehlt == JOptionPane.YES_OPTION)
{...}
else if (gewaehlt == JOptionPane.NO_OPTION)
{...}
else
{...}