まー、書くほどのことでもないんだが、単純にメニューバーがあるJavaFXのアプリをmacOSで動かすとこんな感じになる。
Macだと、こうなってほしいんだが。
これは、MenuBarのsetUseSystemMenuBar(true)を呼べばいい感じになるw
-->
まー、書くほどのことでもないんだが、単純にメニューバーがあるJavaFXのアプリをmacOSで動かすとこんな感じになる。
Macだと、こうなってほしいんだが。
これは、MenuBarのsetUseSystemMenuBar(true)を呼べばいい感じになるw
感じで、HBoxにButton1とButton2を入れてある状態。こんなで、Button1を非表示(setVisible(false)をする)にすると、こんな感じになる。
こんな場合、Button2は左によってほしいんだけど・・・
で、Button1をsetManaged(false)するとめでたく左による。
(追記)
ちょっと、書き方が不十分なようなきがしたので追記だ。
setManage(false)のところでsetVisible(false)も行わないといけない。
↓こんな感じのTwitterのタイムラインみたいなリストを作ってみる。
まず、このデータのクラスを作る。
public class Article {
private String user; // ユーザ名
private String comment; // コメント
private Image image; // アイコン
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
public Image getImage() {
return image;
}
public void setImage(Image image) {
this.image = image;
}
public Article(Image image, String user, String comment) {
this.user = user;
this.comment = comment;
this.image = image;
}
}
セルを作るクラスを作る。コンストラクタでコントロールやコンテナを作成して、updateItem()で値だけをできるだで更新する。図のようにHBoxにImageViewとVBoxを追加して、VBoxにはユーザ名用のTextとコメント用のTextを追加する。
public class ArticleCell extends ListCell<Article> {
private final HBox hbox;
private final ImageView imageView;
private final VBox vbox;
private final Text user;
private final Text comment;
public ArticleCell() {
hbox = new HBox(5);
imageView = new ImageView();
imageView.setFitWidth(64);
imageView.setFitHeight(64);
vbox = new VBox(5);
user = new Text();
user.setFont(new Font("System Bold", 18));
comment = new Text();
VBox.setVgrow(user, Priority.NEVER);
VBox.setVgrow(comment, Priority.ALWAYS);
HBox.setHgrow(imageView, Priority.NEVER);
HBox.setHgrow(vbox, Priority.ALWAYS);
vbox.getChildren().addAll(user, comment);
hbox.getChildren().addAll(imageView, vbox);
// ユーザ名、コメントをVBoxの幅-5になるようにバインドしとく
user.wrappingWidthProperty().bind(vbox.widthProperty().subtract(5));
comment.wrappingWidthProperty().bind(vbox.widthProperty().subtract(5));
}
@Override
protected void updateItem(Article item, boolean empty) {
super.updateItem(item, empty);
if(empty) {
setText(null);
setGraphic(null);
} else {
imageView.setImage(item.getImage());
user.setText(item.getUser());
comment.setText(item.getComment());
setGraphic(hbox);
}
}
}
カスタムセルを作るようにFXMLDocumentControllerのinitializeで
listView.setCellFactory(param -> new ArticleCell());
をしておく。
ソースおいておく。
Java8では、関数型言語の機能をいろいろ取り入れているようなので試してみた。正直、関数型プログラミングは初心者なので間違っているかもしれないのでこれから書いている内容は鵜呑みにしないようにw
他の投稿が大丈夫かと言うと思い込みで間違っているかもしれないので疑ってかかるようにw
お題は、1から10まで足してみる。
続きを読む別のブログで公開してたものです。
一部をこっちのブログに移行しようと手動で(^^;)移行したものです。
JavaでPSGぽい音を出すサンプルです。タイトルでJava8って書いてるけど、古いのでもいけると思います。(どのバージョンから出来るのかは確認してない)
package jp.hemohemo.testaudio;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
public class TestAudio {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
int SAMPLING_RATE = 44100; // 44.1kHz(CDと同じ)
// オーディオフォーマットを準備
AudioFormat format = new AudioFormat(
SAMPLING_RATE, // サンプリング周波数
16, // 16ビット
2, // ステレオ
true, // 符号
true // ビッグエンディアン
);
DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
SourceDataLine line;
try {
// データラインを取得
line = (SourceDataLine)AudioSystem.getLine(info);
// ラインを開く
line.open();
} catch (LineUnavailableException ex) {
Logger.getLogger(TestAudio.class.getName()).log(Level.SEVERE, null, ex);
return;
}
// 1秒間の波形データを準備
int freq = 440; // ラ(A)の周波数(440Hz)
int vol = 2000; // 音量
byte[] datas = new byte[SAMPLING_RATE * 2 * 2]; // ステレオ、16ビットなので * 2 * 2なる
int val;
for(int i = 0; i < SAMPLING_RATE; i++) {
int tmp = (int)(2 * i * freq / SAMPLING_RATE);
if(tmp % 2 == 0) {
val = vol;
} else {
val = -vol;
}
// 左チャンネル
datas[i * 2 * 2 + 0] = (byte)((val >> 8) & 0xff);
datas[i * 2 * 2 + 1] = (byte)(val & 0xff);
// 右チャンネル
datas[i * 2 * 2 + 2] = (byte)((val >> 8) & 0xff);
datas[i * 2 * 2 + 3] = (byte)(val & 0xff);
}
line.start();
// 波形データを書き込む
line.write(datas, 0, datas.length);
// 鳴り終わるのを待つ
line.drain();
line.stop();
line.close();
}
}
まっ、見ればわかると思いますが、最初のほうでCDと同等の音質でデータラインを取得して、そこに440Hzの矩形波のデータを用意して書き込んでる。このfreqの値を変えると音程が変更でき、volを変更すると音量が変わる。
和音の出し方は別の音程の波形データを加算するだけでOK。ただし、オーバーフローしないようにしないといけない。