JavaFX

 
→ HOME
→JavaFX
 
 
 
 

 JavaFX手掛り集

更新:09年01月28日

作成:09年01月09日

 

目次

Spinner部品を作る:javax.swing.JSpinnerを使う

Table部品を作る:javax.swing.JTableを使う

音を鳴らす:java.applet.AudioClipを使う

通報窓(message window)を表示する:javax.swing.JOptionPaneを使う

 

 

 

Spinner部品を作る:javax.swing.JSpinnerを使う

 

javax.swing.JSpinnerを使って、Integer型のSpinner部品を作ります。

JavaのSwing部品を基にGUI部品を作成するときは、javafx.ext.swing.SwingComponentを継承して、クラスを定義します。関数createJComponent()でGUI部品(JComponent)を生成します。

 

JavaFX版数:JavaFX 1.0

 

 

コード例:

 

import java.awt.Dimension;

import javafx.ext.swing.SwingComponent;

import javafx.ext.swing.SwingSlider;

import javafx.scene.Scene;

import javafx.stage.Stage;

import javax.swing.event.ChangeEvent;

import javax.swing.event.ChangeListener;

import javax.swing.JComponent;

import javax.swing.JSpinner;

import javax.swing.SpinnerNumberModel;

 

Stage {

  var slider = SwingSlider {

    minimum: 0

    maximum: 59

    value: 3

    vertical: false

    translateX: 25

    translateY: 50

    width: 150

  }

  title: "Spinner Component"

  scene: Scene {

    width: 200

    height: 100

    content: [

      IntSpinner {

        minimum: 0

        maximum: 59

        value: bind slider.value with inverse

        translateX: 75

        translateY: 10

      },

      slider

    ]

  }

}

 

class IntSpinner extends SwingComponent {

  var spinner: JSpinner;

  var model: SpinnerNumberModel;

  public var minimum: Integer = 0 on replace {

    model.setMinimum(minimum);

  };

  public var maximum: Integer = 10 on replace {

    model.setMaximum(maximum);

  };

  public var value: Integer = 3 on replace {

    spinner.setValue(value);

  };

  public var stepSize: Integer = 1 on replace {

    model.setStepSize(stepSize);

  };

  public override var width = 50;

  public override var height = 25;

  public override function createJComponent(): JComponent {

    model = new SpinnerNumberModel();

    spinner = new JSpinner(model);

    spinner.setPreferredSize(new Dimension(width, height));

    spinner.addChangeListener(ChangeListener {

      public override function stateChanged(e: ChangeEvent) {

        value = spinner.getValue() as Integer;

      }

    });

    return spinner;

  }

}

 

 

 

 

Table部品を作る:javax.swing.JTableを使う

 

「Planet JFX Wiki」に、javax.swing.JTableを使ったTable部品の見本が載っています。

それにちょっと手を加えて、表を作成する際に列幅を指定できるようにしてみました。列幅を指定しないと、既定値の列幅で作成されます。

 

JavaFX版数:JavaFX 1.0

 

列幅を指定した場合:

 

列幅を指定しない場合:

 

コード例:

 

package components;

 

import javafx.ext.swing.SwingButton;

import javafx.ext.swing.SwingComponent;

import javafx.scene.CustomNode;

import javafx.scene.Group;

import javafx.scene.Scene;

import javafx.stage.Stage;

import javax.swing.event.ListSelectionEvent;

import javax.swing.event.ListSelectionListener;

import javax.swing.JScrollPane;

import javax.swing.JTable;

import javax.swing.table.DefaultTableModel;

import javax.swing.table.TableColumn;

import javax.swing.table.DefaultTableColumnModel;

 

class Contact {

  var firstName: String;

  var lastName: String;

  var eMailAddress: String;

}

 

class ContactEditor extends CustomNode {

  public var contacts: Contact[];

  public var selection: Integer;

  public override function create() {

    Group{

      content: [

        Table {

          width: 410

          height: 150

          columns: [

            ColumnName {text: "First Name"},

            ColumnName {text: "Last Name"},

            ColumnName {text: "EMailAddress"}

          ]

          columnWidth: [100, 100, 200]

          rows: bind for(person in contacts) TableRow {

            cells: [

              TableCell {text:bind person.firstName},

              TableCell {text:bind person.lastName},

              TableCell {text:bind person.eMailAddress}

            ]

          }

          selectedRow: bind selection with inverse

        },

        SwingButton {

          translateY: 150

          text: "Add Contact"

          action: function() {

            insert Contact{} into contacts;

          }

        },

        SwingButton {

          translateX: 200

          translateY: 150

          text: "Remove Contact"

          action: function() {

            delete contacts[selection];

          }

        }

      ]

    }

  }

}

 

var contacts = [

  Contact {

    firstName: "Mike"

    lastName: "Wazowski"

    eMailAddress: "Mike.Wazowski@monster.com"

  },

  Contact {

    firstName: "Sulley"

    lastName: "Monster"

    eMailAddress: "Sulley.Monster@monster.com"

  }

];

 

Stage {

  title: "Column Width Assignable Table"

  scene: Scene {

    width: 410

    height: 200

    content: ContactEditor{

      contacts: bind contacts with inverse

    }

  }

}

 

class ColumnName {

  public var text: String;

}

 

class TableCell {

  public var text: String;

}

 

class TableRow {

  public var cells: TableCell[];

}

 

class Table extends SwingComponent {

  var table: JTable;

  var model: DefaultTableModel;

  public var selectedRow: Integer;

  public var columnWidth: Integer[];

  public var columns: ColumnName[] on replace {

    model = new DefaultTableModel(

        for(column in columns) column.text, 0);

    table.setModel(model);

    if ((sizeof columns) == (sizeof columnWidth)) {

      table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

      var columnModel: DefaultTableColumnModel

          = table.getColumnModel() as DefaultTableColumnModel;

      var col: TableColumn;

      for (i in [0..(sizeof columns - 1)]) {

        col = columnModel.getColumn(i);

        col.setPreferredWidth(columnWidth[i]);

      }

    }

  }

  public var rows: TableRow[] on replace oldVal[lo..hi] = newVals {

    for (index in [hi..lo step -1]) {

      model.removeRow(index);

    }

    for (row in newVals) {

      model.addRow(for(cell in row.cells) cell.text);

    }

  };

  public override function createJComponent() {

    table = new JTable();

    model = table.getModel() as DefaultTableModel;

    var selectionModel = table.getSelectionModel();

    selectionModel.addListSelectionListener(ListSelectionListener {

      public override function valueChanged(e: ListSelectionEvent) {

        selectedRow = table.getSelectedRow();

      }

    });

    return new JScrollPane(table);

  }

}

 

 

 

 

音を鳴らす:java.applet.AudioClipを使う

 

JavaFXのAPIではなく、java.applet.AudioClipを使って、音を鳴らす方法です。

音源ファイルは、「.wav」または「.au」形式のものが使用できます。コード例では、原始コードを格納するディレクトリに子ディレクトリaudioを作り、その下に音源となるファイルを格納する構成にしています。

単発で鳴らすときは、AudioClip.play()関数を呼び出します。同じ音を繰り返すときは、AudioClip.loop()関数を呼び出し、それを止めるときは、AudioClip.stop()関数を呼び出します。

単発で鳴らすplay()関数を連続して呼び出すときは、間を置かないと次の音が鳴らないことがあります。

 

 

コード例:

 

import java.applet.Applet;

import java.applet.AudioClip;

import java.net.URL;

import javafx.ext.swing.SwingButton;

import javafx.scene.layout.VBox;

import javafx.scene.Scene;

import javafx.stage.Stage;

 

Stage {

//  var url: URL = new URL("{__DIR__}audio/se10.wav");

  var url: URL = new URL("{__DIR__}audio/drip.au");

  var audioClip: AudioClip = Applet.newAudioClip(url);

  title: "Sound Effect"

  scene: Scene {

    width: 200

    height: 200

    content: [

      VBox{

        translateX: 75, translateY: 20

        spacing: 30

        content: [

          SwingButton {

            text: "Play"

            action: function() {

              audioClip.play();

            }

          },

          SwingButton {

            text: "Loop"

            action: function() {

              audioClip.loop();

            }

          },

          SwingButton {

            text: "Stop"

            action: function() {

              audioClip.stop();

            }

          }

        ]

      }

    ]

  }

}

 

 

 

 

通報窓(message window)を表示する:javax.swing.JOptionPaneを使う

 

JavaFXのAPIではなく、javax.swing.JOptionPaneを使って、通報窓を表示する方法です。

 

 

コード例:

 

import javax.swing.JOptionPane;

  ...

  JOptionPane.showMessageDialog(null, "通報文", "表題",

      JOptionPane.WARNING_MESSAGE);

 

 

 

 

Yahoo!ジオシティーズ