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
0112デフォルトの名無しさん
2006/11/10(金) 21:50:28フォルダごと移動させれば他のPCに環境をそのまま移せるように。
設定ファイル以外にもいろいろ置きたいからjarのパスが知りたい。
0113108
2006/11/10(金) 23:31:12jarファイルを実行したときに、jarファイルと同じディレクトリにあるファイルで
拡張子が.zzzのもので、最終更新日が最新のものを自動的に読み込むという処理が
必要で、上記のような質問をさせて頂きました。
解決致しましたので、ご報告致します。
File f = new File(".") ;
String[ ] files = f.list( ) ;
これで実行ディレクトリのファイル一覧を配列に取得することができました。
ありがとうございました。
0114デフォルトの名無しさん
2006/11/10(金) 23:40:310115デフォルトの名無しさん
2006/11/10(金) 23:42:230116デフォルトの名無しさん
2006/11/10(金) 23:48:06俺なら保険的に<md5>.md5みたいなファイル用意して
確実に実行元がカレントディレクトリである必要があるようにするかも
0117デフォルトの名無しさん
2006/11/11(土) 04:15:14亀レスだけど、System.getProperty("java.class.path")
sunのVM限定だと思う。
他の方法としてはJARファイル内にリソースを格納して、
this.getClass().getClassLoader()#getResourceでURLを取得するとか。
0118デフォルトの名無しさん
2006/11/11(土) 09:24:40java.lang.System#getProperties()のjavadocに明記されてるし、
J2SE5.0の仕様の上ではVMによらず使用可能とみていいんじゃないかな。
0119デフォルトの名無しさん
2006/11/11(土) 16:24:32そこに設定ファイルを置いてファイルを取得
0120デフォルトの名無しさん
2006/11/11(土) 17:20:18jarと同じディレクトリに作りたいでしょ?
でも、いちいちクラスパス通したくない。ではjarのパスはどこ?
というお話し。
0121デフォルトの名無しさん
2006/11/11(土) 17:31:55関連するライブラリなどへのクラスパスは jar ファイルのマニュフェストに記述されると勝手に推測。
そこに resources への相対パスも追加すればいいんじゃまいかと思ったが
そもそも読み込むファイル名は決まっていないのね。
0122デフォルトの名無しさん
2006/11/11(土) 18:22:591.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利用者は意識する必要がない。
0123122
2006/11/11(土) 18:42:235.カレントディレクトリと1.の併用
log4jなどいくつかのソフトウェアで採用されている。
ツール系は、テンポラリに設定を変えたい時があるので、
この方法は便利。
結局、作成するアプリの性質によってどうデザインするか変わってくるよ。
0124デフォルトの名無しさん
2006/11/11(土) 18:44:200125デフォルトの名無しさん
2006/11/11(土) 18:50:01誰だよ、スレ違いの質問投げた奴は。
0126デフォルトの名無しさん
2006/11/11(土) 18:53:040127デフォルトの名無しさん
2006/11/11(土) 19:03:570128デフォルトの名無しさん
2006/11/11(土) 19:15:220129デフォルトの名無しさん
2006/11/12(日) 13:58:33これがふつー?だったらjavaやめる。
2000で1_4_2です。
ただフレームを表示するだけでも同じ症状がでるのですが。
0130デフォルトの名無しさん
2006/11/12(日) 14:03:060131デフォルトの名無しさん
2006/11/12(日) 14:11:35やっぱりそうなのか。
thx
PCが悪いのかな?
0132デフォルトの名無しさん
2006/11/12(日) 14:31:170133デフォルトの名無しさん
2006/11/12(日) 14:38:420134デフォルトの名無しさん
2006/11/12(日) 15:05:15import 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;}
}
こんなもんソースいらんだろ思ってさらさんかったんだが
色々変わってたりついてるけ症状はそんままだからこれで
改行が多すぎる言われまくったからかえたらすげーよみにくい。
0135デフォルトの名無しさん
2006/11/12(日) 16:24:14まだ初心者か?
Swingにはメニューバー用の専用メソッドがあるよ
他にもクラス設計など指摘したいところがたくさんあるがまあいいか
0136デフォルトの名無しさん
2006/11/12(日) 22:03:15最低限、改行して見やすいコードをさらせ。
0137デフォルトの名無しさん
2006/11/12(日) 23:04:37frame.setJMenuBar()
ttp://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/javax/swing/JFrame.html#setJMenuBar(javax.swing.JMenuBar)
0138デフォルトの名無しさん
2006/11/13(月) 11:11:58わ、サンクス!
わざわざありがとうございます。
>>136
改行多すぎる言われて修正しまくってこんなんなってしまったんです。orz
最初は普通だったのに。
0139デフォルトの名無しさん
2006/11/14(火) 15:51:022レスに分割するか、
レス消費に気を配っているorかなり長いソースの場合はアップローダを利用。
0140デフォルトの名無しさん
2006/11/15(水) 00:13:45JTableの縦横にヘッダがあってExcelみたいな感じのやつ。
0141デフォルトの名無しさん
2006/11/15(水) 11:37:56JSplitPane#setDividerLocation(9999)とか無理矢理やればできるのですが、
一応できるのですが、キレイな方法で。
JSplitPane#getMaximumDividerLocation()で値を取得して、
それを設定する方法も試しましたが、
フレームが起動するまでは正しい値が取得できないんですかね。ダメでした。
0142デフォルトの名無しさん
2006/11/15(水) 13:29:10JSplitPane#setDividerLocation(Integer.MAX_VALUE) とかやっとけば
0143デフォルトの名無しさん
2006/11/15(水) 14:00:41pack()読んだ時点で確定されない?
0144141
2006/11/15(水) 15:48:349999よりかはキレイですね。こっちにしておきます。どうもです。
>>143
pack()は使ってないので、フレームを表示するので確定しないようです。
0145デフォルトの名無しさん
2006/11/15(水) 17:23:540146デフォルトの名無しさん
2006/11/15(水) 17:50:42setPrefferedSize()とかJFrame#setSize()とかしないと、親コンポーネントが最小サイズになったり。
0147デフォルトの名無しさん
2006/11/15(水) 17:57:320148デフォルトの名無しさん
2006/11/15(水) 19:39:120149デフォルトの名無しさん
2006/11/15(水) 19:55:30java.awt.Point p = java.awt.MouseInfo.getPointerInfo().getLocation() ;
とか?1.5以降で.
0150デフォルトの名無しさん
2006/11/15(水) 19:59:26助かったー!
0152デフォルトの名無しさん
2006/11/19(日) 19:51:47Java2Dと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です。
0153デフォルトの名無しさん
2006/11/19(日) 20:23:00paint()じゃなくて
paintComponent()をオーバーライドしなされ
あと1.5.0_08はSwingにバグがあるので1.5.0_09にしたほうがいい
0154デフォルトの名無しさん
2006/11/20(月) 09:59:06問題が再現するコンパイル可能なソースを出した方がはやいと思うよ.
0155デフォルトの名無しさん
2006/11/20(月) 11:40:38public 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;
}
}
0156デフォルトの名無しさん
2006/11/20(月) 11:42:08public 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軸
}
}
こんなソースになります。マウスクリックすると短い横線の位置がタブの高さ分下に下がります。
ウィンドウサイズを変更すると元に戻り、またクリックすると位置が下がります。
0157デフォルトの名無しさん
2006/11/20(月) 21:00:04すまん,うけたw
0158デフォルトの名無しさん
2006/11/20(月) 21:35:16//g2.setTransform(af);
g2.transform(af);
理由はAPI説明のGraphics2D#setTransformの項をよく読むこと。
ちなみに、内部クラスから外側のクラスのインスタンスを参照したいときは、
Canvas.this.repaint();
のように「外側のクラス名.this」と書けば、selfのように自分で持っていなくてもいい。
ただし、外側のクラスが匿名クラスの場合は名前がないため、この書き方はできないので、
別の手段が必要だが。その中にはself=thisのような方法もとりうる方法のひとつではある。
0159157
2006/11/20(月) 21:41:14すれば何が期待通りになって,かつ何が起きてるのかわかると思われ.
# 初回描画時と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));
}
0160デフォルトの名無しさん
2006/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オブジェクトを取得してそれを使うべきで、
さらにそれ以後の座標変換も相対的な変換にすべきだったんですね。
よく分かりました。ありがとうございます。
0161デフォルトの名無しさん
2006/11/21(火) 13:51:45原点の位置が変わってしまうなんて、Swingって妙な仕様ですね・・・。
0162デフォルトの名無しさん
2006/11/21(火) 16:39:27なぜにそんなにsetTransformを使いたがるんだろうか。
setTransformはgetTransformで保存した元のコンテクストを、
描画終了時にリストアするときにだけ使うべきものとある。
描画時の座標変換にはtransform, rotate, scale, shearを使うだけでいい。
仕様が変というより、使い方が変だと思う。
変な使い方ができうるという点で仕様が悪いのかもしれないけど。
0163デフォルトの名無しさん
2006/11/21(火) 17:26:03Graphics2D 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
0164デフォルトの名無しさん
2006/11/21(火) 18:03:15そうですね。setTransformは今後控えます。
でもそれと関係なしに、マウスクリックした時と初回描画時orウィンドウサイズ変更時で描画領域の
原点位置が変わっていて、それをSwing(AWT?)がg2の変換行列を自動的に変えて無理やりつじつまを合わせている
というSwing(AWT?)の仕様がちょっと気になってしまいました。
0165デフォルトの名無しさん
2006/11/24(金) 18:35:490166デフォルトの名無しさん
2006/11/24(金) 21:30:27GridBagLayoutでいいじゃんってのは止めてね。
コンポーネント間隔の割合比率(パーセント)を<table>のように
自動計算でやってくれたりすると楽なんだけど…
0167・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6
2006/11/24(金) 23:14:020168・∀・)っ-○◎●創聖のダンゴリオン ◆DanGorION6
2006/11/24(金) 23:14:23○SWTアプリが
0169デフォルトの名無しさん
2006/11/24(金) 23:47:52割合ではないけどレイアウトマネージャほとんど理解しなくても使えるグループレイアウトは?
0170デフォルトの名無しさん
2006/11/25(土) 00:17:530171デフォルトの名無しさん
2006/11/25(土) 01:22:34XmlGridLayoutでも使ってみれば?
0172デフォルトの名無しさん
2006/11/25(土) 01:28:22需要大してなかったみたいだし、仕方ないね・・・
それにSWTの質問がしたい人はプラグ印スレに行けばいいし、なくても問題ないだろ。
(つーかSWTやる人のほとんどはプラグ印用途な気もするが。)
0173デフォルトの名無しさん
2006/11/25(土) 06:03:06Eclipse RCPとか使ったりね。もうバカかと。
0174デフォルトの名無しさん
2006/11/25(土) 19:09:10Eclipse RCPはそんなに悪く無いと思うがな
最近、RadRailsとかAptanaとか実際にそれなりに動くRCPアプリが結構出て来てるし
まあ、Eclipse RCPは実質Eclipseプラグインとほとんど変わらんのだが。
0175デフォルトの名無しさん
2006/11/25(土) 19:37:08ありがたや。ありたがや。
0176デフォルトの名無しさん
2006/11/27(月) 10:33:18な案件だと仕方なくSWTで作ることになる・・・
と思いきや、Swingでプロトタイプ作って見せると
やっぱこれで良いですになる今日この頃。
0177デフォルトの名無しさん
2006/11/27(月) 20:32:430178デフォルトの名無しさん
2006/11/30(木) 02:43:560179デフォルトの名無しさん
2006/12/02(土) 17:33:15UIManager.put("Menu.font", font);
UIManager.put("MenuItem.font", font);
0180デフォルトの名無しさん
2006/12/03(日) 16:15:58ありがとうございました。
0181デフォルトの名無しさん
2006/12/04(月) 00:49:10いくつも矩形を描いて中に文字をいれたいんだけど、文字の長さや幅に応じて
自動的に矩形のサイズを調節したり、矩形の表示位置がウィンドウをはみだしたり
他の矩形と重なったりしないように表示位置を自動で調節してくれるようにしたい。
こういうのって相当むずかしいですか?
0182デフォルトの名無しさん
2006/12/04(月) 00:52:170183181
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どうでもできるだろ。
■ このスレッドは過去ログ倉庫に格納されています