|
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);
|