Java低速GUI Swing 8 ..
[2ch|▼Menu]
331:326
09/02/11 00:24:39
>> 327
今回はキーが押された場合のみを処理したいので
DocumentFilter は使えないのですが、
回答ありがとうございます。

>>328 >>329 を参考にして
こんな感じにしてみました。

final Action defaultAction = keymap.getDefaultAction();
keymap.setDefaultAction(new AbstractAction() {
    @Override public void actionPerformed(ActionEvent ae) {
      String cmd = ae.getActionCommand();
      if (!" ".equals(cmd)) {
        defaultAction.actionPerformed(ae);
      }
    }
  } );

UIによって独自のデフォルトアクションが
セットされるかもしれない(?)ので、
>>329 の案のほうがよいかと。


332:デフォルトの名無しさん
09/02/11 00:30:05
まずEDTといってもシステムキューの方かSwingEDTの方なのかはっきりしてもらわんとなぁ。
単にEDTと言ったらjavaの場合SwingEDTの方を指す場合が多いからややこしい。

333:デフォルトの名無しさん
09/02/11 01:47:13
>>332
システムキューって何ぞ?
用語が一般的過ぎて、ぐぐってもそれらしきものが引っかからん。
説明資料へのリンク希望。
AWTイベントキューとは違うもんなんだよね?

334:sage
09/02/11 10:31:21
>>331
Actionに委譲するのは良いんだけど、
>UIによって独自のデフォルトアクションがセットされるかもしれない
ということを考慮するなら、委譲するActionの参照を保存してたらダメでしょ。
UI変更時に、上記のコード自体が再実行されるなら、アリだけど。

335:デフォルトの名無しさん
09/02/11 17:23:09
>>333
同じ、AWTのEDTの事をAWT event queues systemと表記する場合とSystem Queueと表記する場合がある。
今はどうなってるが知らんが。


336:デフォルトの名無しさん
09/02/11 19:36:49
>>335
んー、そうすると、昔は知らんが、今はシステムキュー==AWTのEDT==SwingのEDTなんじゃ?
>>330に書いたように、Java1.3 以降は
javax.swing.SwingUtilities.isEventDispatchThread() == java.awt.EventQueue.isDispatchThread()
なんだし。

337:326
09/02/11 23:57:03
>>334
説明不足でしたが
updateUI() をオーバーライドして
super.updateUI() の後に処理を書いているので
たぶん大丈夫だと思います。


338:デフォルトの名無しさん
09/02/19 21:59:44
こういうタイポとかでdeprecatedなメソッドはさすがに廃止してもいんじゃなかろうか。
URLリンク(java.sun.com)()

339:デフォルトの名無しさん
09/02/19 22:48:12
廃止したら、古いアプリケーションが動かなくなるからな。
ところで Cloneable はスペルミスなのに
Closeable は間違いじゃないんだな。
ややこしい。


340:デフォルトの名無しさん
09/02/20 13:56:33
互換用のjarを用意して、コンパイル時にはエラーにしてしまえばいいのに。

341:デフォルトの名無しさん
09/02/20 18:53:19
コンパイルエラーにする代わりに警告を出してるんでしょ。
問題ないと思うけど。


342:デフォルトの名無しさん
09/02/21 15:16:20
>>340
互換用のjar吐くフリーソフトとか作ったら需要あるかな。
メソッドシグネチャだけコピーして、どれを呼んでもErrorなげる実装とかいうやつ。

343:デフォルトの名無しさん
09/02/23 09:18:34
JDKのライセンス違反になるからダメ。

java.*、javax.*、sun.*以下のクラスは変えちゃいかんのよ。
勝手にクラス追加するのも禁止されてる。

344:デフォルトの名無しさん
09/02/24 17:34:57
JEditorPaneで単純にHTMLを表示する場合なんだけど、
<a href="#hoge">Hoge</a>
. . . . . .
<a name="hoge">ここにくる</a>

とやって、ページ内でジャンプさせることってできないんだっけか?

345:デフォルトの名無しさん
09/02/24 18:54:43
>>344
クリック監視はHyperlinkListenerで。
そこからJEditorPane#scrollToReference("#hoge")でなんとかなんないかな。

346:デフォルトの名無しさん
09/02/24 19:42:27
>>345
ありがとう!
これから試してみる。

347:デフォルトの名無しさん
09/02/24 22:07:18
>>345
ありがーと!
うまくいった。
JEditorPane#scrollToReference("hoge")
で、#はいらないようです。

348:デフォルトの名無しさん
09/02/24 22:28:04
うふっ

349:
09/02/26 20:25:14
JLabelがクリックされたとき、JLabelではなく親のコンポーネントがクリックされたことにしたいのですが
どういしたらいいでしょうか。

350:デフォルトの名無しさん
09/02/26 20:39:23
>>349
あほらしい方法だけど
public void mouseClicked(MouseEvent e) {
JComponent c = (JComponent)e.getSource();
for(MouseListener l :c.getParent().getMouseListeners()){
l.mouseClicked(e);
}
}

351:デフォルトの名無しさん
09/02/26 22:34:16
俺なら親のaddMouseListenerをオーバーライドしたいな

352:デフォルトの名無しさん
09/02/26 22:48:15
俺俺なら親にディスパッチする

353:sage
09/02/26 22:54:12
俺俺俺も親にディスパッチするな。
350 みたいに実装するなら、MouseEventを変換してやらないと。



354:デフォルトの名無しさん
09/02/26 22:57:08
まぁ俺の方がディスパッチするけどね。

355:デフォルトの名無しさん
09/02/26 23:07:01
ディスパッチってどうやってするねん?

俺も>>350みたいにリスナーぶち込みで対処したことがある

356:sage
09/02/26 23:17:41
>>355
java.awt.Component#dispatchEvent(AWTEvent)嫁。

357:349
09/02/27 00:35:17
getParent().dispatchEvent(event);が一番短くかけるみたいですね。

>>350から355のみなさん、どうもありがとうございました。

358:デフォルトの名無しさん
09/02/27 01:09:26
普通に JLabel の親に対して
addMouseListener(MouseEvent) を呼べば
>>349 に書かれてるような挙動になるけど。


359:デフォルトの名無しさん
09/02/27 01:40:53
c.addKeyListener(new KeyAdapter() {
  public void keyPressed(KeyEvent e) {
    c.removeKeyListener(this);
  }
});

どさくさにまぎれて、一度だけ実行されるリスナーの小技。(流れ上、マウスリスナでないのは手抜き)
めったに使う機会がないと思うけど。。

360:デフォルトの名無しさん
09/02/27 01:54:28
それいけるんだ
Iteratorのループで出来ないかと思ってた〜

361:デフォルトの名無しさん
09/02/28 12:05:56
JComponent.setFont(new Font("メイリオ", Font.BOLD, 42))
とすると一回目だけすごく遅いんですが、フォントの読み込みは
何かテクニックがあるんでしょうか?

362:デフォルトの名無しさん
09/02/28 17:07:54
アプリケーション起動時にあらかじめ読み込んでおくくらいしかないよ
いずれにせよロード時間はかかる

363:デフォルトの名無しさん
09/03/01 17:17:19
Java SE Development Kit (JDK) 6 Update 11
Eclipse3.4.1
WindowsXP SP3

上記の環境があり、そこでGUIアプリをJavaで作成しようと思っています。
Swing(?)ってのをElipseのメニューから探したのですが、見当たりません。

JavaSEをアンインストールして、JavaEEをインストールするのが妥当な選択なのでしょうか?
それともplug-inがまた別にあるのでしょうか?

364:デフォルトの名無しさん
09/03/01 17:39:46
>>363
LANケーブルを抜いてクビをククルのが最速

365:デフォルトの名無しさん
09/03/01 17:49:20
>>364
最速か否かは聞かれてないだろww

366:デフォルトの名無しさん
09/03/01 17:54:37
exlipseの標準環境だと、swingアプリはメモ帳でhtml手打ちするようなのりで、
自分でソースコード書いて全部作ることになるっす。

net beansとかいうの使うと、VBみたいなポトペタを標準でできるらしい
eclipseもプラグイン導入するとポトペタできるらしい
が、swingでポトペタやったことないんでわかりません。

367:デフォルトの名無しさん
09/03/01 18:23:02
>>366
Swingやるなら現状ではNetBeans一択らしい。
EclipseプラグインのVE(VisualEditor)は使いもんにならんそうな。
俺はEclipseで手打ちしてるけどナー。
# EcilpseからSwingアプリを起動すると、フォント構成ファイルが無視されて、
# 日本語じゃないフォントで日本語がレンダリングされるという問題も……。
# おかしいなー、フォント構成ファイルの読み込み自体は正常に行われてるんだが。

368:デフォルトの名無しさん
09/03/01 20:00:47
つ jigloo

369:デフォルトの名無しさん
09/03/01 21:02:05
じぐるーも重いしすごくグループレイアウトが使いにくいしだめだよなぁ

370:デフォルトの名無しさん
09/03/01 22:51:25
NetBeansでGUI作って、Eclipseに持ち込んでる俺。
他にもいるでしょ、こんな人。

371:デフォルトの名無しさん
09/03/01 23:11:34
>>367
VEは使ってみて、脱力した。
正直、自分の脳内でレイアウト組んだほうがマシ。
最近は更新もされてないんじゃなかったっけ?

372:デフォルトの名無しさん
09/03/03 01:20:54
swingの印刷機能って、コンポーネント上の文字がカクカクになって印刷されるんだけど、
これって普通なの?

373:デフォルトの名無しさん
09/03/03 08:18:06
>>372
アンチエイリアスかければ?

374:デフォルトの名無しさん
09/03/03 23:11:33
>>370
余裕で俺、とウチの社内全員。

375:デフォルトの名無しさん
09/03/04 00:14:31
>>370
NetBeansでそのままつくらずに、Eclipseに持ち込む理由はなんですか

376:デフォルトの名無しさん
09/03/04 00:27:24
大技見つけたぜぃ。

Javaで比較的簡単にホットデプロイする方法。

まず、デプロイしたいクラスのベースとなるHogeを作っておきます。
そして、それを継承したHoge00というクラスを作ります。
ただし、このクラスのファイル名はHogeXX.javaという風にします。
コンパイルできなければ対策を考えますが、クラスをpublicにしなければ通るようです。
そして、修正してデプロイするときには、Hoge00をHoge01という風にクラスの名前も変えます。
ファイル名はそのままです。

クラス名を変えるとコンストラクタ名まで変えないといけません。この時の小技として
コンストラクタの処理を全て関数にしてHoge00クラスにはコンストラクタを記述しないようにします。
その為、Hogeクラスには空のデフォルトコンストラクタを用意しておきます。

あとは、コンパイルしてシステムのクラスローダを使ってHoge01クラスを読み込んで
Hogeにキャストして使用できます。Hogeにはインターフェースとなる関数を用意しておきます。

従来の方法だと別のクラスローダを使ったりするので、同じクラスを違うクラスであるとしてしまう為
キャストしたり出来ません。なので、リフレクションなどを使ってアクセスする事になります。
これがどうもうまくないと思ったので、別の方法を考えたら思いつきました。

今からサンプルを作ります。

377:デフォルトの名無しさん
09/03/04 01:39:21
URLリンク(space.geocities.jp)

ホームページに置きました。
なぜか、antから起動しないとToolProvider.getSystemJavaCompiler()がnullになってしまうので
antを使ってください。この辺を調べてみます。でゎ、おやすみ。

378:デフォルトの名無しさん
09/03/04 01:53:06
なんだか麻布の臭いがする。。。

379:デフォルトの名無しさん
09/03/04 10:33:20
GUIはまったく初心者だったけど「Javaアプリケーション作成講座」という本を読んで
だんだんわかるようになってきた
とりあえず簡単なテキストエディタやブラウザは作れるようになった

380:デフォルトの名無しさん
09/03/04 11:28:11
javax.tools.ToolProvider.getSystemJavaCompiler()がnullを返すのは
JAVA_HOME\lib\tools.jarにクラスパスが通ってない事が原因でした。

381:デフォルトの名無しさん
09/03/04 20:24:28
ネタ・・・じゃ・・・ないの・・・・か?

382:デフォルトの名無しさん
09/03/05 02:06:57
Swingに印刷プレビューダイアログってありますか?

383:デフォルトの名無しさん
09/03/05 09:36:17
作れば良いんじゃないの

384:sage
09/03/06 00:33:36
以下のバグが1.4でも6.0でも再現するんだけど、JTextField#setTextはスレッドセーフじゃないの?
それとも検証方法自体が間違ってるの?
URLリンク(bugs.sun.com)

385:デフォルトの名無しさん
09/03/06 00:42:39
swing自体スレッドセーフじゃなかったと思う

386:デフォルトの名無しさん
09/03/06 00:44:55
1.4.2で直ってないって書いてあるし、放置されてるんじゃね?

387:デフォルトの名無しさん
09/03/06 00:46:00
この再現コードみたいなことをすること自体基本的にないからなぁ

388:デフォルトの名無しさん
09/03/06 00:50:16
>>385
↓スレッドセーフだと書いてあるんだが・・・
URLリンク(sdc.sun.co.jp)(java.lang.String)

389:デフォルトの名無しさん
09/03/06 01:13:56
ざっとソースをみたところ、スレッドセーフじゃないね。

テキストのモデルであるDocumentへの書き込みがアトミックであったとしても、
UIスレッドを用いてコンポーネントから何らかの値をとってくるメソッドで
Documentのインスタンスを2回以上使うような操作をする全てのメソッドは
その間はDocumentへの書き込みを排他していないといけないはずなのだが、
少なくとも、getTextメソッドでは、そんなめんどくさいことはやってない。

390:389
09/03/06 01:15:33
ソースは Java 6 しかみてない。すまん

391:デフォルトの名無しさん
09/03/06 01:18:31
setTextする処理をEDTに投げればいいんじゃないの?的外れだったらごめん。

392:デフォルトの名無しさん
09/03/06 01:43:30
>>389
>.少なくとも、getTextメソッドでは、そんなめんどくさいことはやってない。

setTextの話だったんだけど、typo?

393:デフォルトの名無しさん
09/03/06 01:53:44
>>392
getTextが変な値を返す原因がsetTextをUIスレッド以外でアクセスしたことにあるなら、
setTextはスレッドセーフだといえる?

394:デフォルトの名無しさん
09/03/06 07:33:43
>>393
setTextの時点で変な値にならないのであれば、setTextはスレッドセーフじゃないの?
(よくわかってないかもしれん・・・)

そもそも>>384の再現コードは、getTextした値が""や"12"や"21"になることがあり、
以下のように思ってるんだが、違うかな?

""は、setTextが値を一度クリアしたタイミングで、getTextしているから。(getTextがスレッドセーフではないから)
"12"や"21"はsetTextがロックする前にAbstractDocument#getLengthを呼び出していることが原因。
(setTextもスレッドセーフではない?)

395:デフォルトの名無しさん
09/03/06 13:04:40
JavaDoc を見る限り getText() はスレッドセーフじゃないんだな…知らなかった…
別スレッドからsetText()して結果的に画面に"12"や"21"や""が描画される
ことがないのであれば setText() はスレッドセーフといえる…のかな?

でも現状は >>394 のいうようにsetText()もスレッドセーフじゃないように見えるなぁ

396:デフォルトの名無しさん
09/03/06 17:43:09
setText()のスレッドセーフを確認するのに、スレッドセーフではないgetText()が絡んでくるとややこしくなるので
setText()するたびに文字列を溜めておいて、最後に検証するというのはどうだろう。

397:デフォルトの名無しさん
09/03/06 19:28:23
AbstractDocument.readLockを使えば、少しはましになるけど、ダメだった。
たまに、"12"と"21"が出てくる。

398:デフォルトの名無しさん
09/03/06 22:27:20
swingコンポーネントをディープコピーしようとしたら、
Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: java.io.NotSerializableException: com.sun.java.swing.plaf.windows.XPStyle$Skin
っていわれるんだけど、どうすりゃいいの?

399:デフォルトの名無しさん
09/03/08 00:12:39
Beans Bindingはもう見捨てられたのかと思ってたけど、先月スペックリードが変わってるね。
これは期待してもいいんだろうか。

400:デフォルトの名無しさん
09/03/08 01:08:00
スペックリードとは仕様定めるリーダーみたいなものでしょうか?

401:デフォルトの名無しさん
09/03/10 10:41:55
複数のクラスで共用するダイアログなどで、わざわざそれぞれのフィールドとして持たせたくない場合は、UIUtilitiesなどを作ってそこでshow***といった感じで定義しても問題ないでしょうか


最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4350日前に更新/99 KB
担当:undef