Java低速GUI Swing 5
..
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とまったく関係ない点について
237:デフォルトの名無しさん
06/12/08 00:31:35
>>181
Javaの仕様を勉強してこい。
理解できるまで帰ってこんでよい。
238:デフォルトの名無しさん
06/12/08 00:31:59
jgraphスレ行け
239:デフォルトの名無しさん
06/12/08 00:49:38
jgraphスレってなんだよ。そんなものねえじゃん
240:デフォルトの名無しさん
06/12/08 00:53:24
無けりゃ最初に質問すべきスレがあるだろ
少なくともここじゃねえ
241:デフォルトの名無しさん
06/12/09 19:21:53
JTableで、カーソルキーによるセルの移動を監視したいのですが、どうしたらよいですか?
keyPressed で JTable#getSelectedRow() で行を取得すると、
移動前の行が取れてしまうのが悩みの種です。
押したキーによって、+1、-1すればできますが、
もう少し良い方法があれば教えてください。お願いします。
242:241
06/12/09 19:59:48
モデルの isCellEditable をオーバーライドして移動先が取得できるか試しましたが、
セルを行で選択するモードだと isCellEditable が呼ばれないんですね。どうしたものか。
243:デフォルトの名無しさん
06/12/09 20:32:19
>>241
SelectionModel を使う。
244:デフォルトの名無しさん
06/12/09 20:49:50
>>241
TableColumnModelListener,ListSelectionListener
の2つで横と縦の選択がとらえられる。
245:241
06/12/09 22:31:36
>>243 >>244
ありがとうございました。早速試したところ、なんとか取れました。
あと、JTable#valueChanged(ListSelectionEvent) をオーバーライドしても取れました。
奥が深いですね。
246:デフォルトの名無しさん
06/12/09 23:25:58
ぽとぺたやってると手軽にオーバーライドできなくて面倒なんだよね
ペイントイベントもイベントとしての実装じゃないから手軽とはいかないし
SwingはJavaBeansをベースに作ってるといいながらどうもそういう実装になってないんだよね
getとsetが対になってないからプロパティとして表示されないとかも多いし
247:デフォルトの名無しさん
06/12/13 00:56:29
Java SE 6 入れてみたけど Swing また速くなった?
248:デフォルトの名無しさん
06/12/13 01:55:20
Swing部分はまだ確認してないが、演算速度は確実に速いっぽ
コンパイルしなおしてなくても物によっては1.4倍くらいでてる
249:デフォルトの名無しさん
06/12/14 11:49:28
JButton上で、HTML要素を使って改行し、多段落表示させているのですが、
この中の文字列に含まれる一部の「<」や「>」や「/」などが表示されません。
これらの文字をHTML要素として解釈させないため無効化するにはどうしたらいいのでしょうか?
Webブラウザ上でHTMLソースを表示させるときのように
「<」や「/」を実体参照に書き換えても表示できないようです。
250:249
06/12/14 12:37:25
文字実体参照ではなく数値文字参照でやってみたらなぜかうまくいきました。
251:デフォルトの名無しさん
06/12/14 12:41:39
>>250
おれはふつうに>とかでできてるぞ
252:デフォルトの名無しさん
06/12/14 12:43:46
あら、2chでえすけーぷされた
&gt;
で普通に表示されてるよと
253:デフォルトの名無しさん
06/12/14 12:53:18
>>252
レスありがとうございます。
< と >はうまくいったのですが、
<html> のあとに、「/」が入る部分があると表示されたり表示されなかったりで試行錯誤中です。
254:デフォルトの名無しさん
06/12/14 13:29:39
>>253
bodyタグがはいっていないとかいうオチは?
255:デフォルトの名無しさん
06/12/15 07:27:32
drawLineメソッドでCanvasに線をかくことが出来ますが、
その線を座標の配列として得るにはどうしたらいいでしょうか?
256:デフォルトの名無しさん
06/12/15 09:34:57
>>255
線は特にインスタンスを保持してないしデータもない。
このやりかたでを試してみな。
URLリンク(web.hc.keio.ac.jp)
257:デフォルトの名無しさん
06/12/15 10:45:24
>>256
もっと簡単にできないものでしょうか
例えば(0,0),(0,5)をdrawLineで指定したとしたら
2点とその間にある(0,1),(0,2),(0,3),(0,4)が塗りつぶされます。
この4点の塗りつぶしをJavaはどのように実装しているのでしょうか?
この例のように予め2点を結ぶと水平,もしくは垂直になると分かっていればいいですが
(0,0),(2,5)のように水平及び垂直にならない場合,
drawLineはどのように計算して塗りつぶす点を決めているのでしょう?
258:デフォルトの名無しさん
06/12/15 11:19:16
>>257
言っている意味がわからないし(何に対して水平、垂直?水平な点なんてありえないし)
255との繋がりも無いように読めるんだけど、結局何がしたいの?
つか256もけして難しくはないと思うんだけど。
実装について知りたければソース読め。
259:デフォルトの名無しさん
06/12/15 13:11:03
>>258
ちょっと感動した。ソース読めってセリフが出てくるあたり。
まあ、ネイティブに飛ばしてない限りそこ読めば分かるよな。
260:デフォルトの名無しさん
06/12/15 13:16:38
どうでも良いことだけどCanvasはSwingじゃなくてAWTじゃなかったっけ。
261:デフォルトの名無しさん
06/12/15 13:31:08
1.2 以降だと、たかが drawLine でも Graphics2D の関係で Stroke の計算とか
結構面倒臭い事しなきゃいかんような気もする。
1.1 までだったら Stroke とか無かったし、
アンチエイリアス云々って時代でもなかったから
ブレゼンハムアルゴリズムだけで出来たかもしらんけど。
262:デフォルトの名無しさん
06/12/15 13:45:06
257はソース読んでからの書き込みです。
drawLineの実装ってどんなんだろ,と思ってソース見たのですが
Graphic見てもabstractで
Graphic2Dでオーバーライドしてるのかなと思ってもありませんでした。
どうやらdraw(Shape)っぽい漢字なのですが
Stroke云々ってあってめんどくさそうなのです。
>>258
水平,垂直ってのは結んだ線の話です。
(0,0)と(0,5)を結ぶと垂直な線になります。
ある2点を結んだときにできる線が通ることになる座標を
得るにはどうしたらいいか?ってことで伝わるでしょうか
263:デフォルトの名無しさん
06/12/15 13:46:41
えっと、もっと簡単に言うと
直線が2本あって、
その2本の線の交点の座標って求められるの?
ってことかい?
もしそれなら数学学べ
264:デフォルトの名無しさん
06/12/15 14:04:43
>>263
全然話が違います
「ある2点を結んだとき」ですから出てくる点は2つです
それだと4点になります
drawLine(0, 0, 0, 5)を呼び出すと
(0,0),(0,1),(0,2),(0,3),(0,4),(0,5)が塗りつぶされます。
(0,1),(0,2),(0,3),(0,4)が塗りつぶされるのは
(0,0)と(0,5)を結んだ直線が通る座標だからです。
(0,0)と(0,5)を結ぶと垂直な線ができるので
(0,1),(0,2),(0,3),(0,4)が塗りつぶされるということは
簡単に求められます。
drawLine(0, 0, 100, 101)を呼び出したときに
塗りつぶされる座標はどこになるのでしょうか?
265:デフォルトの名無しさん
06/12/15 14:09:00
もっと簡単じゃないか。。。
drawLine(0, 0, 5, 5)だと
(0,0),(1,1),(2,2),(3,3),(4,4),(5,5)
が塗りつぶされるけどどうやって計算するの?
ってことか?
やっぱ数学学べ
266:デフォルトの名無しさん
06/12/15 14:21:08
計算する以外での求め方は
線を書く前のキャンバスの画像と
線を書いた後のキャンバスの画像を比較すれば良い
前と後の同一座標のドットを比較して
違っていれば描画されていると判断すれば良いんじゃないか
267:デフォルトの名無しさん
06/12/15 14:23:28
>>264
ソースを理解できないのなら手助けもするが、読むのが面倒なだけなら帰れ。
そしてスレ違い。
268:デフォルトの名無しさん
06/12/15 14:29:11
JDoalogを継承したDialogで最大化、最小化ボタンを表示させることは
可能でしょうか?
JFrameを継承すれば表示されますが、
Windowsのタスクバーにアプリケーションが2個上がってきてるように
見えるのでJDialogにしたいです。
269:デフォルトの名無しさん
06/12/16 02:53:26
>>268
私が知っているのは↓の手法
Merlinの魔術: もう1つのシンプルなフレーム
URLリンク(www-06.ibm.com)
A,この手法の場合、最小化、最大化アイコンを設定する必要あり。
B,たぶんもっといい方法があると思う。
270:デフォルトの名無しさん
06/12/17 10:51:19
見えないボタンの右半分がクリックできるプログラム。
import javax.swing.*;
import java.awt.event.*;
class A020 {
public static void main(String[] args) {
JFrame f = new JFrame();
f.setSize(640, 480);
JPanel p1 = new JPanel();
p1.setBounds(0, 0, 100, 100);
JButton b = new JButton("クリック");
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "ボタンがクリックされました。");
}
});
p1.add(b);
JPanel p2 = new JPanel();
p2.setBounds(50, 0, 100, 100);
JLayeredPane l = new JLayeredPane();
l.add(p1, Integer.valueOf(10));
l.add(p2, Integer.valueOf(20));
f.add(l);
f.setVisible(true);
}
}
271:デフォルトの名無しさん
06/12/17 11:00:39
×見えないボタンの右半分
○見えない「ボタンの右半分」
272:デフォルトの名無しさん
06/12/17 20:29:21
g.drawString("Test", 0, 0);
g.drawLine(0, 0, 10, 10);
とすると、線は(0,0)-(10,10)で描かれますが、文字の方は描かれません。
drawStringとdrawLineでは、座標の考え方が異なるようなのでしょうか?
273:272
06/12/17 20:43:03
すみません。解決しました。
drawStringは文字の左下が基点になるのですね。
なんのためにそうなっているのかわかりませんが。。。
274:デフォルトの名無しさん
06/12/17 20:57:59
ベースラインを理解しろよ・・・
それにこれはSwingと関係ないし
275:デフォルトの名無しさん
06/12/17 21:25:06
ベースラインがなぜアセント値の下にあるか説明せよ。
276:デフォルトの名無しさん
06/12/17 21:36:32
>>274
おまえには関係ないし
277:デフォルトの名無しさん
06/12/18 12:11:24
>>276
>>274自身には関係ないだろうが
スレに関係ないのは確かだ
日本語嫁よ
278:デフォルトの名無しさん
06/12/18 13:33:49
JTextArea で、キャレットの列の位置を取得したいのですが、
シンプルな方法があったら教えて下さい!!
今は以下のようにして取得しています。
_text = new JTextArea();
Element all = _text.getDocument().getDefaultRootElement();
int index = all.getElementIndex(_text.getCaretPosition());
Element line = element.getElement(index);
int col = _text.getCaretPosition() - e.getStartOffset();
279:272
06/12/18 14:35:31
スレ違いでしたか。。。
JComponentの質問は良くて、Componentの質問はダメってことですか?
280:デフォルトの名無しさん
06/12/18 15:14:32
単に274がキチガイ
281:デフォルトの名無しさん
06/12/18 17:57:41
>>270
どういうトリック?
282:デフォルトの名無しさん
06/12/18 17:58:32
>>278
全角とTabの対応が入ってなくない?
Tabは入る位置によって文字列長が変わるから、結構面倒そう。
283:デフォルトの名無しさん
06/12/18 20:28:08
>>282
その行の何文字目かが欲しいだけでしょ
284:デフォルトの名無しさん
06/12/20 04:23:00
コンポーネントをadd()あるいはremove()するときは直後に必ずrevalidate()を呼ぶべきでしょうか?
多くの場合、revalidate()を呼ばなくてもうまくいくのですが
(ただしremove()の後は必ずrepaint()してます)、
ときどきrevalidate()を呼ばないとダメなときがあります。
revalidate()が必要なときと不要なときの違いは何でしょうか?
または、違いは気にせずに常にrevalidate()するべきでしょうか?
285:デフォルトの名無しさん
06/12/20 12:21:57
呼ぶべき。
286:デフォルトの名無しさん
06/12/20 17:41:07
JavaSE6だとメニューをだしたまま、タイトルバーをクリックするとメニューが消えてくれるね。
かなりいいかんじあげ
287:デフォルトの名無しさん
06/12/20 18:13:34
おお、どれだけ待った事か>>286
288:デフォルトの名無しさん
06/12/21 02:34:13
>>284
オレもよくわからない。
revalidate()を呼ぶと、repaint() 時のクリップ領域が現状にあったものになる気がする。
詳しくわかったら教えてくれ。
289:284
06/12/21 21:25:56
自分の経験だけで言えば、JPanelに限ればrevalidate()は無くても大丈夫そうです。
以下、JPanel限定の話。
◆add()する場合
revalidate() → なくても問題ない。
repaint() → たいていはなくても問題ないが時々ないとダメなことがある。
◆remove()する場合
revalidate() → なくても問題ない。
repaint() → ないとダメ。
JComponentのドキュメントのrevalidateの項を見ると、
「プログラムが、通常、GUI の内容を更新するために
validate を呼び出す必要がない点で AWT とは異なります」
というようなことが書いてあります。
つまりSwingではrevalidateを呼ぶ必要はないということなのかなと解釈したのですが
実際のところはどうなのでしょう?
それと、JScrollPaneが絡んでるとrevalidateしないとダメなことがあるようです。
290:288
06/12/21 22:51:29
>>289
どうもありがと。
JPanel にボタンを2つ貼り付けて、押されたから片方を remove するサンプルを作って試してみた。
revalidate() しないと、ボタンが削除されたのに、レイアウトが変更されないね。
これはたぶん、revalidate()を自動的に呼ぶのが、
レイアウトに影響を受けたコンポーネントが呼ぶからだと思う。
つまり、removeされた本人は revalidate() を自動的に呼ぶが、もうremoveされていて親がいないので、すぐにreturnされる。
なので、親のコンポーネントの方で revalidate() してあげる必要がある。
ちなみにオレがrevalidate() を使う必要があったのは、JTextArea に行番号を表示させる時。
JScrollPane上に表示されていない行が増えた場合に、増えた行の行番号が正しく表示されなかった。
これは上のレスで書いた通り、新しく増えた領域が再描画する領域として認識されていないからだと思う。
まぁ長々と書いたが、オレははっきり理解していないのだが。。。。
291:デフォルトの名無しさん
06/12/21 23:11:13
つ URLリンク(homepage1.nifty.com)
292:284
06/12/22 01:13:22
どうもありがとうございます。
なるほど、周りのレイアウトに影響を及ぼす場合はrevalidate()が必要なのですね。
自分は最近setLayout(null)でずっとやってたから必要な場面がなかったのかもしれません。
JScrollPaneが絡んだときだけ必要になるのも納得です。
しかし、add()するときにrepaint()が必要になることがある理由は何なんでしょうか…?
293:デフォルトの名無しさん
06/12/22 13:16:52
paintイベントで描画してる場合
294:デフォルトの名無しさん
06/12/22 20:02:30
JListで、リスト項目の高さを任意に指定したいのですが、どうすればよいでしょうか?
現在はDefaultListCellRendererを継承したRendererを使って高さを設定してますが、反映されません。
呼び元を見たところ、Fontサイズが有効になっているっぽいのです。
295:デフォルトの名無しさん
06/12/22 21:32:27
>>294
そのレンダラのサイズ指定はどうなってるの?
296:294
06/12/22 22:31:40
>>295
すみません。できました。
レンダラで getPreferredSize() をオーバーライドして、サイズ返したら、そのサイズになりました。
getListCellRendererComponent() の中でサイズを指定しても、有効にならないようですね。
質問の内容が不十分だったこともお詫びします。
297:284
06/12/23 05:20:19
>>293
ありがとうございます。
paintComponent()ではなくてpaint()してる場合なのですね。
すると自分ではいじってないからどこで使われているのかわかりにくいわけですね。
298:デフォルトの名無しさん
06/12/23 14:09:18
>>291
そのFAQは知らなかった。とても参考になった、ありがとう。
299:デフォルトの名無しさん
06/12/23 14:57:52
>>297
Swingはフレームワークとしてpaintよんでる
つまり自前でコンポーネント描画しているすべての場合において必要ということ
300:284
06/12/23 17:55:43
>>299
ありがとうございます。
すると、add()の後はrepaint()必須ということですか?
repaint()しなくてもちゃんと描画される場合があるのはなぜでしょうか?
301:290
06/12/23 20:02:19
普通のコンポーネントを追加した場合は、revalidate() すれば repaint() しなくても正常に描画されると思う。されない時ってある?
>>293 は、drawLine とかで、自分で描画している場合は「必要」と言ってる気がする。
paintイベントって言ってるのも、paintComponent()のことだよね?
302:デフォルトの名無しさん
06/12/23 20:44:17
299も293も俺
Swingはpaintイベントでpaintなんちゃらというのをよんでる
そこで子のコンポーネントも順次呼ばれる
paintをオーバーライドするとイベントがとまって崩れるのはこのため
revalidateがリペイントマネージャに対してダーティマーキングしていれば自動的に再描画される
ソース読んでみた?IDEつかってるならすぐソース見れるからJComponentみてみるといいよ
303:デフォルトの名無しさん
06/12/24 05:29:14
>>302
paint?paintComponent?
オーバーライドするなら基本はpaintComponentでは?
あと、super呼び出せば今までと変わらないと思う。
理由は何にせよ、呼ばないで崩れる時があったら、呼んでみるってのでいいのかな。
304:デフォルトの名無しさん
06/12/24 05:49:29
間違えて、paintComponentsをオーバーライドしてはまる。
305:デフォルトの名無しさん
06/12/24 12:15:13
>>303
オーバーライドの話してないだろ
>>304
それはオーバーライドとはいわない
アノテーション使え
306:デフォルトの名無しさん
06/12/24 15:00:31
>>305
>>302に思いっきりオーバーライドってあるけど。
307:デフォルトの名無しさん
06/12/24 17:05:05
>>305
オーバーライドだろ
おまえみたいなヤツが思いっきりはまるんだよ。
paintComponentsというメソッドもある。
だから@Overrideアノテーションつけてもコンパイル通る。
308:デフォルトの名無しさん
06/12/24 19:38:21
>>306
paintのオーバーライドはするなという話なのだ
paintとpaintComponentは密接な関係であるが、paintComponentのオーバーライドの話はしていない
309:デフォルトの名無しさん
06/12/24 21:20:58
>>308
まぁそうなんだけど、そもそもの話は、paint()をオーバーライドしていなくても、
repaint()を呼び出す必要があるのはなぜ?ってこと。
paintComponent() で独自の描画処理をしている場合に、
repaint()の呼び出しが必要になる場合があるので、paintイベントって言われてると、
paint() とも paintComponent() とも、どっちとも取れる。「paint()」 なら、間違いようがないけどね。
とりあえず、独自描画なしのコンポーネントをaddしただけで、
repaint()が必要になるケースがよくわからない。どんなケースだろう。
310:デフォルトの名無しさん
06/12/24 21:58:08
addだけでもrevalidateしないとだめだけどな
311:284
06/12/25 20:16:27
paintComponent()をオーバーライドして独自描画をしている場合に
repaint()が必要ということですね。
312:デフォルトの名無しさん
06/12/25 23:23:17
Swingのソースのいたるところにrevalidateの直後にrepaintしてるからあるほうが安心かな
313:デフォルトの名無しさん
06/12/26 07:07:58
JTableのモデルでDefaultTableModelを使っているのですが、
DefaultTableModel#addRow(Object[])と
DefaultTableModel#addRow(Vector)で、動作が変わる時があるのですが、なぜでしょうか?
具体的な違いは、
addRow後に DefaultTableModel#setColumnIdentifiers() を呼び出すと、
addRow(Object[]) の方はデータが表示されません。
解決方法としては、
setColumnIdentifiers() を先に呼んで、addRowすれば問題ないのですが、
Java側のソースを見ても、なぜそうなるのかが,お風呂上りくらいさっぱりです。
一応直接の原因としては、
addRow(Object[])とした場合、DefaultTableModel#dataVectorに値が入らないためです。
dataVectorが初期化されていないような気がするので、
dataVector.insertElementAt(rowData, row);
の時にヌルポで落ちてもいいくらいなんですけど。
314:デフォルトの名無しさん
06/12/26 22:58:27
>>313
Object[]でテストしてみたけどカラムの表示ちゃんとかわってるよ
315:313
06/12/29 10:18:36
>>314
すみません。アク禁でした。
もう一度試したところ、addRow(Object[])とaddRow(Vector)で、動作は同じでした。ん〜、どこかミスっていたようです。
あと、setColumnIdentifiers() を先に呼ばないとデータが入らないのは、仕様みたいですね。
または事前に列のサイズを指定してあげればOKでした。
316:デフォルトの名無しさん
07/01/05 04:13:37
JOptionPane.showMessageDialogueをつかったダイアログで、
ダイアログのボタンをアクションリスナに登録するには
どうしたらよいのか教えてい頂けないでしょうか?
317:デフォルトの名無しさん
07/01/05 17:23:08
フルスクリーン画面上にJPopupMenuを表示して
画面をrepaintするとJPopupMenuが消えてしまいます。
JPopupMenuを消さずに画面を再描画する方法はありますでしょうか。
JPopupMenu.setDefaultLightWeightPopupEnabled(false);にしております。
318:317
07/01/05 17:24:42
public class PopupMenuTest extends JFrame implements Runnable {
private Thread repaintThread = null;
public PopupMenuTest() {
setSize(800, 600);
JPopupMenu.setDefaultLightWeightPopupEnabled(false);
GraphicsDevice device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
DisplayMode fullMode = new DisplayMode(800, 600, device.getDisplayMode().getBitDepth(), device.getDisplayMode().getRefreshRate());
device.setFullScreenWindow(this);
device.setDisplayMode(fullMode);
addMouseListener(new MouseAdapter() {
public void mouseReleased(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON3) {createPopup().show(PopupMenuTest.this, e.getX(), e.getY());}}});
setVisible(true);
if (repaintThread == null) {repaintThread = new Thread(this);repaintThread.start();}
}
public void run() {
while (repaintThread != null) {
System.out.println("repaint");repaint();
try {Thread.sleep(10000);} catch (Exception e) {}
}
}
private JPopupMenu createPopup() {
JPopupMenu popupMenu = new JPopupMenu();
JMenu menu1 = new JMenu("menu1");
menu1.add(new JMenuItem("TEST"));
popupMenu.add(menu1);
return popupMenu;
}
public static void main(String[] args) throws Exception {new PopupMenuTest();}
}
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5098日前に更新/197 KB
担当:undef