Posted: Mai 16th, 2014 | Filed under: Java, Programmieren, Tutorials | Tags: Java, JavaFX, JavaFX 2.0, JavaFX 8, Swing | No Comments »
Seit der aktuellen Version von JavaFX 8 ist es möglich Swing Komponenten in JavaFX Anwendungen einzubinden. Umgekehrt war es schon seit JavaFX 2.0 möglich JavaFX UI-Elemente in eine Swing Anwendung einzubinden. In diesem Beitrag möchte ich anhand einem Beispiel zeigen, wie man einen JButton in den JavaFX Scene Graph einbindet und wie man mit Hilfe des entsprechenden Events, welche vom Button ausgelöst werden, Zugriff die JavaFX Umgebung erhält.
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.SwingUtilities;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.embed.swing.SwingNode;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class SwingInJavaFX extends Application {
// JavaFX Komponenten
private StackPane stackPane = new StackPane();
private final SwingNode swingNode = new SwingNode();
@Override
public void start(Stage stage) throws Exception {
// Swing Code muss im AWT event dispatching thread ausgeführt werden. Dafür
// wird die Methode SwingUtilities.invokeLater(Runnable) verwendet.
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// Ab hier läuft der Code im AWT event dispatching thread.
// => Zugriff auf die Swing Elemente möglich!
JButton swingButton = new JButton("Toggle Color");
swingButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Um auf die JavaFX Elemente zugreifen zu können, muss man
// die Methode Platform.runLater(Runnable) nutzen, damit der
// Code wieder im JavaFX application thread ausgeführt wird.
Platform.runLater(new Runnable() {
@Override
public void run() {
// Ab hier läuft der Code im JavaFX application thread
// => Zugriff auf die JavaFX Elemente möglich!
stackPane.getChildren().add(new SwingNode());
SwingInJavaFX.this.stackPane.setStyle("-fx-background-color: #ffff00;");
}
});
}
});
// Füge den Swing Button zum JavaFX Swing Node hinzu
swingNode.setContent(swingButton);
}
});
// Füge dem StackPane den Swing Node hinzu.
stackPane.getChildren().add(swingNode);
// Richte die Stage ein.
stage.setTitle("Swing Komponenten in JavaFX 8 verwenden");
stage.setScene(new Scene(stackPane, 200, 200));
stage.show();
}
public static void main(String[] args) {
// JavaFX Anwendung starten
launch(args);
}
} |
|
Markus Mangei
Posted: Dezember 21st, 2012 | Filed under: Java, Programmieren | Tags: Beispiel, Countdown, Example, Java, Swing, Timer, Tutorial | 12 Comments »
Häufig benötigt man für Applikationen einen Zeitnehmer, oder es soll ein bestimmtes Event nach einer gewissen Zeit ausgeführt werden. Mit Hilfe der Klasse Timer aus der Swing-Bibliothek kann ein sogenannter Countdown leicht erstellt werden. Das folgende Beispiel veranschaulicht die Realisierung eines Countdowns.
Screenshot
Quellcode
import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.Timer; import javax.swing.WindowConstants; public class Countdown extends JFrame { // Countdown mit 42 Sekunden public static int counterValue = 42; public static Timer timer; public static JLabel label; public Countdown() { initGUI(); } // GUI-Erzeugen private void initGUI(){ BorderLayout thisLayout = new BorderLayout(); this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); this.getContentPane().setLayout(thisLayout); label = new JLabel(); label.setText(String.valueOf(counterValue)); this.getContentPane().add(label, BorderLayout.CENTER); this.setTitle("Countdown Example"); this.pack(); this.setVisible(true); } public static void main(String[] args) { // GUI erzeugen Countdown countdown = new Countdown(); // Timer erzeugen, jede 1000 Millisekunden (= 1 Sekunde) // Methode actionPerformed aufrufen. Countdown.timer = new Timer(1000, new ActionListener() { public void actionPerformed(ActionEvent e) { // 1 Sekunde abziehen Countdown.counterValue--; // Zahl in Label darstellen Countdown.label.setText(String.valueOf(counterValue)); // Falls Zähler = 0, Countdown abgelaufen! if(Countdown.counterValue == 0){ System.out.println("Counterdown ausgelaufen!"); // Timer stoppen Countdown.timer.stop(); } } }); // Timer starten timer.start(); } } |
In der Klasse Timer kann im Konstruktor ein Zeitwert und ein Listener übergeben werden. Die actionPerformed-Methode dieses Listeners wird, nachdem der Timer gestartet wurde, alle 1000 ms (=1 s), aufgerufen. Die Methode actionPerfomed ist also unser Taktgeber beim Abziehen einer Sekunde von der aktuellen Countdown-Zahl. Erreicht unsere Zahl den Wert 0, ist der Countdown schließlich abgelaufen.
Posted: Mai 16th, 2012 | Filed under: Allgemein, Java, Programmieren, Tutorials | Tags: ActionListener, Beispiel, Button, Example, Java, JButton, Swing, Tutorial | No Comments »
Hier ein kleines Beispiel für alle Java Swing Neulinge. Mit Hilfe eines ActionListeners könnt ihr Klicks auf einen JButton abfangen. Funktioniert natürlich auch, falls ihr die Schaltfläche mit der Tastatur auslöst (zum Beispiel bei Focus mit Hilfe der Leertaste).
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class JButtonExample implements ActionListener{
private JButton button;
public JButtonExample() {
// Fenster anlegen
JFrame frame = new JFrame();
frame.setTitle("JButton Example");
frame.setLayout(new BorderLayout());
// Button anlegen
this.button = new JButton("OK");
// Eventhandler für Button zuweisen
this.button.addActionListener(this);
// Button der Frame hinzufügen
frame.add(this.button);
// Fenster zentrieren
frame.setSize(350,150);
frame.setLocationRelativeTo(null);
// Fenster sichbar machen
frame.setVisible(true);
}
public static void main(String[] args) {
new JButtonExample();
}
@Override
public void actionPerformed(ActionEvent e) {
if(button == e.getSource()){
System.out.println("Button wurde geklickt!");
}
}
} |
Ich hoffe ich konnte dem ein oder anderen mit diesem Tutorial helfen =)
Posted: November 17th, 2011 | Filed under: Java, Programmieren | Tags: Effekt, Hover, ImageIcon, Java, JButton, JButtonHoverable, MouseOver, Swing | No Comments »
Öfters verwende ich in meinen Programmen einen Button der sein Icon ändert sobald man mit der Maus über diesen fährt. Also ein JButton mit Hover-Effekt. Die folgende Klasse implementiert diese Funktionalität von Haus aus. Beim Konstruktoraufruf können zwei ImageIcons übergeben werden.
Hier die Klasse JButtonHoverable.java:
package de.roth.jsona.view.button;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.ImageIcon;
import javax.swing.JButton;
public class JButtonHoverable extends JButton{
private ImageIcon imageIconHovered;
private ImageIcon imageIcon;
private boolean hoverable;
public JButtonHoverable(ImageIcon imageIcon, ImageIcon imageIconHovered, String text){
super(imageIcon);
this.hoverable = true;
this.imageIconHovered = imageIconHovered;
this.imageIcon = imageIcon;
this.setText(text);
this.addHoverMouseListener();
}
public JButtonHoverable(ImageIcon imageIcon, ImageIcon imageIconHovered){
super(imageIcon);
this.hoverable = true;
this.imageIconHovered = imageIconHovered;
this.imageIcon = imageIcon;
this.addHoverMouseListener();
}
public ImageIcon getImageIconHovered() {
return imageIconHovered;
}
public ImageIcon getImageIcon() {
return imageIcon;
}
public void setHoverable(boolean hoverable){
this.hoverable = hoverable;
}
private void addHoverMouseListener(){
this.
addMouseListener(new MouseAdapter(){
public void mouseEntered(MouseEvent e) {
if(hoverable){
JButtonHoverable button = ((JButtonHoverable)e.getSource());
button.setIcon(button.getImageIconHovered());
}
}
public void mouseExited(MouseEvent e) {
JButtonHoverable button = ((JButtonHoverable)e.getSource());
button.setIcon(button.getImageIcon());
}
});
}
}
|
Und so wird die Klasse verwendet:
JButtonHoverable buttonHoverable = new JButtonHoverable(new ImageIcon(
getClass().getClassLoader().getResource(
"de/roth/icon/blau.png")), new ImageIcon(
getClass().getClassLoader().getResource(
"de/roth/icon/rot.png"))); |