Java低速GUI Swing 5
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/10/18(水) 11:50:09パフォーマンスの問題は徐々にですが改善されつつあります。
しかしながら、"Java"というだけで未だに敬遠されるのが現状。
そんなSwingと引き続き付き合っていくみんなのスレッドです。
Java低速GUI Swing 4 (前スレ)
http://pc8.2ch.net/test/read.cgi/tech/1140533866/
Java低速GUI Swing 3
http://pc8.2ch.net/test/read.cgi/tech/1121700954/
Java低速GUI Swing 2
http://pc8.2ch.net/test/read.cgi/tech/1095398949/
Java低速GUI Swing
http://pc5.2ch.net/test/read.cgi/tech/1062271447/l50
0183181
2006/12/04(月) 18:17:08矩形の大きさは単語が矩形からはみださないように自動的に適切な大きさ計算して
描かれるようにしたい。
そういう単語が入っている矩形がこれまた何個も出したい。
矩形同士もお互い重ならないように自分で適切な位置を計算してそこに表示されてほしい。
そういうのって簡単にはできないのかな?
0184デフォルトの名無しさん
2006/12/04(月) 19:10:020185181
2006/12/04(月) 20:09:250186六尺兄貴
2006/12/04(月) 20:27:23結構めんどいよ。.NETは楽なんだけど。
0187デフォルトの名無しさん
2006/12/04(月) 21:26:440188デフォルトの名無しさん
2006/12/04(月) 22:51:21SwingUtilities#computeStringWidth()とか、layoutCompoundLabel()とか使って
自分で描画するかな
0189デフォルトの名無しさん
2006/12/04(月) 23:53:35>>185
自動でやってくれと言ったり、全部自分で描きたいとか
訳が分かりません。
俺なら、Border設定したJPanelの中にJLabelを埋めていくかな?
0190デフォルトの名無しさん
2006/12/05(火) 01:35:180191デフォルトの名無しさん
2006/12/05(火) 14:50:380192181
2006/12/05(火) 19:37:37表示する場所を計算すればいいってのは分かるんだけど、
複数の矩形を表示するってことを考えると、計算が複雑になりそうで
できそうもないです。
ちなみに185は私ではありません。
0193デフォルトの名無しさん
2006/12/05(火) 21:45:16グラフ描画用ライブラリを使った方が簡単かもしれない。
ノードのみ並べて、ノードのサイズをライブラリ任せにすれば(その辺はライブラリ依存だが)
だいたいいけそうな気がする。
0194デフォルトの名無しさん
2006/12/05(火) 23:19:14チョチョイとサンプルかいてみてよ
0195デフォルトの名無しさん
2006/12/06(水) 02:57:57だがあぷろーだに拒否された
0196デフォルトの名無しさん
2006/12/06(水) 10:37:34Ant必要なの?これ。
インストールできませんdふぁd;sfじゃs
0197デフォルトの名無しさん
2006/12/06(水) 15:13:550198デフォルトの名無しさん
2006/12/06(水) 20:23:170199デフォルトの名無しさん
2006/12/06(水) 20:45:260200デフォルトの名無しさん
2006/12/06(水) 20:48:440201デフォルトの名無しさん
2006/12/06(水) 20:52:53分類ごとに矩形を描いて
キーワードを矩形の中にならべていきたいわけ。
矩形の大きさはキーワードの長さと種類にあわせて決めたいし、
矩形の表示位置はほかの矩形とかさならないように決めたいのよ。
0202デフォルトの名無しさん
2006/12/06(水) 21:36:490203デフォルトの名無しさん
2006/12/06(水) 21:40:140204デフォルトの名無しさん
2006/12/06(水) 21:47:15オマエには出来ないでファイナルアンサー
ってか、既に答を書いてる人がいっぱいいるじゃん。
0205デフォルトの名無しさん
2006/12/06(水) 22:48:16動くコードなら納得がいく
0206デフォルトの名無しさん
2006/12/06(水) 23:02:570207デフォルトの名無しさん
2006/12/07(木) 00:12:43なにがいいたいのか、俺にはさっぱりわからん。
図かなんか描いてどっかに貼ってみせてみろ。
0208デフォルトの名無しさん
2006/12/07(木) 00:24:40| keyword 11111111111 |
| keyword 222222222222222222222 | _______
| aaaa | | |
_________________ | うお |
________ | ぎゃああ |
| | _______
|あああああああ |
| |
__________
0209デフォルトの名無しさん
2006/12/07(木) 00:27:06______________
| keyword 11111111111 |
| keyword 222222222222222222222| _______
| aaaa | | |
_________________ | うお |
________ | ぎゃああ |
| | _______
|あああああああ |
| |
__________
0210デフォルトの名無しさん
2006/12/07(木) 00:35:220211デフォルトの名無しさん
2006/12/07(木) 00:52:16どうでもできるだろ。
0213デフォルトの名無しさん
2006/12/07(木) 10:22:21やってないだけ。
0214デフォルトの名無しさん
2006/12/07(木) 10:53:11やることはJavaだろうがWin32だろうがGTKだろうが変わらない。
0215181
2006/12/07(木) 12:28:54文字が入ってる枠をほかの枠とかさならない位置を計算して
表示するアルゴリズムがわからんじゃないか
0216デフォルトの名無しさん
2006/12/07(木) 13:31:24アルゴリズムの初心者スレいったほうがいいよ。
0217デフォルトの名無しさん
2006/12/07(木) 14:24:59ボタンを押された祭にそれらの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);
}
}
こんな感じで今やっているのですが,ボタンを押しても反応しなくて困っています.
どなたかご教授お願いします.
0218デフォルトの名無しさん
2006/12/07(木) 15:08:27たぶんやりたいことはJPanelを切り替えることではなく、レイアウトマネージャにあるやつで足りると思うが
0219デフォルトの名無しさん
2006/12/07(木) 15:37:48解答。ボタンを押すとボタンが消えて、ラベルが現れるなんて、変なGUIだな。
元の状態にに戻れないじゃん。あくまでもテストだよね。
本ちゃんでこんな変なGUI使ったら笑われるよ。
public void actionPerformed(ActionEvent e){
getContentPane().remove(p1);
getContentPane().add(p2);
validate();//←ここ、ここ
}
0220217
2006/12/07(木) 16:06:49validate()
を加える事で表示は代わるようになったのですが,また新たな問題が・・・.
今3つのパネルを用意してそれら3つを行き来できるようにしているのですが,
この方法を用いた場合何故か3つのパネルを1回ずつ表示させることはできるのですが,
2回目以降即ち違うパネルから再度戻ってきた場合に表示が反映されません.
何度も質問してしまい,お手数だと思いますが,どなたかよろしくお願いします.
0221デフォルトの名無しさん
2006/12/07(木) 16:12:040222217
2006/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();
}
0223217
2006/12/07(木) 16:29:56先ほどパネルはが変わらないと言いましたが,一部分は変わっていました.
3つのパネルに共通する部分は変更されているのですが,
それ以外の部分が変更されていませんでした.
ただ変更されると言ってもマウスをボタンコンテナ上に乗せると変わるのですが,
そうしなければ変わりませんでした.
非常に説明が下手で申し訳ありませんが,よろしくお願いします.
0224デフォルトの名無しさん
2006/12/07(木) 16:45:570225217
2006/12/07(木) 16:49:42一応>>218の方法で
画面の切り替えが発生したら
パネル上にあるコンテナをremoveAllで削除.
新たに別のパネルを作成し,コンテナを設置.
そのパネルを今表示しているパネルに代入.
という感じでやったのですが,画面が切り替わらず,断念しました.
0226デフォルトの名無しさん
2006/12/07(木) 16:50:46そう簡単には調べられない。
AWTのレイアウト概説的文章とにらめっこする必要が出てくる。
0227デフォルトの名無しさん
2006/12/07(木) 16:53:00どんな初心者本だってすぐにでてくる
0228217
2006/12/07(木) 16:55:36自分がsetLayout(null)でレイアウトマネージャーを無効にしているのがダメな気がしてきた・・・.
やはり何かしらレイアウトマネージャーは使うべきなんですかね・・・.
0229デフォルトの名無しさん
2006/12/07(木) 17:01:21とりあえずnullを使う利点はない
絶対的な座標のように扱うにしてもグループレイアウトやアブソリュートレイアウトのほうがまし
今のコードそのまま使うにしてもそのさしかえたいJPanelにレイアウト指定して
そこにカードレイアウトではりつければいいだけ
レイアウトマネージャ理解していないのならIDEでいじってみてどういう感じなのか理解したほうがいい
カードレイアウトってのはタブ部分のないタブコントロールみたいなもん
0230217
2006/12/07(木) 17:07:34カードレイアウトが自分のやりたい事とマッチしているようなのでまずはこれを勉強してみます.
みなさま本当にありがとうございました.
0231デフォルトの名無しさん
2006/12/07(木) 17:14:50しかし、222のコード見たところ、ボタンがいくつか有って、押すと対応するパネルが
表示されるようにしたいんでしょ。普通はJTabbedPane使って解決じゃないの?
0232デフォルトの名無しさん
2006/12/07(木) 17:21:550233デフォルトの名無しさん
2006/12/07(木) 17:30:320234181
2006/12/07(木) 22:28:24なぜかJ2SDKのフォルダの中でソースをコンパイルして実行しないと
他の場所ではコンパイルも実行もできなんだけど、なぜだろう。
コンパイル後の.classファイルなら他の場所でも実行できるのかと思って
別の場所に移動させて動かしてみたらやっぱり動かないし。
普通、J2SDKフォルダの中でコンパイルしたり実行したりってしないんだし
これだったら使い物にならないんだけど・・・
0235デフォルトの名無しさん
2006/12/08(金) 00:16:52でも常にjgraph.jarを一緒にいれておかなければならないんでしょうか。
0236デフォルトの名無しさん
2006/12/08(金) 00:26:59それにSwingとまったく関係ない点について
0237デフォルトの名無しさん
2006/12/08(金) 00:31:35Javaの仕様を勉強してこい。
理解できるまで帰ってこんでよい。
0238デフォルトの名無しさん
2006/12/08(金) 00:31:590239デフォルトの名無しさん
2006/12/08(金) 00:49:380240デフォルトの名無しさん
2006/12/08(金) 00:53:24少なくともここじゃねえ
0241デフォルトの名無しさん
2006/12/09(土) 19:21:53keyPressed で JTable#getSelectedRow() で行を取得すると、
移動前の行が取れてしまうのが悩みの種です。
押したキーによって、+1、-1すればできますが、
もう少し良い方法があれば教えてください。お願いします。
0242241
2006/12/09(土) 19:59:48セルを行で選択するモードだと isCellEditable が呼ばれないんですね。どうしたものか。
0243デフォルトの名無しさん
2006/12/09(土) 20:32:19SelectionModel を使う。
0244デフォルトの名無しさん
2006/12/09(土) 20:49:50TableColumnModelListener,ListSelectionListener
の2つで横と縦の選択がとらえられる。
0245241
2006/12/09(土) 22:31:36ありがとうございました。早速試したところ、なんとか取れました。
あと、JTable#valueChanged(ListSelectionEvent) をオーバーライドしても取れました。
奥が深いですね。
0246デフォルトの名無しさん
2006/12/09(土) 23:25:58ペイントイベントもイベントとしての実装じゃないから手軽とはいかないし
SwingはJavaBeansをベースに作ってるといいながらどうもそういう実装になってないんだよね
getとsetが対になってないからプロパティとして表示されないとかも多いし
0247デフォルトの名無しさん
2006/12/13(水) 00:56:290248デフォルトの名無しさん
2006/12/13(水) 01:55:20コンパイルしなおしてなくても物によっては1.4倍くらいでてる
0249デフォルトの名無しさん
2006/12/14(木) 11:49:28この中の文字列に含まれる一部の「<」や「>」や「/」などが表示されません。
これらの文字をHTML要素として解釈させないため無効化するにはどうしたらいいのでしょうか?
Webブラウザ上でHTMLソースを表示させるときのように
「<」や「/」を実体参照に書き換えても表示できないようです。
0250249
2006/12/14(木) 12:37:250251デフォルトの名無しさん
2006/12/14(木) 12:41:39おれはふつうに>とかでできてるぞ
0252デフォルトの名無しさん
2006/12/14(木) 12:43:46&gt;
で普通に表示されてるよと
0253デフォルトの名無しさん
2006/12/14(木) 12:53:18レスありがとうございます。
< と >はうまくいったのですが、
<html> のあとに、「/」が入る部分があると表示されたり表示されなかったりで試行錯誤中です。
0254デフォルトの名無しさん
2006/12/14(木) 13:29:39bodyタグがはいっていないとかいうオチは?
0255デフォルトの名無しさん
2006/12/15(金) 07:27:32その線を座標の配列として得るにはどうしたらいいでしょうか?
0256デフォルトの名無しさん
2006/12/15(金) 09:34:57線は特にインスタンスを保持してないしデータもない。
このやりかたでを試してみな。
ttp://web.hc.keio.ac.jp/~fujimura/lang/page-16.html
0257デフォルトの名無しさん
2006/12/15(金) 10:45:24もっと簡単にできないものでしょうか
例えば(0,0),(0,5)をdrawLineで指定したとしたら
2点とその間にある(0,1),(0,2),(0,3),(0,4)が塗りつぶされます。
この4点の塗りつぶしをJavaはどのように実装しているのでしょうか?
この例のように予め2点を結ぶと水平,もしくは垂直になると分かっていればいいですが
(0,0),(2,5)のように水平及び垂直にならない場合,
drawLineはどのように計算して塗りつぶす点を決めているのでしょう?
0258デフォルトの名無しさん
2006/12/15(金) 11:19:16言っている意味がわからないし(何に対して水平、垂直?水平な点なんてありえないし)
255との繋がりも無いように読めるんだけど、結局何がしたいの?
つか256もけして難しくはないと思うんだけど。
実装について知りたければソース読め。
0259デフォルトの名無しさん
2006/12/15(金) 13:11:03ちょっと感動した。ソース読めってセリフが出てくるあたり。
まあ、ネイティブに飛ばしてない限りそこ読めば分かるよな。
0260デフォルトの名無しさん
2006/12/15(金) 13:16:380261デフォルトの名無しさん
2006/12/15(金) 13:31:08結構面倒臭い事しなきゃいかんような気もする。
1.1 までだったら Stroke とか無かったし、
アンチエイリアス云々って時代でもなかったから
ブレゼンハムアルゴリズムだけで出来たかもしらんけど。
0262デフォルトの名無しさん
2006/12/15(金) 13:45:06drawLineの実装ってどんなんだろ,と思ってソース見たのですが
Graphic見てもabstractで
Graphic2Dでオーバーライドしてるのかなと思ってもありませんでした。
どうやらdraw(Shape)っぽい漢字なのですが
Stroke云々ってあってめんどくさそうなのです。
>>258
水平,垂直ってのは結んだ線の話です。
(0,0)と(0,5)を結ぶと垂直な線になります。
ある2点を結んだときにできる線が通ることになる座標を
得るにはどうしたらいいか?ってことで伝わるでしょうか
0263デフォルトの名無しさん
2006/12/15(金) 13:46:41直線が2本あって、
その2本の線の交点の座標って求められるの?
ってことかい?
もしそれなら数学学べ
0264デフォルトの名無しさん
2006/12/15(金) 14:04:43全然話が違います
「ある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)を呼び出したときに
塗りつぶされる座標はどこになるのでしょうか?
0265デフォルトの名無しさん
2006/12/15(金) 14:09:00drawLine(0, 0, 5, 5)だと
(0,0),(1,1),(2,2),(3,3),(4,4),(5,5)
が塗りつぶされるけどどうやって計算するの?
ってことか?
やっぱ数学学べ
0266デフォルトの名無しさん
2006/12/15(金) 14:21:08線を書く前のキャンバスの画像と
線を書いた後のキャンバスの画像を比較すれば良い
前と後の同一座標のドットを比較して
違っていれば描画されていると判断すれば良いんじゃないか
0267デフォルトの名無しさん
2006/12/15(金) 14:23:28ソースを理解できないのなら手助けもするが、読むのが面倒なだけなら帰れ。
そしてスレ違い。
0268デフォルトの名無しさん
2006/12/15(金) 14:29:11可能でしょうか?
JFrameを継承すれば表示されますが、
Windowsのタスクバーにアプリケーションが2個上がってきてるように
見えるのでJDialogにしたいです。
0269デフォルトの名無しさん
2006/12/16(土) 02:53:26私が知っているのは↓の手法
Merlinの魔術: もう1つのシンプルなフレーム
ttp://www-06.ibm.com/jp/developerworks/java/011130/j_j-mer0717.html
A,この手法の場合、最小化、最大化アイコンを設定する必要あり。
B,たぶんもっといい方法があると思う。
0270デフォルトの名無しさん
2006/12/17(日) 10:51:19import 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);
}
}
0271デフォルトの名無しさん
2006/12/17(日) 11:00:39○見えない「ボタンの右半分」
0272デフォルトの名無しさん
2006/12/17(日) 20:29:21g.drawLine(0, 0, 10, 10);
とすると、線は(0,0)-(10,10)で描かれますが、文字の方は描かれません。
drawStringとdrawLineでは、座標の考え方が異なるようなのでしょうか?
0273272
2006/12/17(日) 20:43:03drawStringは文字の左下が基点になるのですね。
なんのためにそうなっているのかわかりませんが。。。
0274デフォルトの名無しさん
2006/12/17(日) 20:57:59それにこれはSwingと関係ないし
0275デフォルトの名無しさん
2006/12/17(日) 21:25:060276デフォルトの名無しさん
2006/12/17(日) 21:36:32おまえには関係ないし
0277デフォルトの名無しさん
2006/12/18(月) 12:11:24>>274自身には関係ないだろうが
スレに関係ないのは確かだ
日本語嫁よ
0278デフォルトの名無しさん
2006/12/18(月) 13:33:49シンプルな方法があったら教えて下さい!!
今は以下のようにして取得しています。
_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();
0279272
2006/12/18(月) 14:35:31JComponentの質問は良くて、Componentの質問はダメってことですか?
0280デフォルトの名無しさん
2006/12/18(月) 15:14:320281デフォルトの名無しさん
2006/12/18(月) 17:57:41どういうトリック?
0282デフォルトの名無しさん
2006/12/18(月) 17:58:32全角とTabの対応が入ってなくない?
Tabは入る位置によって文字列長が変わるから、結構面倒そう。
■ このスレッドは過去ログ倉庫に格納されています