Java低速GUI Swing 5 ..
[2ch|▼Menu]
53:デフォルトの名無しさん
06/11/04 00:43:50
質問なのですが
URLリンク(www.gremlin.jp)

↑のアプレットみたいに、ウィンドウサイズを変えたら、そのウィンドウと同じサイズにJTable
をリサイズするにはどうしたらいいのでしょうか?
ComponentListenerを使うのでしょうか?

54:デフォルトの名無しさん
06/11/04 01:04:21
>>53
よくわかんないけど、普通に貼り付ければこうなるんじゃないんだっけ?
BorderLayoutでCenterに配置するとか。

55:53
06/11/04 01:41:03
普通に貼り付けただけだど、JTableがリサイズされないで、JFrameの大きさだけが
変わってしまいます…

ウィンドウサイズと同じサイズにリサイズさせたいのですが、そのやり方わからなくて…

56:デフォルトの名無しさん
06/11/04 01:45:56
>>55
レイアウトマネージャをどう使っているか次第。
NullLayoutなどだと、座標で配置されているから、ロジック書かないとリサイズはされない。

>>54が書いているように、BorderLayoutでCenterに配置するのが普通。


57:53
06/11/04 10:32:33
>>54,56さん

ありがとうございまいた。私の知識不足でした。レイアウトマネージャをBorderLayoutにして
CENTERに配置すればできました。

できなかった理由としてFlowLayoutとGridLayoutを使っていたためだと思われます。
レイアウトマネージャについて勉強してきます。

ありがとうございました。

58:デフォルトの名無しさん
06/11/04 11:49:30
NetBeans使うというのも手

59:デフォルトの名無しさん
06/11/04 12:58:25
ネット上のxxxx.jpgなどの画像ファイルをGUIに表示させることって出来ますか?

60:デフォルトの名無しさん
06/11/04 13:02:45
URLクラスからopenStreamすればいいよ

61:デフォルトの名無しさん
06/11/04 13:05:08
とおもったが別にImageIO.readはURLをそのまま受け取れたなw

62:デフォルトの名無しさん
06/11/04 14:44:06
表示させるだけでいいなら、JLabelでHTML書けばOK。

63:デフォルトの名無しさん
06/11/04 14:49:38
JavaのHTMLってどこまで準拠してんの?

64:デフォルトの名無しさん
06/11/04 15:11:41
あんまり知らないけど、信用してはいけないことは知ってる。
実装がかなり前に止まっているとか。

65:デフォルトの名無しさん
06/11/04 16:26:11
Swingアプリで、「HTMLのテーブルみたく表示したいんだけど。」
と聞かれて、面倒くさいから、「setTextでHTMLをセットするとOK」と答えた。

で、setTextするための、HTMLを文字列でセッセと作っていたのが、そのうち
Velocityで雛形作って、セットするようになっていた。

ほとんど、Webアプリ

そのうち、IEだと、こう表示されるのが、うまくいかないとか言われそう。

66:デフォルトの名無しさん
06/11/04 16:38:25
JEditorPane#setText()したものを、HTML表示にすることってできます?
バージョン情報を表示するに、書式をいろいろ変更して使いたかったんですけど、
なんかHTMLがそのまま表示されます。
ファイルにしてsetPage()使わないとダメなのかな。。
仕方ないので、今はJTextPaneを使って、ちまちま書式設定して出してます。

67:デフォルトの名無しさん
06/11/04 17:00:17
>>43
URLリンク(java.sun.com)

68:デフォルトの名無しさん
06/11/04 17:05:30
>>66
自己レス。JEditorPane#setContentType("text/html")を使えばいいのね。

69:デフォルトの名無しさん
06/11/04 22:17:17
質問です。
JTableの1行目のcolumnを1列目に縦に表示するには、どうすればよいのでしょうか?

70:デフォルトの名無しさん
06/11/04 22:59:45
>>69
意味不明。

71:69
06/11/04 23:09:15
>>70
すいません。
エクセルみたいに行番号(1,2,3..)列名(A,B,C...)のような表示をつくりたいのですが…

72:デフォルトの名無しさん
06/11/04 23:10:18
>>69>>71の内容につながりが見当たらない件。

73:デフォルトの名無しさん
06/11/04 23:18:16
列ヘッダ(A,B,C...)は、普通にJTableにある機能でできる。
分からなければ、JTable自体を基礎から勉強すべし
URLリンク(java.sun.com)

行ヘッダ(1,2,3...)は、JTableにはそんな機能ないから、それっぽく見せる実装をしなければならない。
>>5にある、為政氏のサンプルにある。
URLリンク(www.crionics.com)


74:69
06/11/04 23:30:21
>>73

JTableにはもともとないんですね…
サンプル大変参考になりました。

ありがとうございました。

75:デフォルトの名無しさん
06/11/05 22:21:18
なんか質問な〜い?ただいまSwing勉強中。

76:デフォルトの名無しさん
06/11/06 00:33:11
>>75
システムフックの方法が知りたいけどSwingの話題じゃないので黙っておく

77:デフォルトの名無しさん
06/11/06 00:44:13
質問
フォーカストラバーサルサイクルルートについて詳しく

78:デフォルトの名無しさん
06/11/06 09:04:51
>>77
初耳だ。ちらっと見た感じだと、
TABを押した時なんかの、
次にフォーカスを与えるコンポーネントを探すクラスかな?
今まで使う場面が出たことがないけど、
FocusTraversalPolicyを継承してクラスを作れば、
コンポーネントの値とかでも順序を付けられたりするみたい。
質問が具体的なら、もう少し調べてもいいが。

79:デフォルトの名無しさん
06/11/06 13:27:23
JTableの中のセルにJPanelいれたときとかこれいじらんとだめだよな

80:デフォルトの名無しさん
06/11/06 19:38:24
>>78
具体的じゃないけど便乗で
5.0 -> 6.0 でフォーカス関係で変わった事ってまとめてるとこないかな?
5じゃ動いてたコードが6で動かなくなっちゃったから・・・

81:デフォルトの名無しさん
06/11/06 19:54:29
>>79
なるほど。

>>80
ごめんなさい、わかりません。
思ったとおりにリスナーが呼ばれないとか、そんな感じですか?

82:デフォルトの名無しさん
06/11/06 22:00:45
>>80
まじか
そのへんまではまだ詳しく調べてないけど困るな
正式版が出たらチェックしようという状態だったがSwingに大幅に手が入ってるのなら別だ
Sunなにやってるんだよ〜
1秒でわかるSwingのバグつきを夏にリリースしてたし

まぁ5.0でJavaSoundの挙動が大幅に変更されたりとか
日本語印刷が通らないあたりでおかしい気はしたが

83:デフォルトの名無しさん
06/11/06 22:14:34
>>82
今日たまたまJavaで印刷のサンプル動かしたら、
DocFlavor.INPUT_STREAM.AUTOSENSE を使わないと、テキストが印刷できなかった。
しかも日本語文字化けしてるし。これは当たり前?5.0から?
TEXT_PLAIN_HOSTとかいろいろ試したけど、こっちはエラーが出た。
あと、印刷が終わっても、紙が排出されないんだけど、最後に何かする必要あります?
今は、DocPrintJob#print(○,○); で終わってます。

なんか印刷大変そうだなぁ。。。

84:デフォルトの名無しさん
06/11/06 22:37:08
>>83
それはどのVMで動かした話?

85:デフォルトの名無しさん
06/11/06 22:50:17
>>84
5.0での出来事でした。下の記事を参考にしました。
URLリンク(java.sun.com)

86:デフォルトの名無しさん
06/11/06 23:20:31
質問です。
JLabel→JLabelのようにJLabelからJLabelへ矢印を表示するには
どうすればよいのでしょうか?

87:デフォルトの名無しさん
06/11/06 23:26:22
>>86
質問の意味がわかりませんが。。。
とりあえず「→」を書きたいなら、
真ん中に「→」を書いたJLabelを置いてみれば?矢印の画像でもいいけど。
もし矢印が長かったり、角度が中途半端なのであれば、drawLineで自分で書く。

88:デフォルトの名無しさん
06/11/06 23:41:13
>>85
updateナンボかが問題

89:86
06/11/06 23:44:14
>>87さん
配置してあるJLabelどうしを矢印で結んだ図を表示させたかったのですが
そういった場合は自分で書くしかないんでしょうか?
JLabelの位置を計算して、矢印を表示することはできないんでしょうか?
よろしくおねがいします。

90:デフォルトの名無しさん
06/11/07 00:13:12
>>83
印刷APIはサービスが追加されたけど、今までのも動くよ
ただし、日本語問題が解決されたのは今年の春くらいのバージョンから
1.5年ほど日本語バグは放置されていた

そしてそのバグが直ったと思ったらSwingにバグがついたというわけだ
正確にはWindows版のLAFだけだからすべてではないがWindowsって一番ユーザー多いから影響もでかい、と
NetBeans立ち上げればおかしいのはすぐにわかるはずなのにそれに気がつかなかったSunちね

91:デフォルトの名無しさん
06/11/07 01:12:43
>>89
なんだかんだとコンポーネントが追加されてるJPanel上の特定のJLabel間に線引きたいって事?

それならJLabelをaddするときに線を引きたいJLabelだけのコレクションを別に持っておいて自分で矢印を描画しないとだめだね。
常に次ぎが右横とか規則があるならJLabel継承した横に矢印付け足す描画をするJLabelWithArrowとかでもいいのだろうけど。


92:デフォルトの名無しさん
06/11/07 02:24:57
>>89
噂では、JLabelなんか使わないで、全部自分で描いた方がラクだって話もあるよ。

93:デフォルトの名無しさん
06/11/07 04:40:58
SWT だとなんかそういう軽量コンポーネントがある。

94:デフォルトの名無しさん
06/11/07 07:48:31
>>86
グラフ書きたいなら、JGraphとかSWTのdraw2dとか使った方が楽だよ。
URLリンク(www.jgraph.com)
URLリンク(www13.plala.or.jp)
グラフって言っても、XYグラフのグラフじゃなくてグラフ理論のグラフだからね。

95:デフォルトの名無しさん
06/11/07 09:35:29
>>94
JGraphなんてものがあるのか。知らなかった。
LGPLの他に商用ライセンスがあえてあるってことは、商用で使う場合はお金かかる?
無知なので質問ですが、SwingとSWTって混ぜて使ったりするの?
水と油だと思っているのですが。。。

96:デフォルトの名無しさん
06/11/07 12:30:07
>>95
JGraphは商用利用も含めてフリー。LGPLだし。
一方JGraph Layout Pro というのがあって、JGraphの高機能版。こっちは有料。
JGraphだとノードの自動レイアウトが出来なかったりと、いろいろ不便。
他にもこういうのもあるけどね。
URLリンク(openjgraph.sourceforge.net)
こっちならレイアウトできたり、グラフに制約(巡回不可とか)かけられたりできる。
ただ、開発が4年以上止まっているけど。

97:デフォルトの名無しさん
06/11/07 12:35:17
自前で描画しとけ


98:86
06/11/07 15:37:54
>>91さん
規則性はないので、その際は手作業なんですね…
ありがとうございました。

>>92さん
それは
URLリンク(homepage1.nifty.com)
このページにあるQ8.6にも、書いてある通り描く方がいいてことでしょうか?

>>93さん
SWTではあるのですか…

>>94さん
JGraphというのがあるのですね!これについて調べてみようと思います。
表示したいのはちょうど、グラフ理論を使ったものなのでぴったりだと思います。

皆さんありがとうございました。
Java2DかJava3Dで描画しなきゃいけないかもって思ってました。それ以外の方法もあるのですね。

99:96
06/11/07 16:09:10
JGraph使うのなら、標準の機能ではレイアウトできないことを覚悟しておかないと
後でハマるよ。
ここでいうレイアウト機能ってのは、適当にノード並べてエッジ引いた後で、
ボタン1クリックでノードやエッジの位置を設定し直してくれる機能。
俺の場合、SWTのdraw2dで提供されてるレイアウト機能だけ使って
強引に何とかしたけど。

100:デフォルトの名無しさん
06/11/07 16:52:14
グラフ/ネットワーク構造の描画コンポーネントが欲しいんならJGraph以外にもいくつかある
URLリンク(jung.sourceforge.net)
URLリンク(www.nanoworks.nl)
デモとかサンプル見て好きなの使ってくれ.

101:96
06/11/07 17:12:49
>>100
いつの間にか、JUNGが使えるライブラリになってるね。
2年前にこの手のライブラリについて調べてたんだけど、
当時のJUNGはグラフの編集機能がなくて、使うのをあきらめた覚えがある。

102:デフォルトの名無しさん
06/11/07 17:29:39
>>101
4年前に全部自前でやった事がある。
あの頃と比べたらオープンソースなライブラリがよりどり緑でありがたい。


103:86
06/11/07 18:31:17
>>99さん
ご忠告ありがとうございます。

104:デフォルトの名無しさん
06/11/07 23:24:14
>>98
別にSwingでもNetbeansには普通にそういうモデリング描画用
ライブラリはあるわけだが。Graph Libraryというのがね。

105:デフォルトの名無しさん
06/11/08 00:36:43
Graph Libraryは、NetBeansのほかのライブラリに依存してるから、NetBeansの外で使うのはきついよ。
NetBeansプラットフォームで作っちゃえばいいんだけど。

106:デフォルトの名無しさん
06/11/08 00:37:44
Javaがどんなに疎結合を頑張っても、IDEがそれを否定するのな

107:デフォルトの名無しさん
06/11/08 01:17:29
疎結合っていうのは、業務アプリの各画面を独立させましょうという程度でしかないからな。
GUIのひとつの画面は、どうしても密結合になる。

108:デフォルトの名無しさん
06/11/10 01:04:36
jarファイルを実行したとき、そのjarファイルが置かれているディレクトリの
パスを取得するにはどうしたらよいでしょうか?


109:デフォルトの名無しさん
06/11/10 01:32:48
>>108
クラスパスルートがたくさんある場合はどう解釈するの?

110:デフォルトの名無しさん
06/11/10 01:42:27
>>108
実行時のディレクトリを知りたいのかな?
String path;
path = new File(".").getAbsolutePath();
とか。

111:デフォルトの名無しさん
06/11/10 01:58:03
>>110
それなら、System.getProperty("user.dir")の方がよくね?


112:デフォルトの名無しさん
06/11/10 21:50:28
設定ファイルをjarと同じディレクトリに置きたいんだよ。
フォルダごと移動させれば他のPCに環境をそのまま移せるように。
設定ファイル以外にもいろいろ置きたいからjarのパスが知りたい。

113:108
06/11/10 23:31:12
皆様ありがとうございました。
jarファイルを実行したときに、jarファイルと同じディレクトリにあるファイルで
拡張子が.zzzのもので、最終更新日が最新のものを自動的に読み込むという処理が
必要で、上記のような質問をさせて頂きました。

解決致しましたので、ご報告致します。
File f = new File(".") ;
String[ ] files = f.list( ) ;

これで実行ディレクトリのファイル一覧を配列に取得することができました。
ありがとうございました。

114:デフォルトの名無しさん
06/11/10 23:40:31
そのやり方は本当は危険なんだけどね。

115:デフォルトの名無しさん
06/11/10 23:42:23
OS(というかVM)に依存するんだよね。


116:デフォルトの名無しさん
06/11/10 23:48:06
GUIアプリならコマンドラインで打つようなことも無いのかな?
俺なら保険的に<md5>.md5みたいなファイル用意して
確実に実行元がカレントディレクトリである必要があるようにするかも

117:デフォルトの名無しさん
06/11/11 04:15:14
>>108
亀レスだけど、System.getProperty("java.class.path")
sunのVM限定だと思う。
他の方法としてはJARファイル内にリソースを格納して、
this.getClass().getClassLoader()#getResourceでURLを取得するとか。

118:デフォルトの名無しさん
06/11/11 09:24:40
>>117
java.lang.System#getProperties()のjavadocに明記されてるし、
J2SE5.0の仕様の上ではVMによらず使用可能とみていいんじゃないかな。

119:デフォルトの名無しさん
06/11/11 16:24:32
resources などというディレクトリを作ってそこにクラスパスを通し、
そこに設定ファイルを置いてファイルを取得

120:デフォルトの名無しさん
06/11/11 17:20:18
resources などというディレクトリはどこに作られるのかと。
jarと同じディレクトリに作りたいでしょ?
でも、いちいちクラスパス通したくない。ではjarのパスはどこ?
というお話し。

121:デフォルトの名無しさん
06/11/11 17:31:55
jar ファイルを実行、とあることから、
関連するライブラリなどへのクラスパスは jar ファイルのマニュフェストに記述されると勝手に推測。
そこに resources への相対パスも追加すればいいんじゃまいかと思ったが
そもそも読み込むファイル名は決まっていないのね。

122:デフォルトの名無しさん
06/11/11 18:22:59
俺がこれまで使ったJavaにおける設定ファイルの設計はこんなもんかな。

1.CLASSPATHから読み込む方法。
一番安易だが、配置に柔軟性が乏しい。

2.環境変数XXXX_HOMEを設定させる方法
起動スクリプトや実行ファイル内で設定取得されることが多い。
Java 5から環境変数の取得が復活しているので、Java内で取得可能になった。
CLASSPATHによらず、自由に構成管理できる。(XXX/conf/配下等)
広く使われており、JAVA_HOME. ANT_HOMEなど実例多数。

3.ユーザのホームディレクトリからの相対パスを利用する方法
複数のユーザで使うソフトウェアに適する。
Windowsの場合、ApplicationData/XXX配下、Unixの場合.xxx/配下などが使われる。プログラマが構成をデザインしないといけない。

4.Preferences APIを使う方法
Java 5から提供される標準API。
実体は、Winはレジストリ、Unixは.java配下に作られるが、API利用者は意識する必要がない。

123:122
06/11/11 18:42:23
追加

5.カレントディレクトリと1.の併用
log4jなどいくつかのソフトウェアで採用されている。
ツール系は、テンポラリに設定を変えたい時があるので、
この方法は便利。

結局、作成するアプリの性質によってどうデザインするか変わってくるよ。

124:デフォルトの名無しさん
06/11/11 18:44:20
Swingとまったく関係がないことについて

125:デフォルトの名無しさん
06/11/11 18:50:01
まったくってことはないな。直接は関係ないが、。
誰だよ、スレ違いの質問投げた奴は。

126:デフォルトの名無しさん
06/11/11 18:53:04
よーし、おねえさん、がんばってSwingしちゃうわよー

127:デフォルトの名無しさん
06/11/11 19:03:57
スイングスイング二木ゴルフっすか?>>126


128:デフォルトの名無しさん
06/11/11 19:15:22
もう少し書こうかと思ったけどスレ違いじゃ仕方ないな。

129:デフォルトの名無しさん
06/11/12 13:58:33
URLリンク(www.uploda.org)

これがふつー?だったらjavaやめる。
2000で1_4_2です。
ただフレームを表示するだけでも同じ症状がでるのですが。

130:デフォルトの名無しさん
06/11/12 14:03:06
あきらかに異常だね

131:デフォルトの名無しさん
06/11/12 14:11:35
>>130
やっぱりそうなのか。
thx

PCが悪いのかな?

132:デフォルトの名無しさん
06/11/12 14:31:17
ソース

133:デフォルトの名無しさん
06/11/12 14:38:42
javaってvistaでも使える?

134:デフォルトの名無しさん
06/11/12 15:05:15
>>132
import javax.swing.*;
import java.io.*;
import java.awt.Container;
import java.awt.*;

class TinyMemo {
JFrame frame;Container com;
TinyMemo(){
framereset();com = frame.getContentPane();
Paneles paneles = new Paneles();com.add(paneles.getBar(),BorderLayout.NORTH);
JTextArea text = new JTextArea();com.add(text,BorderLayout.CENTER);frame.setVisible(true);
}
private void framereset(){
frame = new JFrame("メモ帳");frame.setSize(300,400);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args){TinyMemo tiny = new TinyMemo();}
}
class Paneles extends JPanel {
JMenu menu;JMenuBar menubar;
JMenuItem save;JMenuItem read;JMenuItem delete;
Paneles(){
menu = new JMenu("nya");menubar = new JMenuBar();
delete = new JMenuItem("delete");save = new JMenuItem("save");read = new JMenuItem("read");menubar.add(menu);
menu.add(delete);menu.add(save);menu.add(read);
}
JMenuBar getBar(){return menubar;}
}

こんなもんソースいらんだろ思ってさらさんかったんだが
色々変わってたりついてるけ症状はそんままだからこれで
改行が多すぎる言われまくったからかえたらすげーよみにくい。

135:デフォルトの名無しさん
06/11/12 16:24:14
>>134
まだ初心者か?
Swingにはメニューバー用の専用メソッドがあるよ
他にもクラス設計など指摘したいところがたくさんあるがまあいいか

136:デフォルトの名無しさん
06/11/12 22:03:15
>>134
最低限、改行して見やすいコードをさらせ。

137:デフォルトの名無しさん
06/11/12 23:04:37
>>134
frame.setJMenuBar()
URLリンク(sdc.sun.co.jp)(javax.swing.JMenuBar)

138:デフォルトの名無しさん
06/11/13 11:11:58
>>135,137
わ、サンクス!
わざわざありがとうございます。
>>136
改行多すぎる言われて修正しまくってこんなんなってしまったんです。orz
最初は普通だったのに。


139:デフォルトの名無しさん
06/11/14 15:51:02
>>138
2レスに分割するか、
レス消費に気を配っているorかなり長いソースの場合はアップローダを利用。

140:デフォルトの名無しさん
06/11/15 00:13:45
BOCのSpreadみたいなコンポーネントはないのですか?
JTableの縦横にヘッダがあってExcelみたいな感じのやつ。

141:デフォルトの名無しさん
06/11/15 11:37:56
JSplitPaneで、初めに片方を閉じておくことってできます?
JSplitPane#setDividerLocation(9999)とか無理矢理やればできるのですが、
一応できるのですが、キレイな方法で。

JSplitPane#getMaximumDividerLocation()で値を取得して、
それを設定する方法も試しましたが、
フレームが起動するまでは正しい値が取得できないんですかね。ダメでした。

142:デフォルトの名無しさん
06/11/15 13:29:10
>>141
JSplitPane#setDividerLocation(Integer.MAX_VALUE) とかやっとけば

143:デフォルトの名無しさん
06/11/15 14:00:41
>>141
pack()読んだ時点で確定されない?

144:141
06/11/15 15:48:34
>>142
9999よりかはキレイですね。こっちにしておきます。どうもです。

>>143
pack()は使ってないので、フレームを表示するので確定しないようです。

145:デフォルトの名無しさん
06/11/15 17:23:54
SwingつかうならPackは必須だと思うのだが

146:デフォルトの名無しさん
06/11/15 17:50:42
pack()だけじゃサイズが確定できないレイアウトもあったような。
setPrefferedSize()とかJFrame#setSize()とかしないと、親コンポーネントが最小サイズになったり。

147:デフォルトの名無しさん
06/11/15 17:57:32
それレイアウトマネージャ勉強しろとしかいえない

148:デフォルトの名無しさん
06/11/15 19:39:12
マウスカーソルの絶対座標を簡単に取得する方法ってある?


149:デフォルトの名無しさん
06/11/15 19:55:30
>>148
java.awt.Point p = java.awt.MouseInfo.getPointerInfo().getLocation() ;
とか?1.5以降で.

150:デフォルトの名無しさん
06/11/15 19:59:26
さんきゅ!
助かったー!

151:148
06/11/15 20:00:35
>>149
さんきゅ!
助かったー!

152:デフォルトの名無しさん
06/11/19 19:51:47
質問です。
Java2DとSwingに関連する内容なのですが、
JPanalを継承したクラスを、JTabbedPaneにaddして、そのクラスのpaintメソッドで
Java2Dの描画を行っています。
そこで、
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
AffineTransform af = new AffineTransform();
g2.setTransform(af);
以下描画...
}
とすると、ウィンドウサイズを変更したり、再描画させたりした時に描画するものの位置がずれます。
具体的にいうと、jTabbedPaneのタブの大きさだけ描画した物が上に移動します。
原因を調べてみると、どうもAffineTransformオブジェクトをGraphics2Dに登録すると、
座標計算の基準点がタブに登録したJPanel派生クラスの領域の左上ではなく、
jTabbedPaneの領域(タブ表示域も含んだ)の左上に、再描画の時に変更になってしまうようなのです。

これはJavaランタイムのバグなのでしょうか。ちなみにJavaのバージョンは1.5.0_08です。

153:デフォルトの名無しさん
06/11/19 20:23:00
よくわからんが
paint()じゃなくて
paintComponent()をオーバーライドしなされ
あと1.5.0_08はSwingにバグがあるので1.5.0_09にしたほうがいい

154:デフォルトの名無しさん
06/11/20 09:59:06
>>152
問題が再現するコンパイル可能なソースを出した方がはやいと思うよ.

155:デフォルトの名無しさん
06/11/20 11:40:38
>>154
public class foo extends JApplet {
private JPanel jContentPane = null;
private JTabbedPane jTabbedPane = null;
private JPanel jPanel2 = null;
public foo() { super(); }
public void init() {
this.setContentPane(getJContentPane());
}
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
jContentPane.add(getJTabbedPane(), BorderLayout.CENTER);
}
return jContentPane;
}
private JTabbedPane getJTabbedPane() {
if (jTabbedPane == null) {
jTabbedPane = new JTabbedPane();
jTabbedPane.addTab("パネル2", null, getJPanel2(), null);
}
return jTabbedPane;
}
private JPanel getJPanel2() {
if (jPanel2 == null) {
jPanel2 = new Canvas();
jPanel2.setLayout(new GridBagLayout());
}
return jPanel2;
}
}

156:デフォルトの名無しさん
06/11/20 11:42:08
class Canvas extends JPanel {
public Canvas self = this;
public Canvas() {
this.addMouseListener(new MouseAdapter(){public void mouseClicked(MouseEvent arg0) {
self.repaint();
}});
}
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.clearRect(0, 0, this.getSize().width, this.getSize().height); //画面を一度クリア
AffineTransform af = new AffineTransform();
af.setToTranslation(100, 0);
g2.setTransform(af);
g2.draw(new Line2D.Float(10,50,20,50)); //x軸
}
}
こんなソースになります。マウスクリックすると短い横線の位置がタブの高さ分下に下がります。
ウィンドウサイズを変更すると元に戻り、またクリックすると位置が下がります。

157:デフォルトの名無しさん
06/11/20 21:00:04
>public Canvas self = this;
すまん,うけたw

158:デフォルトの名無しさん
06/11/20 21:35:16
>>155
//g2.setTransform(af);
g2.transform(af);
理由はAPI説明のGraphics2D#setTransformの項をよく読むこと。

ちなみに、内部クラスから外側のクラスのインスタンスを参照したいときは、
Canvas.this.repaint();
のように「外側のクラス名.this」と書けば、selfのように自分で持っていなくてもいい。
ただし、外側のクラスが匿名クラスの場合は名前がないため、この書き方はできないので、
別の手段が必要だが。その中にはself=thisのような方法もとりうる方法のひとつではある。

159:157
06/11/20 21:41:14
笑っただけだと悪いので… Canvas#paintComponent() を以下のように
すれば何が期待通りになって,かつ何が起きてるのかわかると思われ.
# 初回描画時とrepaintでの描画時の出力を比べてください.
public void paintComponent (Graphics g){
  Graphics2D g2 = (Graphics2D) g;
  AffineTransform originalTransform = g2.getTransform();
  System.out.println("translate (x, y) = ( " +
    originalTransform.getTranslateX() + ", " +
    originalTransform.getTranslateY() + ")");

  g2.clearRect (0, 0, this.getSize().width, this.getSize().height);
  originalTransform.translate(100, 0);
  g2.draw (new Line2D.Float (10, 50, 20, 50));
}


160:デフォルトの名無しさん
06/11/21 13:42:22
ありがとうございます!
次のようにしたら解決できました。
Graphics2D g2 = (Graphics2D)g;
g2.clearRect(0, 0, this.getSize().width, this.getSize().height); //画面を一度クリア
AffineTransform af = g2.getTransform();//new AffineTransform();
System.out.println("translate (x, y) = ( " +
af.getTranslateX() + ", " +
af.getTranslateY() + ")");
af.translate(100, 0);
System.out.println("translate (x, y) = ( " +
af.getTranslateX() + ", " +
af.getTranslateY() + ")");
g2.setTransform(af);
g2.draw(new Line2D.Float(10,50,20,50)); //x軸
タブにした状態などの色々な状況によって、Graphics2Dの変換行列が自動的に辻褄をあわせてくれていたんですね。
だからg2.getTransform();としてAffineTransformオブジェクトを取得してそれを使うべきで、
さらにそれ以後の座標変換も相対的な変換にすべきだったんですね。
よく分かりました。ありがとうございます。

161:デフォルトの名無しさん
06/11/21 13:51:45
それにしても、マウスクリックした時と初回描画時やウィンドウサイズを変えたりした時で描画領域の
原点の位置が変わってしまうなんて、Swingって妙な仕様ですね・・・。

162:デフォルトの名無しさん
06/11/21 16:39:27
>>161
なぜにそんなにsetTransformを使いたがるんだろうか。
setTransformはgetTransformで保存した元のコンテクストを、
描画終了時にリストアするときにだけ使うべきものとある。
描画時の座標変換にはtransform, rotate, scale, shearを使うだけでいい。
仕様が変というより、使い方が変だと思う。
変な使い方ができうるという点で仕様が悪いのかもしれないけど。

163:デフォルトの名無しさん
06/11/21 17:26:03
>>160
Graphics2D g2 = (Graphics2D)g;
g2.clearRect(0, 0, this.getSize().width, this.getSize().height); //画面を一度クリア
AffineTransform backup = g2.getTransform(); // backup
g2.translate(100, 0);
g2.draw(new Line2D.Float(10,50,20,50)); //x軸を描画
g2.setTransform(backup); // restore

164:デフォルトの名無しさん
06/11/21 18:03:15
>>162
そうですね。setTransformは今後控えます。
でもそれと関係なしに、マウスクリックした時と初回描画時orウィンドウサイズ変更時で描画領域の
原点位置が変わっていて、それをSwing(AWT?)がg2の変換行列を自動的に変えて無理やりつじつまを合わせている
というSwing(AWT?)の仕様がちょっと気になってしまいました。

165:デフォルトの名無しさん
06/11/24 18:35:49
高速GUIのスレがいつの間にかなくなっているな

166:デフォルトの名無しさん
06/11/24 21:30:27
HTMLの<table>のように理解しやすいレイアウトはないの?
GridBagLayoutでいいじゃんってのは止めてね。
コンポーネント間隔の割合比率(パーセント)を<table>のように
自動計算でやってくれたりすると楽なんだけど…

167:・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6
06/11/24 23:14:02
SWTも結局大して早くなかったし、最良のSWTがEclipse自身だもんな。

168:・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6
06/11/24 23:14:23
×SWTが
○SWTアプリが

169:デフォルトの名無しさん
06/11/24 23:47:52
>>166
割合ではないけどレイアウトマネージャほとんど理解しなくても使えるグループレイアウトは?


170:デフォルトの名無しさん
06/11/25 00:17:53
日本語でおk

171:デフォルトの名無しさん
06/11/25 01:22:34
>>166
XmlGridLayoutでも使ってみれば?

172:デフォルトの名無しさん
06/11/25 01:28:22
>>165
需要大してなかったみたいだし、仕方ないね・・・

それにSWTの質問がしたい人はプラグ印スレに行けばいいし、なくても問題ないだろ。
(つーかSWTやる人のほとんどはプラグ印用途な気もするが。)

173:デフォルトの名無しさん
06/11/25 06:03:06
Eclipseのプラグイン以外でSWT使うのはアホだな。
Eclipse RCPとか使ったりね。もうバカかと。

174:デフォルトの名無しさん
06/11/25 19:09:10
>>173
Eclipse RCPはそんなに悪く無いと思うがな
最近、RadRailsとかAptanaとか実際にそれなりに動くRCPアプリが結構出て来てるし
まあ、Eclipse RCPは実質Eclipseプラグインとほとんど変わらんのだが。

175:デフォルトの名無しさん
06/11/25 19:37:08
>>171
ありがたや。ありたがや。

176:デフォルトの名無しさん
06/11/27 10:33:18
画面デザインがベタベタなWindows以外許さない、
な案件だと仕方なくSWTで作ることになる・・・
と思いきや、Swingでプロトタイプ作って見せると
やっぱこれで良いですになる今日この頃。

177:デフォルトの名無しさん
06/11/27 20:32:43
あるあるwwww

178:デフォルトの名無しさん
06/11/30 02:43:56
JFrame上のJMenu、JMenuItem、等のフォントをまとめて(同じものに)設定するにはどうしたらいいでしょうか?


179:デフォルトの名無しさん
06/12/02 17:33:15
FontUIResource font = new FontUIResource(new Font(...));
UIManager.put("Menu.font", font);
UIManager.put("MenuItem.font", font);

180:デフォルトの名無しさん
06/12/03 16:15:58
>>179
ありがとうございました。

181:デフォルトの名無しさん
06/12/04 00:49:10
paintComponentとかpaintとかで、
いくつも矩形を描いて中に文字をいれたいんだけど、文字の長さや幅に応じて
自動的に矩形のサイズを調節したり、矩形の表示位置がウィンドウをはみだしたり
他の矩形と重なったりしないように表示位置を自動で調節してくれるようにしたい。
こういうのって相当むずかしいですか?

182:デフォルトの名無しさん
06/12/04 00:52:17
推奨サイズとかってわかる?

183:181
06/12/04 18:17:08
単語をいくつかならべてそれを矩形でかこみたいんですよ。
矩形の大きさは単語が矩形からはみださないように自動的に適切な大きさ計算して
描かれるようにしたい。

そういう単語が入っている矩形がこれまた何個も出したい。
矩形同士もお互い重ならないように自分で適切な位置を計算してそこに表示されてほしい。
そういうのって簡単にはできないのかな?


184:デフォルトの名無しさん
06/12/04 19:10:02
JLabelにボーダーつければ?

185:181
06/12/04 20:09:25
全部自分で描きたいんですよ。

186:六尺兄貴
06/12/04 20:27:23
TextLayoutとかLineBreakMeasurerとかで調べるとよろし。
結構めんどいよ。.NETは楽なんだけど。

187:デフォルトの名無しさん
06/12/04 21:26:44
そこまでして自分でやりたい意図が不明だ。非標準のライブラリを排除したいわけでもないし。

188:デフォルトの名無しさん
06/12/04 22:51:21
やりたいことが良く分からないけど、
SwingUtilities#computeStringWidth()とか、layoutCompoundLabel()とか使って
自分で描画するかな

189:デフォルトの名無しさん
06/12/04 23:53:35
>>181
>>185

自動でやってくれと言ったり、全部自分で描きたいとか
訳が分かりません。

俺なら、Border設定したJPanelの中にJLabelを埋めていくかな?

190:デフォルトの名無しさん
06/12/05 01:35:18
デモのアプレットの中にそういうのあったね。>>181

191:デフォルトの名無しさん
06/12/05 14:50:38
文字を四角で囲みたいだけなら、Font#getStringBoundsで領域取得して計算すりゃいいんじゃないだろうか・・・

192:181
06/12/05 19:37:37
>>191

表示する場所を計算すればいいってのは分かるんだけど、
複数の矩形を表示するってことを考えると、計算が複雑になりそうで
できそうもないです。

ちなみに185は私ではありません。

193:デフォルトの名無しさん
06/12/05 21:45:16
ひょっとしたら、>>94>>100で挙がってるような
グラフ描画用ライブラリを使った方が簡単かもしれない。
ノードのみ並べて、ノードのサイズをライブラリ任せにすれば(その辺はライブラリ依存だが)
だいたいいけそうな気がする。

194:デフォルトの名無しさん
06/12/05 23:19:14
>>193

チョチョイとサンプルかいてみてよ

195:デフォルトの名無しさん
06/12/06 02:57:57
ちょいちょい

だがあぷろーだに拒否された

196:デフォルトの名無しさん
06/12/06 10:37:34
JGraphいれようとしてるんだが
Ant必要なの?これ。
インストールできませんdふぁd;sfじゃs

197:デフォルトの名無しさん
06/12/06 15:13:55
んなばかな

198:デフォルトの名無しさん
06/12/06 20:23:17
つかantの動かない開発環境ってどうよ

199:デフォルトの名無しさん
06/12/06 20:45:26
JGraphでほんとうにできるのかよ

200:デフォルトの名無しさん
06/12/06 20:48:44
ほんとうに出来るかどうか、は、何をやろうとしているかに拠る。

201:デフォルトの名無しさん
06/12/06 20:52:53
たくさんのキーワードをいくつかの分類して
分類ごとに矩形を描いて
キーワードを矩形の中にならべていきたいわけ。
矩形の大きさはキーワードの長さと種類にあわせて決めたいし、
矩形の表示位置はほかの矩形とかさならないように決めたいのよ。

202:デフォルトの名無しさん
06/12/06 21:36:49
できないでファイナルアンサー?

203:デフォルトの名無しさん
06/12/06 21:40:14
コンポーネントのサイズなんていくらでも自由にかえれるだろ

204:デフォルトの名無しさん
06/12/06 21:47:15
>>202
オマエには出来ないでファイナルアンサー

ってか、既に答を書いてる人がいっぱいいるじゃん。

205:デフォルトの名無しさん
06/12/06 22:48:16
口だけでは納得いかん
動くコードなら納得がいく

206:デフォルトの名無しさん
06/12/06 23:02:57
コードくれ厨がJavaにまで…

207:デフォルトの名無しさん
06/12/07 00:12:43
>>201
なにがいいたいのか、俺にはさっぱりわからん。
図かなんか描いてどっかに貼ってみせてみろ。

208:デフォルトの名無しさん
06/12/07 00:24:40
_________________________________
| keyword 11111111111      |
| keyword 222222222222222222222 |   _______
| aaaa              |  |      |
_________________   | うお   |
        ________    | ぎゃああ |
       |        |   _______
       |あああああああ |
       |        |
       __________

209:デフォルトの名無しさん
06/12/07 00:27:06
こんな風にできんのか


______________
| keyword 11111111111      |
| keyword 222222222222222222222|    _______
| aaaa              |  |      |
_________________   | うお   |
        ________       | ぎゃああ |
       |           |   _______
       |あああああああ  |
       |           |
       __________

210:デフォルトの名無しさん
06/12/07 00:35:22
ネトゲの吹き出しみたいなもんか?

211:デフォルトの名無しさん
06/12/07 00:52:16
Graphicsに描画するんだろ?
どうでもできるだろ。

212:207
06/12/07 00:52:55
>>208
GlyphVector 作って、getOutline() で Shape とかとってくれば
簡単な気がする。

213:デフォルトの名無しさん
06/12/07 10:22:21
ここまで答えが書かれてるのにできないってのは無いな。
やってないだけ。

214:デフォルトの名無しさん
06/12/07 10:53:11
結局アルゴリズムの問題だよな。
やることはJavaだろうがWin32だろうがGTKだろうが変わらない。

215:181
06/12/07 12:28:54
文字をいれる枠の大きさぐらいはなんとかなるかもしれんが、
文字が入ってる枠をほかの枠とかさならない位置を計算して
表示するアルゴリズムがわからんじゃないか

216:デフォルトの名無しさん
06/12/07 13:31:24
なに、Swingと関係ないことで苦労してるの?
アルゴリズムの初心者スレいったほうがいいよ。

217:デフォルトの名無しさん
06/12/07 14:24:59
複数個のJPanelが存在し,
ボタンを押された祭にそれらのJPanelを切り替える事は可能でしょうか?

public class SwingTest extends JFrame implements ActionListener{
JLabel label = new JLabel("change");
JButton btn = new JButton("push");
JPanel p1 = new JPanel();
JPanel p2 = new JPanel();
public static void main(String[] args){
SwingTest test = new SwingTest("SwingTest");
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
test.setVisible(true);
}
SwingTest(String title){
setTitle(title);
setBounds(10, 10, 300, 200);
p1.add(btn);
p2.add(label);
btn.addActionListener(this);
getContentPane().add(p1);
}
public void actionPerformed(ActionEvent e){
getContentPane().remove(p1);
getContentPane().add(p2);
}
}

こんな感じで今やっているのですが,ボタンを押しても反応しなくて困っています.
どなたかご教授お願いします.

218:デフォルトの名無しさん
06/12/07 15:08:27
一応そのやり方でもできるけど、ちゃんとイベント把握してないとやめたほうがいい

たぶんやりたいことはJPanelを切り替えることではなく、レイアウトマネージャにあるやつで足りると思うが


219:デフォルトの名無しさん
06/12/07 15:37:48
>>217

解答。ボタンを押すとボタンが消えて、ラベルが現れるなんて、変なGUIだな。
元の状態にに戻れないじゃん。あくまでもテストだよね。
本ちゃんでこんな変なGUI使ったら笑われるよ。

public void actionPerformed(ActionEvent e){
getContentPane().remove(p1);
getContentPane().add(p2);
validate();//←ここ、ここ
}

220:217
06/12/07 16:06:49
返信ありがとうございます.
validate()
を加える事で表示は代わるようになったのですが,また新たな問題が・・・.
今3つのパネルを用意してそれら3つを行き来できるようにしているのですが,
この方法を用いた場合何故か3つのパネルを1回ずつ表示させることはできるのですが,
2回目以降即ち違うパネルから再度戻ってきた場合に表示が反映されません.
何度も質問してしまい,お手数だと思いますが,どなたかよろしくお願いします.

221:デフォルトの名無しさん
06/12/07 16:12:04
コードも見ないでどうやって解答しろと?

222:217
06/12/07 16:22:57
すいません.
コードを張ろうとしたら大きくなりすぎて,張る事ができなかったので・・・.
表示を切り替えている部分はこんな感じです.public void actionPerformed(ActionEvent e){
String cmd = e.getActionCommand();
if (cmd.equals("1to2")){
getContentPane().remove(パネル1);
getContentPane().add(パネル2);
}
else if (cmd.equals("1to3")){
getContentPane().remove(パネル1);
getContentPane().add(パネル3);
}
else if (cmd.equals("2to1")){
getContentPane().remove(パネル2);
getContentPane().add(パネル1);
}
else if (cmd.equals("2to3")){
getContentPane().remove(パネル2);
getContentPane().add(パネル3);
}
else if (cmd.equals("3to1")){
getContentPane().remove(パネル3);
getContentPane().add(パネル1);
}
else if (cmd.equals("3to2")){
getContentPane().remove(パネル3);
getContentPane().add(パネル2);

}
validate();
}

223:217
06/12/07 16:29:56
何度も申し訳ありません.
先ほどパネルはが変わらないと言いましたが,一部分は変わっていました.
3つのパネルに共通する部分は変更されているのですが,
それ以外の部分が変更されていませんでした.
ただ変更されると言ってもマウスをボタンコンテナ上に乗せると変わるのですが,
そうしなければ変わりませんでした.
非常に説明が下手で申し訳ありませんが,よろしくお願いします.

224:デフォルトの名無しさん
06/12/07 16:45:57
>>218が一番まともな回答だと思うけどそれは調べたの?

225:217
06/12/07 16:49:42
>>224
一応>>218の方法で
画面の切り替えが発生したら
パネル上にあるコンテナをremoveAllで削除.
新たに別のパネルを作成し,コンテナを設置.
そのパネルを今表示しているパネルに代入.
という感じでやったのですが,画面が切り替わらず,断念しました.

226:デフォルトの名無しさん
06/12/07 16:50:46
そりゃそうだが、java.awt.CardLayoutというキーワードが出てこないと
そう簡単には調べられない。
AWTのレイアウト概説的文章とにらめっこする必要が出てくる。

227:デフォルトの名無しさん
06/12/07 16:53:00
AWTやSwingはまずレイアウトマネージャありきだろ
どんな初心者本だってすぐにでてくる

228:217
06/12/07 16:55:36
いまさらになってしまうのですが
自分がsetLayout(null)でレイアウトマネージャーを無効にしているのがダメな気がしてきた・・・.
やはり何かしらレイアウトマネージャーは使うべきなんですかね・・・.

229:デフォルトの名無しさん
06/12/07 17:01:21
レイアウトマネージャ使えばコンポーネントサイズが変わってもそれにあわせて動いてくれるからな
とりあえずnullを使う利点はない
絶対的な座標のように扱うにしてもグループレイアウトやアブソリュートレイアウトのほうがまし

今のコードそのまま使うにしてもそのさしかえたいJPanelにレイアウト指定して
そこにカードレイアウトではりつければいいだけ

レイアウトマネージャ理解していないのならIDEでいじってみてどういう感じなのか理解したほうがいい
カードレイアウトってのはタブ部分のないタブコントロールみたいなもん

230:217
06/12/07 17:07:34
返信ありがとうございます.
カードレイアウトが自分のやりたい事とマッチしているようなのでまずはこれを勉強してみます.
みなさま本当にありがとうございました.

231:デフォルトの名無しさん
06/12/07 17:14:50
カードレイアウトって、そんなもんも有ったなあ。
しかし、222のコード見たところ、ボタンがいくつか有って、押すと対応するパネルが
表示されるようにしたいんでしょ。普通はJTabbedPane使って解決じゃないの?

232:デフォルトの名無しさん
06/12/07 17:21:55
今のUIそのまま使いたいならCardLayoutだけど、それは普通Tabでやる。

233:デフォルトの名無しさん
06/12/07 17:30:32
まあ、人様に御見せするアプリじゃないんでしょ。いいんじゃないの。

234:181
06/12/07 22:28:24
JGraphいちおううまくサンプル動かせたんだが、
なぜかJ2SDKのフォルダの中でソースをコンパイルして実行しないと
他の場所ではコンパイルも実行もできなんだけど、なぜだろう。
コンパイル後の.classファイルなら他の場所でも実行できるのかと思って
別の場所に移動させて動かしてみたらやっぱり動かないし。
普通、J2SDKフォルダの中でコンパイルしたり実行したりってしないんだし
これだったら使い物にならないんだけど・・・

235:デフォルトの名無しさん
06/12/08 00:16:52
jgraph.jarをソースと同じフォルダにいれればコンパイルできますた。
でも常にjgraph.jarを一緒にいれておかなければならないんでしょうか。

236:デフォルトの名無しさん
06/12/08 00:26:59
なんか根本的なところ勉強したほうがよくないか?
それにSwingとまったく関係ない点について


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

5098日前に更新/197 KB
担当:undef