2018年8月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
ブログ:ココログ
時間のないサイト運営者リング
時間のないサイト運営者リング

Javaプログラミング

2014.09.17

[Java8] PSGぽい音を出す。

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。ただし、オーバーフローしないようにしないといけない。

2014.09.13

NetBeansで日本語を入力すると落ちる - Така блог

リンク: NetBeansで日本語を入力すると落ちる - Така блог.

JDKを古いのにするのか。

2014.08.16

[Java8] JavaFX、マルチタッチ

Scene Builderをながめてると、マルチタッチに対応してそうなので試してみた。

サンプル:TestMultiTouch.zip

基本、"On Touch Moved"、"On Touch Pressed"、"On Touch Released"、"On Touch Stationary"の処理を実装すれば取れる。
あと、"On Touch Stationary"はリファレンスによるとタップアンドホールみたいなのを取れるみたいな感じで書かれているが実際取ってみたけど、いまいちよくわからない(^^;)
これが基本でジェスチャーのイベントも取れるようになっている"On Swipe *"がスワイプ、"On Zoom"が指二本で広げたり閉じたりするジェスチャ、"On Rotate"が指二本で回すようなジェスチャが取れる。

このサンプルは、マルチタッチ対応のタッチパネル付きのWindows8.1 PCで試した。 ズームと回転はMac+Magic Trackpadで取れるのを確認した。

2014.08.06

[Java8] JavaFX、ファイルのドラッグ&ドロップ

Controllerクラスに次のコードを追加してScene BuilderでAnchorPane(他のコントロールでもいい)の"On Drag Over"と"On  Drag Dropped"にそれぞれhandleDragOverとhandleDroppedを 割り当てる とFinderや エクスプローラーからファイルをドラッグアンドドロップで受け取ることができるようになる。ほかにもドラッグ&ドロップ関係のイベントがあるみたいだけど、これだけでファイルはとりあえず受け取れるようだ。(ほかのイベントはまだ調べていない(^^;))

    @FXML
    private void handleDragOver(DragEvent event) {
        // ドラッグボードを取得
        Dragboard board = event.getDragboard();
        if(board.hasFiles()) {  // ドラッグされているのがファイルなら
            // コピーモードを設定(これでマウスカーソルが矢印に+のやつになる)
            event.acceptTransferModes(TransferMode.COPY);
        }
    }

    @FXML
    private void handleDropped(DragEvent event) {
        // ドラッグボードを取得
        Dragboard board = event.getDragboard();
        if(board.hasFiles()) { 
            board.getFiles().stream().forEach((f) -> {
                System.out.println(f.getPath());
            });
            // ドロップ受け入れ
            event.setDropCompleted(true);
        } else {    // ファイル以外なら
            // ドロップ受け入れ拒否
            event.setDropCompleted(false);
        }
    }

2014.08.05

[Java8] JavaFX、とりあえずリストビュー

JavaFX Scene BuilderでListViewを追加して
Controllerクラスに↓を追加して、Scene BuilderでListViewのfx:id属性にlistViewを指定する。

    @FXML
    private ListView<String> listView;

あとは、

        listView.getItems().add("hoge”);

でリストに追加できる。まっ、これはとりあえず(^^;)

実際には、

    private ObservableList<String> items;

を定義しておいて、initializeあたりで

        items = FXCollections.observableArrayList();      
        listView.setItems(items);

を追加して、以後、itemsに追加したり削除したりするとリストが更新されるようになります。

つぎに、編集できるようにする。↓を追加。

        // 編集可能にする。
        listView.setEditable(true);       
        listView.setCellFactory(TextFieldListCell.forListView());

これで編集できるようになって、変更した内容がitemsに反映されます。

サンプル

2014.08.04

[Java8] JavaFX、閉じるの阻止

ウィンドウの閉じるボタンを押されたときの閉じないようにする方法は
こんなかんじになります。

        stage.setOnCloseRequest((WindowEvent event) -> {
                // 閉じるを阻止!
                event.consume();
        });

これをそのまま入れると強制終了しかできなくなるので注意w
閉じると困るときのみevent.consume()を呼ぶようにしましょうw

2014.07.29

Javaアプリケーションをexe化する方法

リンク: JavaアプリをExe化するLaunch4jの使い方と仕組み - seraphyの日記.

これでできた。

2014.07.24

[Java8] JavaFX、TextFieldの変更イベントを取る。

TextFieldの変更イベントを取るには、textPropertyにaddListenerすればよい。
newValueに値が入っている。

        textField.textProperty().addListener((ObservableValue observable, String oldValue, String newValue) -> {
                ・・・・・・
        });

2014.07.21

[Java,Android] CPUコア数の取得

JavaでCPUコア数の取得方法って、
意外となかなか見つけれなかったのでメモっとく。

        int core = Runtime.getRuntime().availableProcessors();

で、論理コア数が取れる。

Androidだと、SDKの説明によると
4.2以上は最大コア数で、
それ以前は、オンラインになっているコア数。つまり、省電力モードや熱などで動作コア数が変化する場合はそのコア数になるようです。

2014.07.20

[Java] 解像度を設定してJPEG保存

Javaで解像度(dpi)を設定してJPEG保存する方法を調べてみた。

次のようにするとできる。

    public static boolean saveJpeg(FileOutputStream outputStream, BufferedImage img, float compression, int dpi) {
        if(compression < 0 || compression > 1f) {
            return false;
        }
        ImageWriter iw = ImageIO.getImageWritersByFormatName("jpeg").next();
        try (ImageOutputStream ios = ImageIO.createImageOutputStream(outputStream)) {
            iw.setOutput(ios);

            JPEGImageWriteParam param = (JPEGImageWriteParam)iw.getDefaultWriteParam();
            param.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
            param.setCompressionQuality(compression);

            IIOMetadata imageMeta = iw.getDefaultImageMetadata(new ImageTypeSpecifier(img), param);
            Element tree = (Element) imageMeta.getAsTree("javax_imageio_jpeg_image_1.0");
            Element jfif = (Element) tree.getElementsByTagName("app0JFIF").item(0);
            jfif.setAttribute("resUnits", "1");     // 解像度の単位をDPIにする。
            jfif.setAttribute("Xdensity", Integer.toString(dpi));   // 解像度設定
            jfif.setAttribute("Ydensity", Integer.toString(dpi));
            // メタデータを設定
            imageMeta.setFromTree("javax_imageio_jpeg_image_1.0", tree);

            // 書き込み
            iw.write(null, new IIOImage(img, null, imageMeta), param);
        } catch (IOException ex) {
            return false;
        }
        iw.dispose();
        
        return true;
    }

2014.07.04

Mac での配布用の Java アプリケーションのパッケージ化

リンク: Mac での配布用の Java アプリケーションのパッケージ化.

これでできたw

2014.07.01

[Java8] JavaFXでディレクトリ選択ダイアログ

リンク: [Java8] JavaFXでファイル選択ダイアログ: ときどき日記4.0.

リンク先についでに書いとけばよかったんだが・・・

ファイル選択ダイアログは、javafx.stage.DirectoryChooserを使用します。
こんな感じで

        DirectoryChooser dirChooser = new DirectoryChooser();
        
        dirChooser.setTitle("ディレクトリ選択");
        // 初期ディレクトリをホームにする
        dirChooser.setInitialDirectory(new File(System.getProperty("user.home")));
        
        File file = dirChooser.showDialog(mStage);
        if(file != null) {
            System.out.println(file.getPath());
        }

2014.06.30

[Java8] JavaFXでファイル選択ダイアログ

ファイル選択ダイアログは、javafx.stage.FileChooserを使用します。

次のような感じ。

        FileChooser fileChooser = new FileChooser();
        
        fileChooser.setTitle("ファイル選択");
        // 拡張子フィルタを設定
        fileChooser.getExtensionFilters().add(
                new FileChooser.ExtensionFilter("イメージファイル", "*.jpg", "*.png")
        );
        fileChooser.getExtensionFilters().add(
                new FileChooser.ExtensionFilter("すべてのファイル", "*.*")
        );
        // 初期ディレクトリをホームにする。
        fileChooser.setInitialDirectory(new File(System.getProperty("user.home")));

        // ファイル選択
        File file = fileChooser.showOpenDialog(mStage);
        if(file != null) {
            System.out.println(file.getPath());
        }

複数ファイル選択は、showOpenDialogの代わりにshowOpenMultipleDialogを呼びます。

 

        List<File> files = fileChooser.showOpenMultipleDialog(mStage);
        if(files != null) {
            for(File f : files) {
                System.out.println(f.getPath());
            }
        }

ファイル保存は、初期ファイル名をsetInitialFileNameで設定してshowOpenDialogの代わりにshowSaveDialogを呼びます。

 

        fileChooser.setInitialFileName("hoge.jpg");
        File file = fileChooser.showSaveDialog(mStage);
        if(file != null) {
            System.out.println(file.getPath());
        }

2014.06.22

[Java8] JavaFXにメッセージボックスがなさそうなんで簡単なのを作ってみた。

JavaFXにメッセージボックスがなさそうなんで簡単なのを作ってみた。

とりあえず、OKボタン一個とメッセージを表示するラベルしかないのだけど。

ソース:TestMessageBox.zip 

ソース内の
FXMLMessageBox.fxml
MessageBoxController.java
MessageBox.java
がメッセージボックス本体。
それ以外が呼び出しているところやなんやら。

MessageBoxを使うのにStageが必要になるんだけどControllerクラス内で取得する必要があるけどスマートに取得する方法がないんでApplicationを継承したクラスでControllerクラスに渡すようにしている。

2014.06.21

[Java8] ワーカースレッドからUI部品(JavaFX)を操作する

たいがいのウィンドウシステムではワーカースレッドから直接GUI部品を操作することができない。Java+JavaFXでもできません。

JavaFXの場合、JavaFX Application Threadが動いていてそこでしかできない。
Platform.runLaterを使うとそのスレッドで処理することができる。

次のような感じ。logTextはTextArea。

    private void AddMessage(String msg) {
        Platform.runLater(() -> {
            logText.appendText(msg);
            logText.appendText("\n");
        });
    }

2014.06.17

Java8でノイズ除去作ってみたが・・・

リンク: OpenCLでノイズ除去作ってみたが・・・(2): ときどき日記4.0.

で作ったやつをJava8で作り直してみた。単にJava8(てか、JavaFX8)でなんか
作ってみようと思って、これが丁度手頃なサイズなんでこれを選んだ。
当然、目的からしてOpenCLを呼ぶようなところは移植していない。

MedianTestFX.zip

ついでにC#でもノイズ除去するのを上のリンク先のソースに追加もした。
もともと、.Net 4.0以降のParallel.Forを使っていたので、
それをThreadPoolを使うように書き直している。
(公開しているソースはVS2008のコードなもんで(^^;))

ということで、測定。Java8、C#での結果を追加した。

Core2 Quad Q9400 Atom Z3740 Core i7 2620M
OpenCL OpenMP C# Java8 OpenCL OpenMP C# Java8 OpenMP C# Java8
001.jpg 0.3068 0.503 0.8498 0.4409 7.99577952 0.88127284 1.61415786 1.4767 0.48360084 0.74568131 0.5579
002.jpg 0.1804 0.3168 0.6712 0.2817 7.34302774 0.75004404 1.4016307 1.2794 0.32448058 0.56004098 0.3448
003.jpg 4.6952 0.5056 0.7354 0.4164 2.90403514 0.82185144 1.48132308 1.4183 0.43056076 0.81900144 0.448
004.jpg 0.3222 0.5096 0.7656 0.443 7.57648828 0.85317542 1.51101251 1.3729 0.45864082 0.84864149 0.4901
005.jpg 0.3282 0.519 0.7658 0.4426 7.55618022 0.85627354 1.50788813 1.4303 0.46800082 0.85176149 0.5267
006.jpg 0.3292 0.5238 0.7765 0.4371 7.6182202 0.86250938 1.51726157 1.3811 0.46488082 0.87360154 0.5195
007.jpg 0.3242 0.5176 0.7686 0.4393 7.46120562 0.85002122 1.51102694 1.3936 0.45864082 0.88466381 0.5171
008.jpg 0.329 0.5164 0.7715 0.4419 7.47796678 0.87192582 1.52507566 1.369 0.48360086 0.90168159 0.5305
009.jpg 0.365 0.5202 0.7986 0.4508 7.5596978 0.84685846 1.5157 1.377 0.47736084 0.91260161 0.5401
010.jpg 2.2004 0.514 0.7772 0.4382 2.7020981 0.8594254 1.49538439 1.3958 0.48360084 0.89076156 0.533

Javaけっこー速い。

2012.05.10

Eclipseに入れたプラグイン(AnyEdit toolsプラグイン)

リンク: Eclipse AnyEdit toolsプラグイン (CentOS 5.4 64bit) 編|赤び~の備忘録.

2009.02.18

Java:" Content is not allowed in prolog"って出る!

UTF-8で保存している場合の注意点を見つけました。BOM付きのUTF-8で保存した場合に上記例外が発生するようです。

リンク:虎児記(とらのこぶみ): Content is not allowed in prolog.エラー

JavaでXMLを読むあたりで" Content is not allowed in prolog"でて調べてみたら、
BOM付きのUTF-8がダメみたいです!

2009.02.06

Cometを有効にするには

最近、Javaでプログラムを書いてたりする。

リンク: Tomcat 6で実現! Ajaxを超える通信技術Comet (1/3) - @IT.

org.apache.coyote.http11.Http11NioProtocol

ふむふむ、これを設定すればいいのね。


Google

サーチする:
Amazon.co.jp のロゴ









携帯URL