Java低速GUI Swing 8 ..
[2ch|▼Menu]
253:デフォルトの名無しさん
09/01/30 16:59:16
カラープロファイルなんて印刷屋でもない限りどうでもいいだろ。

問題なのはメニューとか操作GUIの設計。
マクの実装だと、メニューはメインモニターにしか表示されないはず。
窓や犬は、メインウィンドウ自体にメニュー付いてるから、メインモニターとかサブモニターとか関係無く自由に使える。

254:デフォルトの名無しさん
09/01/30 17:45:12
winも結構トンチンカンな動きするソフトいたよな

サブモニタで右クリックしたら、メインモニタにメニューが出たり、
サブモニタで最大化したら、メインモニタで最大化したりw

サブモニタで最大化したら、メインモニタの解像度に広がった時は非常に困ったw

255:デフォルトの名無しさん
09/01/30 20:29:06
サブモニタから起動したJARアプリのスプラッシュは、
やっぱりサブモニタに出て欲しいなあ。アプリはちゃんとサブ側に出る。
あ、当方WinXP+Sunの1.6系Java。

そのへん、Macはどうなんでしょ。

256:デフォルトの名無しさん
09/01/30 20:39:50
サブモニタから起動したかってどうやって判断するんだろ?

257:デフォルトの名無しさん
09/01/30 20:48:28
> アプリはちゃんとサブ側に出る。
前回終了時の表示位置覚えてるだけじゃなくて?

258:デフォルトの名無しさん
09/01/30 22:00:26
サブモニタから。。。起動?

俺のwinはタスクバーがサブモニタにあるんだが、これだと全部サブモニタに出ないとおかしくなるぜ

>>257でいいと思う

259:デフォルトの名無しさん
09/01/30 22:37:13
Windowsの流儀は知らないけどタスクバーがある方を
プライマリモニターと呼ぶわけじゃないんだ?

260:デフォルトの名無しさん
09/01/30 22:52:01
winのタスクバーはメインもサブも移動可能
てなわけで、俺のタスクバーはサブモニタに配置してあります

メインかサブかは、画面の解像度とか設定する画面で設定できるっす

261:255
09/01/30 22:56:24
・サブモニタのデスクトップ上のJARファイルをダブルクリック
・サブモニタに移動したエクスプローラからJARファイルをダブルクリック

いずれもサブモニタにアプリが出る。
ジオメトリ関連でやってることはsetLocationByPlatform(true)のみ。
これを外してもやはりサブモニタに出る。

サブモニタのコマンドプロンプトからjava.exe経由で起動すると
さすがにメインモニタにアプリが出た。
サブモニタのNetBeansから起動してもやっぱりメインモニタ。

262:デフォルトの名無しさん
09/01/30 23:03:33
>>261
おもすれー

ちょっと試しになんか作ってみよう

263:デフォルトの名無しさん
09/01/30 23:09:57
皆さんに聞きたいのですが、javaでどんなデスクトップアプリつくってますか?

今自分はタスク管理系アプリを作成しています。
メモ帳でいいじゃんはいいこなしでw

264:デフォルトの名無しさん
09/01/30 23:22:40
>>263
社内用にファイル処理系のアプリ。

265:デフォルトの名無しさん
09/01/30 23:33:15
>>263
エロ画像を楽しく閲覧するためのツール

266:デフォルトの名無しさん
09/01/31 00:11:06
>>263
2chのスレッド監視してエロ画像勝手に収集するツール

267:デフォルトの名無しさん
09/01/31 00:30:01
>>263
携帯電話とmacとwinでスケジュールを一元管理するソフト

268:デフォルトの名無しさん
09/01/31 00:50:08
ADVエンジン

269:デフォルトの名無しさん
09/01/31 01:01:11
>>263
無駄にリッチなUIをもつ画像ビューワー

をJavaFXでつくりたい。

270:デフォルトの名無しさん
09/01/31 21:00:02
Swing学習中なんだけど、ドローツールみたいなのを作るとき、以下のどれがいい?
1) Canvasみたいなコンポーネントを作って、図形を全部自前で管理する。
2) 図形の種類毎にコンポーネントを作って、Panelとかに貼り付ける。
3) それ以外。思い付かないけど。


271:デフォルトの名無しさん
09/01/31 22:29:30
1かな。
ありがちなパターンだとShapeクラスを作ってそのクラスを継承したクラスを作る。
でJPanelを継承したShape描画用のコンポーネントを作って、paintComponentですべてのShpaeを描画する。

272:デフォルトの名無しさん
09/01/31 23:16:09
>>270
ネットワーク・グラフ描画用のライブラリをいくつか使ったことがあるんだけど、
そのどちらでもない設計が多かった。>>271が近い。

図形の管理はドロー用コンポーネントが行い、
実際の描画は図形オブジェクトに委譲している、と言えばいいかな。

図形の種類ごとにクラスを作るのは2と一緒だけど、
これらのクラスは独自のクラス階層を構成していて、
つまりJComponentのサブクラスではないので、そのままではSwingに乗っからない。
代わりに、図形を載せて描画する専用のSwingコンポーネントがある。
このドロー用コンポーネントは、paintComponentをオーバライドしていて、
addされた図形オブジェクトすべてに対して、paint系メソッドを呼ぶようになっている。
これらの図形クラスのpaint系メソッドは、各図形のための適切な描画を行うことになっている。

図形の追加の度にドロー用コンポーネントを変更しなくていいので、すっきりする。
Open-Closed Principleに合致しているね。

ライブラリによっては、図形クラスのpaint系メソッドがさらに別のオブジェクトに委譲可能で
ここがAdaptableだったり(JListのレンダラみたいなの)、
図形クラスを、Swing非依存のモデルクラスと、Swing依存のビュークラスに分けて設計していたり、
さまざまだった。
この手のライブラリはいろいろあるので、見てみるといい刺激になると思う。
挙げるなら、OpenJGraphとかJGraphとかJungとかかな。

273:デフォルトの名無しさん
09/01/31 23:59:22
「もしやJComponentを再発明しているのでは?」と思ったら、
思い切って資産捨てて透過JComponentベースで作り直す勇気も必要かも。

ドローツールとのことなので、まずは
・位置サイズのgetset、
・可視性のgetset、
・クリップしたGraphicsを渡すpaint
ぐらいの軽い独自インタフェースで十分だと思うけど。

274:デフォルトの名無しさん
09/02/01 00:07:19
>>271-272
thx! 「グラフィックJava2」とか「Filthy Rich Clients」とか
引っくり返しながらいじってるんですが、既存コンポーネント以外
の話になると極めてプリミティブな部分しか載ってなくて、
どういう風に設計すればよいか、という部分については頭を
かかえてたので参考になります。

275:デフォルトの名無しさん
09/02/01 00:16:38
>>273
や、今のところ、「JComponentのサブクラス作って、その上にマウスで
Rectangleが描けるようにナッター\(゚∀゚)/」というレベルなので……。

その先に進もうとして、「これをつかんで移動させたり変形させたりしよう
と思ったら、図形もJComponentのサブクラスにした方がええんちゃうか?」
というのが質問の発端です。

276:デフォルトの名無しさん
09/02/01 00:37:47
JDrafterを参考にするといいかも

277:デフォルトの名無しさん
09/02/01 01:09:59
>>276
宣伝乙。

278:デフォルトの名無しさん
09/02/01 01:36:34
いや、宣伝じゃないよ
あれは素直にすごいだろ
jadで十分読めるから読んでごらん

279:デフォルトの名無しさん
09/02/01 02:05:58
スプラッシュなんてちゃんと見ないからどうでも良いな。
むしろ消せるオプションを標準実装にして欲しいくらいだ。気持ち程度、余計な事をしない分、起動が速く成るだろうし。


窓は融通が利くけど、マクはマクらしいとアポーが決めてるアプリの使い方しか出来ないように強制されてるのが嫌。
俺が買ったものくらい自由に使わせろって。

280:デフォルトの名無しさん
09/02/02 00:12:19
>>240
既存のフロントエンドをSwingに移行させるんなら
そこそこ市民権を得そう。

281:デフォルトの名無しさん
09/02/02 05:31:37
>>279
JavaSE6の機能でスプラッシュ出してるなら、起動速度は変わらない

282:デフォルトの名無しさん
09/02/02 12:00:55
つかスプラッシュ消えるの速すぎてタイトル嫁ねえw
一定以上の時間指定したい

283:デフォルトの名無しさん
09/02/02 12:12:28
起動をもっさり遅くすればいいんじゃね?

起動すればソフトのタイトル見えるんだし、わざわざ邪魔なスプラッシュ表示しとく意味ねえよ

284:デフォルトの名無しさん
09/02/02 13:38:01
java6のスプラッシュはVM起動時に表示されるんであってアプリ起動時に表示される訳じゃないからアプリをもっさりさせても意味ないよ。

285:デフォルトの名無しさん
09/02/02 13:40:56
まじかよw

スプラッシュって起動中だからちょっとまっててな。ってニュアンスが一番よさげなのにw

286:デフォルトの名無しさん
09/02/02 13:44:23
きっとスレ違いでは無いはず・・・。

#include<gcj/cni.h>
#include<javax/swing/JFrame.h>
#include<javax/swing/JButton.h>
#define JS(str) ::JvNewStringUTF(str)
int main(void)
{
 ::JvCreateJavaVM(NULL);
 ::JvAttachCurrentThread(NULL,NULL);
 {
  JFrame *frame=new JFrame(msg);

  frame->add(new JButton(JS("Okey")));
  frame->setDefaultCloseOperation(JFrame::EXIT_ON_CLOSE);
  frame->pack();
  frame->setVisible(true);
 }
 ::JvDetachCurrentThread();
 return 0;
}

JFrameが表示された後、即main関数を脱出してしまう。
当然といえば当然だが、これを上手いこと防ぐ方法は無いか?

287:デフォルトの名無しさん
09/02/02 15:02:38
frame->setVisible(true);の後ろに↓を足したらいいんじゃね?

try {
while (frame->isVisible()) {
Thread->sleep(1000);
}
} catch (InterruptedException e) {
// 華麗にスルー
}


288:デフォルトの名無しさん
09/02/02 20:39:52
>>282
Frameの表示を遅らせれば?

289:デフォルトの名無しさん
09/02/02 22:08:46
>>287
スレッドで分離する方法とかもあるんだけど、
定石的な方法は無いだろうか?

>>288
どういう事?いまいち想像が付かないが。

290:デフォルトの名無しさん
09/02/02 22:24:38
>>289
普通にjavaだけでやる分には、main抜けても問題ないからわかんないっす。

そして、俺も助けて欲しいことが。

URLリンク(sandalman-no-blog2.blogspot.com)
ここのソースなんだけど。

JTree内でDnDすると、ツリーが閉じてしまうんだ。
JTreeの以外からドラッグしたのをJTreeにドロップする分には閉じない。

JTreeからJTreeにDnDするとドロップされた側が閉じてしまう。
わけわかんねーっす、誰か助けて。

291:290
09/02/02 22:39:56
自己解決したっす。

// node.removeFromParent();
((DefaultTreeModel)tree.getModel()).removeNodeFromParent(node);
// ((DefaultTreeModel) tree.getModel()).reload();

292:290
09/02/02 22:41:26
途中送信orz

node.removeFromParent();
((DefaultTreeModel) tree.getModel()).reload();



// node.removeFromParent();
((DefaultTreeModel)tree.getModel()).removeNodeFromParent(node);
// ((DefaultTreeModel) tree.getModel()).reload();

こうしたら閉じなくなったっす。

node.removeFromParent();ってなんか使いにくいんですかね?

293:デフォルトの名無しさん
09/02/03 04:35:28
ほんとに助けてほしいなら、わかんねーすっとかムカつく言葉遣いやめておいたほうがいいな。

294:デフォルトの名無しさん
09/02/03 09:55:01
別スレの空気嫁とかいいながら煽る人よりは

295:288
09/02/03 14:44:18
>>289
スプラッシュが消えるのはFrame等が表示されるまでだから。
下のを-splash:temp.pngとかで適当にスプラッシュ表示させてみ。

import javax.swing.*;
public class SplashTest {
public static void main(String[] args) throws Exception {
Thread.sleep(5000);

SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame();
frame.add(new JLabel("てすと"));
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}

296:デフォルトの名無しさん
09/02/05 19:47:24
というか、スプラッシュの表示時に表示したい時間分、sleepすれば
いいだけなんだけどな。

297:デフォルトの名無しさん
09/02/05 21:28:43
そのスプラッシュ超いlらないなw

298:デフォルトの名無しさん
09/02/05 21:36:09
5分ぐらいスリープしとくとちょうどいいんじゃないかな

299:デフォルトの名無しさん
09/02/05 23:08:46
どん兵食うのにか?

300:デフォルトの名無しさん
09/02/05 23:20:25
それだ!
スプラッシュにラーメンタイマー機能をつければいい!!

で、何の話だっけ?

301:デフォルトの名無しさん
09/02/06 02:12:04
どんべえも最近は3分じゃねぇの?ってとこまでは読んだ。

302:デフォルトの名無しさん
09/02/06 02:15:24
5分か3分か選べるオプションをつければ完璧という事は魂で理解できた

303:デフォルトの名無しさん
09/02/06 02:18:00
ていうか、スプラッシュに「閉じる」ボタンがあれば誰も困らないのに…

304:デフォルトの名無しさん
09/02/06 04:22:44
スプラッシュが閉じるときに、音を鳴らす必要があるな。

305:デフォルトの名無しさん
09/02/06 20:05:07
蓋を閉めてジャヴァアプリを起動する必要があるけどな。

306:デフォルトの名無しさん
09/02/06 23:02:17
4分を舐めると火傷するぜ・・・

307:デフォルトの名無しさん
09/02/06 23:04:42
>>306
頭使えよ

5分設定で起動してから1分後にお湯を入れればいいんだ

308:デフォルトの名無しさん
09/02/06 23:19:52
じゃあ1分くらい用意してくれよ

309:デフォルトの名無しさん
09/02/07 18:06:37
URLリンク(www.cupnoodle.jp)
もうお前らこれ使えよ…

310:デフォルトの名無しさん
09/02/07 18:27:57
これじゃスプラッシュでないじゃん

311:デフォルトの名無しさん
09/02/07 19:01:30
すみませんが、質問させてください。
Swing Application Frameworkをバリバリ使ってます、方ってこのスレでいますでしょうか?

創るJavaでJavaを再学習しているのですが、実際のアプリSwingだといろいろ管理が面倒だな、と思っていたときに
上記のフレームワーク見つけたのですが、1.03になってもあまり流行っている感じがなかったので
問題があったのかぁ、と思ったので・・・・

使っている方で、「この辺が便利だよ」、とか「これが使えない」とかありましたら教えていただけないでしょうか?

312:デフォルトの名無しさん
09/02/07 19:57:39
>>311
使ってないけど、J2SE7に含まれるらしいよ
けど誰か忘れてたけどアプリケーションクラスがシングルトンになってる時点でだめだとか書いてたような・・・

313:デフォルトの名無しさん
09/02/07 23:27:34
ポップアップメニューのsetLightWeightPopupEnabledに相当するメソッドは
JMenuにはないでしょうか?

ポップアップメニューにJMenu追加して分岐させたら、
分岐させたメニューが表示できませんでしたw

setLightWeightPopupEnabled使わないとポップアップメニューを出せないような作りが悪いのかもしれませんが。
もしあったら教えてください。

314:デフォルトの名無しさん
09/02/07 23:41:38
>>313
JMenu#getPopupMenu() で取ってきたポップアップメニューに setLightWeightPopupEnabled

315:デフォルトの名無しさん
09/02/07 23:47:57
>>313
どう考えてもSwingの描画ぶっ壊してるから他の部分でも見えてないだけで問題があるかと。

316:デフォルトの名無しさん
09/02/08 00:01:10
>>315
はい、継承してコネコネしてるJLabelの上だとポップアップメニューがでないんです。
いつか直さないと。

>>314
ありがとうございます。
JMenuの中にpopupMenuがあって気になってましたが、それでいけそうな気がします。

317:デフォルトの名無しさん
09/02/08 00:35:27
>>314
めでたく上手くいきました。
ありがとうございました。

318:デフォルトの名無しさん
09/02/09 17:16:44
アプリケーション終了時に、ウィンドウの位置とサイズを記憶したいです。(次の起動時に復元するため)

この時、最大化した状態で終了すると、元に戻すボタンを押した時のサイズを取得できません。
この元の位置(できればサイズも)を最大化してる状態で取得する方法はないでしょうか?

※自分でやった事
ComponentAdapter#componentMovedを使って、
getExtendedState() == NORMALの時に位置を記憶させてみたものの、
最大化した時にgetExtendedStateがNORMALの状態で動いてしまい、
位置を-4,-4で記憶してしまいます。

マルチモニタでも動かしたいため、0以下の値を弾くわけに行かなくて困っています。

componentResizedが動く時はgetExtendedState() == MAXIMIZED_BOTHになっているため、
サイズはなんとか記憶させることができました。

319:デフォルトの名無しさん
09/02/09 18:12:18
EDTの簡単な取得方法はありませんでしょうか?

320:デフォルトの名無しさん
09/02/09 20:23:34
6u12でAWTとSwingの限定的な混在がサポートされたな。

321:デフォルトの名無しさん
09/02/09 21:02:12
>>319
EDTを取得して何すんの?
↓でできるけど

import javax.swing.SwingUtilities;

public class GetEDT {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
//↓こいつがEDT
Thread edt = Thread.currentThread();
System.out.println(edt);
}
});
}
}


322:デフォルトの名無しさん
09/02/09 21:27:51
>>321
それは分かりますが、単純にEDTが走ってればそれを返して、動いてなければnullみたいなのがありそうだなーと思っただけです。
確かに用途は少ないですね。
Thread#setUncaughtExceptionHandler()をEDTに設定したかったのですが、すでに取得する方法があればそれを使用しようと質問しました。
わざわざくだらない質問に答えていただきありがとうございました。

323:デフォルトの名無しさん
09/02/09 23:04:02
>>322
URLリンク(java.sun.com)()
URLリンク(java.sun.com)()


324:デフォルトの名無しさん
09/02/10 00:58:11
>>312
OpenSwingはどうなん?


325:デフォルトの名無しさん
09/02/10 14:02:26
>>323
それAWTのシステムキューだろ。

326:デフォルトの名無しさん
09/02/10 18:23:34
JTextComponent でスペースバーが押されたらアクションを実行し、
その際空白文字は入力されないようにしたいのですが、
以下のようなやり方(いちおう動く)でよいのでしょうか?
もっと一般的な方法はあるでしょうか?

Keymap keymap = textComponent.getKeymap();

// スペースバーにアクションをマッピング
KeyStroke stroke = KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0);
keymap.addActionForKeyStroke(stroke, action);

// スペースバーが押されても空白文字が入力されないようにする
keymap.setDefaultAction(new DefaultEditorKit.DefaultKeyTypedAction() {
    @Override public void actionPerformed(ActionEvent ae) {
      String cmd = ae.getActionCommand();
      if (!cmd.equals(" ")) {
        super.actionPerformed(ae);
      }
    }
  } );


327:デフォルトの名無しさん
09/02/10 20:08:46
>>326

コピペでスペースが入ってきてもやっぱり弾くのかな。
ならばjavax.swing.text.DocumentFilterで弾くのが楽じゃない?

328:sage
09/02/10 21:13:11
>>326
Documentに、特定の文字列が挿入されるのを防ぐ場合には、通常DocumentFilterを使う。

Documentにスペースが挿入されても構わなくて、キーボードからの入力のみフィルタするなら、
KeyListenerを使ったり、processKeyEvent(),processKeyBinding()等をオーバーライドして
実装することもできるけど、いずれもコードが汚くなるから、326の処理でいいと思う。

あとは、瑣末な問題だけど、個人的には、ActionEvent#getActionCommand()の戻り値が
nullでないとは規定されてないから、if (!cmd.equals(" ")) を!" ".equals(cmd)にするか、
if (cmd != null && !cmd.equals(" "))に変更するぐらいかな。

329:デフォルトの名無しさん
09/02/10 23:12:34
>>326
おれが作るならばDefaultKeyTypedActionの継承はしないで
keymap.getDefaultAction()して保存おいてスペース以外ときは
そっちに移譲するようなActionにするかもしれない。なんとなく。

330:デフォルトの名無しさん
09/02/10 23:25:06
>>325
URLリンク(java.sun.com)()
> 現在のスレッドが AWT イベントディスパッチスレッドの場合に true を
> 返します。JDK Version 1.3 以降、このメソッドは
> java.awt.EventQueue.isDispatchThread() を呼び出すだけです。

なので、EDTの判定に用いるのは間違いじゃない。

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

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