Gastbeitrag: Swing Komponenten in JavaFX 8 verwenden

Posted: Mai 16th, 2014 | Filed under: Java, Programmieren, Tutorials | Tags: , , , , | 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 stagethrows 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, 200200));
    stage.show();
  }
  
    public static void main(String[] args) {
       // JavaFX Anwendung starten
        launch(args);
    }
}

Markus Mangei


Java: Countdown und Timer (am Beispiel von Swing)

Posted: Dezember 21st, 2012 | Filed under: Java, Programmieren | Tags: , , , , , , | 6 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

image

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.


Java JButton und ActionListener

Posted: Mai 16th, 2012 | Filed under: Allgemein, Java, Programmieren, Tutorials | Tags: , , , , , , , | 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 =)


Java JButton mit Hover-Effekt

Posted: November 17th, 2011 | Filed under: Java, Programmieren | Tags: , , , , , , , | 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")));