トップ 一覧 置換 検索 ヘルプ RSS ログイン

SwingXの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
JavaFX2.0 はSwing のように扱えるようになった。
また、JDK1.8 からはSwing同様に標準のコンポーネントとして使えるようなる。
Swingコンポーネントの強化版
http://java.net/downloads/swingx/releases/
http://itpro.nikkeibp.co.jp/article/COLUMN/20110111/355957/

!!!環境
*JavaFX SDKをダウンロードしてきて解凍。
*bin ディレクトリにパスを通す

!!!サンプル
!サンプル
{{code Java,
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.lang.reflect.InvocationTargetException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

import javafx.application.Application;
import javafx.embed.swing.JFXPanel;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;
import org.jdesktop.swingx.*;
import org.jdesktop.swingx.painter.Painter;
import org.jdesktop.swingx.painter.BusyPainter;
import org.jdesktop.swingx.painter.MattePainter;
import java.awt.geom.Ellipse2D;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

/**
* SwingとJavaFXの連携デモ
*
* SwingにJavaFXのシーングラフを貼る
*/
public class SwingJavaFXDemo extends Application {
    // シーングラフを貼るSwingコンポーネント
    private JFXPanel jfxPanel;

    // initSwingメソッドはSwingのスレッドで処理する
    public void initSwing() {
        JFrame frame = new JFrame("Swing-JavaFX Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 120);
        frame.setLayout(new GridLayout(2, 0));

        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(280, 60));
        panel.setLayout(new FlowLayout(FlowLayout.CENTER));
        JLabel label = new JLabel("Swing: Label");
        JTextField textField = new JTextField("Text Box");
        JButton button = new JButton("Button");
        panel.add(label);
        panel.add(textField);
        panel.add(button);
        frame.add(panel);

        // シーングラフを貼るコンポーネントを生成
        jfxPanel = new JFXPanel();
        jfxPanel.setPreferredSize(new Dimension(280, 60));
        frame.add(jfxPanel);

        frame.setVisible(true);
    }

    // startメソッドはJavaFXのスレッドで処理する
    @Override
    public void start(Stage stage) {
        try {
            // Swingのスレッドで処理する
            SwingUtilities.invokeAndWait(new Runnable() {
                public void run() {
                    initSwing();
                }
            });
        } catch (InvocationTargetException ex) {
            return;
        } catch (InterruptedException ex) {
            return;
public class BusyLabelSample3 {
  private JXBusyLabel label;
  private JXPanel glass;
  private Timer timer;
  
  public BusyLabelSample3() {
    JFrame frame = new JFrame("Busy Label Sample");
    frame.setSize(200, 120);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(new FlowLayout());
    
    initBusyLabel(frame);
    
    JButton button = new JButton("Start");
    button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {
          startProcess();
        }

        FlowPane container = new FlowPane(10, 10);
        container.setAlignment(Pos.CENTER);
        Scene scene = new Scene(container);

        Label label = new Label("JavaFX: Label");
        TextField TextField = new TextField("Text Box");
        Button button = new Button("Button");
        container.getChildren().addAll(label, TextField, button);

        // Swingにシーングラフを貼る
        jfxPanel.setScene(scene);
    }

    public static void main(String[] args) {
        // JavaFXのスレッドを起動
        Application.launch(SwingJavaFXDemo.class, null);
    }
    });
    frame.add(button);
    
    frame.setVisible(true);
  }
  
  private void initBusyLabel(JFrame frame) {
    // グラスペインに使用するパネル
    glass = new JXPanel();
    glass.setOpaque(false);
    
    // 背景色を半透明にする
    Painter mattePainter 
    = new MattePainter(new Color(1.0f, 1.0f, 1.0f, 0.7f));
    glass.setBackgroundPainter(mattePainter);
    
    // マウスイベントをブロックする
    glass.addMouseListener(new MouseAdapter(){});
    
    // ビジーラベル
    label = new JXBusyLabel(new Dimension(50, 50));
    BusyPainter painter 
    = new BusyPainter(new Ellipse2D.Float(0.0f, 0.0f, 10.0f, 10.0f),
      new Ellipse2D.Float(6.0f, 6.0f, 38.0f, 38.0f));
    painter.setTrailLength(8);
    painter.setPoints(8);
    painter.setBaseColor(new Color(0x00, 0x00, 0x00, 0x00));
    painter.setHighlightColor(new Color(0x66, 0xCC, 0xFF, 0xFF));
    label.setBusyPainter(painter);
    
    // グラスペインにビジーラベルを貼る
    glass.add(label);
    
    // グラスペインをフレームに設定
    frame.setGlassPane(glass);
    
    // レイアウト
    GridBagLayout layout = new GridBagLayout();
    GridBagConstraints c = new GridBagConstraints();
    glass.setLayout(layout);
    
    c.fill = GridBagConstraints.BOTH;
    c.gridwidth = GridBagConstraints.REMAINDER;
    layout.setConstraints(label, c);
  }
  
  
  private void startProcess() {
    // グラスペインを表示
    glass.setVisible(true);
    // ラベルのアニメーションを開始する
    label.setBusy(true);
    
    // 5 秒後、グラスペインを非表示にする
    ActionListener task = new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        label.setBusy(false);
        glass.setVisible(false);
        
        timer.stop();
      }
    };
    timer = new Timer(5000, task);
    timer.start();
  }
  
  
  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
          new BusyLabelSample3();
        }
    });
  }
}
}}

{{category2 プログラミング言語,JavaFX}}
{{category2 プログラミング言語,Java}}