SSブログ
JAVAでプログラム ブログトップ
前の10件 | -

KeyListnerが動かない [JAVAでプログラム]

(2018.06.22)
『作ったプログラムはWindow PCでもLinuxマシンでもRaspiでも動く』という所に魅力を感じて、GUIアプリの開発はJAVA Swingでやっています。しかし知識が浅いので、不具合の原因を見つけるのにいつも苦労します。今回もJPanelに組み込んだKeylistnerが動かない原因が判らず、ジタバタしました。orz

結論から言うと、以下のコードが原因でした。
setFocusCycleRoot(true);

これがあると、その後に以下のコードを書いても、JPanelはFocusを得ることが 出来ません。
  setFocusable(true);

やれやれ。

nice!(2)  コメント(0) 
共通テーマ:日記・雑感

プログラムが冗長だと叱られた [JAVAでプログラム]

(2014.09.12)
Netbeansは強力なJAVAプログラム支援機能を備えています。コード補完は元より、import文を自動挿入したり、ラムダ式に変換してくれたり・・・

あるところで、次のコードを書いたらプログラムが冗長だと叱られました。
   if( receive_buff[0] == 'B' ){
      busy_flag = true;
   }
   else{
      busy_flag = false;
   }

Netbeansの推奨する記述はこうでした。

   busy_flag = receive_buff[0] == 'B';


意味は判るけど、この記述は好きになれないなぁ~
どうしよう!
大人しく言うことを聞いてあげる?

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ

nice!(1)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Robotクラスを試してみた(その2) [JAVAでプログラム]

(2013.10.08)
Java関連のサイトで、awtのRobotクラス(これです)を見つけ、あれこれ試しています。

”Java プラットフォーム実装テストを自動化することを目的とする”という説明を読んで、JVMのレベルで”入力イベントを生成する”のだと思っていました。しかし、”ネイティブなシステム入力イベントを生成する”という説明に引っかかりを覚えました。

『もしかして、X-window上で他のアプリにもアクセスできる?』

CygwinからRasberry pi(Raspbian)のX-window(lxsession)を立ち上げ、Robotクラスのテスト・アプリを動かしてみると・・・

ビンゴ~
Emacsにカーソルを置いて、文字入力できることが判りました。
使いこなすのは大変かもしれませんが、何だか面白いことが出来そうです。

ところで、Emacsに入力する文字列を生成しようとして、Shift入力で躓きました。
<駄目なコード>
    private void key_click(int key)
    {
        robot.keyPress( key );
        robot.keyRelease( key );
    }

    key_click(KeyEvent.VK_A);   <== 'a'
    key_click(KeyEvent.VK_SHIFT+KeyEvent.VK_A);   <== 'q'

ここを見て納得しましたが、どうやったら”shift+a”を入力できるのでしょうか?

先達の知恵を求め、こんなコードに出会いました。
    private void doType(int... keyCodes) {
        doType(keyCodes, 0, keyCodes.length);
    }

    private void doType(int[] keyCodes, int offset, int length) {
        if (length == 0) {
            return;
        }

        robot.keyPress(keyCodes[offset]);
        doType(keyCodes, offset + 1, length - 1);
        robot.keyRelease(keyCodes[offset]);
    }


なるほど!

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Robotクラスを試してみた(その1) [JAVAでプログラム]

(2013.10.07)
久しぶりにJava関連のサイトを検索していて、awtの面白いクラス(これです)を見つけました。

”マウスやキーボードで制御されるアプリケーションに、ネイティブなシステム入力イベントを生成する”クラスです。”Java プラットフォーム実装テストを自動化すること”を目的とするのだそうですが、実際にマウス・カーソルを移動させることが出来るので、他の目的にも使えそうです。

早速プログラム(マウスの動きを記録して、逆に再生する)を作って、Raspberry piのXwindow上で動くかどうか試してみました。
    public static void main( String args[] ) {

        ArrayList mouse_log = new ArrayList<>();
        int times = Integer.valueOf( args[ 1 ] );
        int interval = Integer.valueOf( args[ 0 ] );
        System.out.printf("Interval %dms\n", interval*100);
        System.out.printf("Times %d\n", times);

        try {
            robot = new Robot();
            robot.setAutoDelay(100);
        }
        catch ( Exception e ) {
            e.printStackTrace();
            return;
        }

        
        for( int loop=0;loop=0;loop--)
        {
            Point mp = mouse_log.get( loop );
            System.out.printf("Mouse %d , %d\n",mp.x, mp.y);
            robot.mouseMove(mp.x, mp.y);
            try {
                Thread.sleep( 100*interval);
            } catch (InterruptedException ex) {
                Logger.getLogger(Robot_Test.class.getName()).log(Level.SEVERE, null, ex);
            }
        }


動きました!
PICからI2C経由でデータを送って、マウス・カーソルを操作できそうです。

どんな役に立つか具体的なイメージはありませんが、例えば『XYステージの動作位置をマウス・カーソルで表示する』なんてことが出来るかもしれません。

ちょっと面白くなってきました。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
管理人が気になっている広告です。






にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

bcm2835_for_java(仮称)の体裁がまとまってきた [JAVAでプログラム]

(2013.09.16)
C言語で書かれたBCM2835ライブラリ(これです)をJAVAから呼び出す仕組み(<==bcm2835_for_java)の開発を続けてきましたが、少しずつ体裁がまとまってきました。

アプリケーションで使用するファイルは以下の3つです。

bcm2835.jar <== BCM2835ライブラリのラッパー
libbcm_interface.so <== JAVAプロセス側のインターフェース関数群
bcm2835_for_java <== BCMプロセス側のインターフェース関数群(root権限で動作する)

Raspberry piでLEDを点滅するJAVAプログラムはこんな感じです。
import dkl.bcm2835;

public class Example {

    static final byte PIN = bcm2835.RPI_GPIO_P1_11;
    public static void main(String[] args) {
        
        bcm2835.bi_init(args[0]);
        bcm2835.gpio_fsel(PIN, bcm2835.BCM2835_GPIO_FSEL_OUTP);
        for(int i=0; i<5; i++ )
        {
            bcm2835.gpio_write(PIN, bcm2835.HIGH);
            bcm2835.bi_delay(500);
            bcm2835.gpio_write(PIN, bcm2835.LOW);
            bcm2835.bi_delay(500);
        }
        if( bcm2835.ope_sync() != 0 )
        {
            System.out.print("ope_sync error\n");
        }
        bcm2835.bi_close();
    }
}

ライブラリの呼び出しをすっきり記述できるように整理しました。
<以前のコード>
BCMInterface.INSTANCE.bi_init(args[0]);
BCMInterface.INSTANCE.bi_bcm2835_init();

<今のコード>
bcm2835.bi_init(args[0]);

ソース・コードの見苦しい点には目をつぶり、簡単な説明を付けてGITHUBに登録しようと考えているのですが・・・

GITがよく判らない(爆)

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

LinuxマシンでJDK1.8.0を動かしてみた [JAVAでプログラム]

(2013.08.17)
Linuxマシン(<==CentOS 6)でJDK1.8.0とNetbeans7.4βを試してみました。

最初Cygwinで試そうとしたのですが、Linux版が動かない(Windows版を使うらしい)ので、CentOS 6が走っているサーバ・マシンで試しました。

今回もRaspberry piのときと同様に、CygwinのXサーバを立ち上げます。
そしてCygwinのコンソールで
 ==> $ xinit
Cygwin/Xウィンドウ内のコンソールで
==> $ ssh -Y admin@192.168.*.*
==> password入力
CentOSのリモート・コンソールで
 ==> $ gnome-session

これでCygwinのXwindowにCentOSのgnomeデスクトップが表示されます。
さすがにgnomeは使いやすく、Linux版のJDK1.8.0とSample&Demo、そしてNetbeans7.4βをWEBからダウンロードしてインストールするのも簡単でした。

Linux版のJDK1.8.0であれば、Netbeans7,4でJAVAFXのプログラムをビルドできました。また、サンプルのStopwatch.jarも以下のコマンドで試すことが出来ました。

$ java -version
java version "1.8.0-ea"
Java(TM) SE Runtime Environment (build 1.8.0-ea-b102)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b44, mixed mode)
$ cd javafx-samples-8.0.0-ea
$ java -jar Stopwatch.jar

2013_0817.pngやっとStopwatchが動いた

CygwinのXサーバは慣れればとても便利です。長らく利用してきた4chのKVMスイッチを引退させるときが来たようです。

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ

nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

JavaFX Ensembleのコードを拾い読みした [JAVAでプログラム]

(2013.01.23)
ここ暫く、JavaFX2のTutorialやサンプルをあれこれ試してきました。しかし、いざ自分でアプリを設計しようとすると、判らないことだらけです。実際のところ、プログラム・コードをコピペしたり、プロジェクトごとインポートしただけですから、それでJavaFX2が使えるようになる筈はありません。

”LoginCSSのFXML化”をなんとか(自力で)クリアしたので、(1)JavaFXの新規プロジェクトを立ち上げ、(2)必要なコントロールをFXMLで配置し、(3)CSSで表現し、(4)Controller.javaで操作する(<==これはちょっと怪しい)ことは出来る筈です。しかし、その先(画面を切り替える方法とか、ポップ・アップ・ウィンドウの作り方とか)が判りません。

画面の切替は”FXML-LoginDemo”でやったので、そのプログラム・ソースを参考にすればなんとかなりそうです。しかし、ポップ・アップ・ウィンドウの方はJavaFXのTutorialやサンプルで見た記憶がありません。Web検索を掛けても、ヒットするのはJavaFX1.0の例(多分そうだと思う)です。

”困ったことになった”と思い、JavaFX Ensembleのソース・フォルダに”popup"でGrepを掛けて見ると・・・

ビンゴ~!

2013_0123.pngここで使っていた

右上のSearchBoxの所でContextMenu()、Popup()、Tooltip()を使っていました。ソース・ファイルはこれ”src\Ensemble\src\ensemble\controls\SearchBox.java”です。

プログラム・ソースを解読出来るかどうか判りませんが、”javadocの何処を読めば良いか”だけは親族SNS管理人にも判ります。

あとは実践あるのみ?

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

”Java技術最前線(7年分)”を読みふけった [JAVAでプログラム]

(2013.01.22)
古くからJavaの技術トレンドを追い続けている”Java技術最前線”<これです>を、二日かけてざ~っと拾い読み(さすがにJAVAFX1.0の記事は飛ばした)しました。

お陰でJAVAの現状に対する理解が(少し)深まったように思います。

そして先ほど、NetBeans IDEのsampleプロジェクトの中に”JavaFX Ensemble”を見つけました。JavaFXの機能を網羅的に紹介したアプリで、プログラム・コードやjavadocの表示機能も備えています。JavaFXの初心者にとって、大変心強いお手本です。
2013_0122_1.pngnativeアプリにしてみた
早速、Windowsネイティブ・アプリにして、デスクトップにショートカットを設けました。こうしておけば、NetBeansで開発中に何か判らないことが出来たら、直ぐに”JavaFX Ensembleで動作確認できる”という訳です。

いよいよ、自作のアプリに取り組む時がやってきたのでしょうか?

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

XMLに再挑戦することにした [JAVAでプログラム]

(2013.01.20)
JavaFX Tutorialの課題で一つだけ達成できなかったのが”LoginCSSのXML化”です。そのときは、『XMLを使わなければ問題無い訳だし・・・』と気軽にスルーしましたが、GUIコンポーネントをXMLで記述するのがJavaFX2の流儀(?)らしいと判ってきて、『使わなければ問題無い』などと嘯いている訳にはいかなくなりました。

幸い、<こちら>のサンプルに動作するお手本(FXML-LoginDemo)を見つけました。

<お手本はこんな感じ>
2013_0120_2.pngデザインも格好良い

2013_0120_3.pngしかも実用的

実は、NetBeansの新規プロジェクトで”JavaFX FXMLアプリケーション”を選ぶと、こんなFXMLアプリケーションの雛形が出来るのです。
2013_0120_4.pngJavaFX FXMLアプリの雛形

<XMLはこんな感じ>
<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns:fx="http://javafx.com/fxml" fx:controller="javafxml_template.SampleController">
   <children>
        <Button layoutX="126" layoutY="90" text="Click Me!" onAction="#handleButtonAction" fx:id="button" />
        <Label layoutX="126" layoutY="120" minHeight="16" minWidth="69" fx:id="label" />
    </children>
</AnchorPane>

Tutorialのコードとは少し違いますが、これを書き換える方法で”LoginCSSのXML化”の課題に再挑戦してみました。


すると、XMLを一つ追加しただけで見覚えのあるエラー・メッセージがポップ・アップしました。
2013_0120_1.png早速現われた

そして、出力結果ペインには、こんなメッセージが表示されていました。
”Text is not a valid type.”

現状のXMLとお手本を見比べ、欠けていた<?import javafx.scene.text.*?>を追加すると・・・

ビンゴ~!
第一関門突破です。

どうやら、実行時にXMLファイルの不備が検出されると、あのエラー・メッセージがポップ・アップするようです。

前回敗退した<stylesheets>に必要なimport指定はこれでした。

<?import java.net.*?>

出力結果ペインに表示される、”URL is not a valid type.”というメッセージがimport指定の不備を示していることに、気付かなかった(と言うか知らなかった)のです。

そして、完成したLoginFXMLがこれです。(Scene Builder 1.1もちょっとだけ使ってみた)
2013_0120_5.pngやっと完成した

これで、JavaFXのTutorialも卒業(かな?)

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

JavaFXとSWT/JFaceをThread化してみた [JAVAでプログラム]

(2013.01.18)
NetBeansの環境にもかなり馴染んで、やりたいことが出来るようになってきました。そこで、JavaFXとSWT/JFaceのプログラムを同時に動かしてみることにしました。

例えばこんなコードだとJavaFXとSWT/JFaceは同時に動作せず、JavaFXTestが終了してからFileViewerが動くことになります。
public class Sample {
    public static void main(String[] args) {
        JavaFXTest.main(args);
        FileViewer.main(args);
    }
}

こんなコードにするとJavaFXとSWT/JFaceのプログラムが同時に動きました。(正しい方法かどうか判りません)
class FXthread extends Thread {
    public void run() {
        System.out.println("** JavaFX Rub ****");
        JavaFXJFaceSWT JavaFX = new JavaFXJFaceSWT();
        JavaFX.main(null);
    }
}

class JFthread extends Thread {
    public void run() {
        System.out.println("** JFaceSWT Run ****");
        FileViewer.main(null);
    }
}

public class Main {
    public static void main(String[] args) {
      System.out.println("** FXthread **");
      FXthread runFX = new FXthread();
      System.out.println("** JFthread **");
      JFthread runJF = new JFthread();

      runFX.start();
      runJF.start();
      System.out.println("last line in Main.main()");
   }
}


2013_0118_3.pngJavaFXとSWT/JFaceが同時に動いた

”JavaFXはThread-safeでは無い”らしいので、単にThreadから起動出来ただけでは問題を生じるかもしれません。<ここ>に記されている方法(javafx.concurrent Packageを使う)にも慣れておく必要がありそうです。

2013_0118_1.pngconcurrent Taskを試してみた
backgroundでカウントUPするタスクを動かし、そのカウント値でHelloWorldウィンドウのProgressBarを更新している。この画像は6秒くらい経過したときの様子。

Javaには丁寧なTutorialが用意されていて、入り易そうに見えます。しかし、一歩踏み込むと情報が錯綜していて、新しい情報と古い情報の区別がつかない初学者にとってハードルの高い世界だと感じました。まぁ、”やりがいがある”と言えばそうなんですが・・・

------------------------------------------
先日、”NetBeansがスタンド・アローン用の実行ファイルを用意する”と書きましたが間違いでした。これはJavaFX2.2の機能で、NetBeansがそれに対応しているということらしいです。

にほんブログ村 IT技術ブログへ
に

ほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感
前の10件 | - JAVAでプログラム ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。