第 2 章 GUI ツールの概要 3
3.7 デッドラインミスを検索する機能の実装
try {
I m a g e I O . w r i t e ( S w i n g F X U t i l s . f r o m F X I m a g e ( image , n u l l ) , " png " , fi l e ) ;
} c a t c h ( I O E x c e p t i o n e ) { e . p r i n t S t a c k T r a c e () ; }
}
エクスポートを行う際には、現在表示されているチャートがそのままエクスポートされ る。表示範囲やズーム回数なども反映してエクスポートを行うことができる。実際に表示 範囲として
6700〜6730
ティックを指定し、ズームを2
回行った状態でエクスポートした 画像が図3.15
である。図
3.15:
表示範囲を指定しズームしてエクスポートした画像図
3.16:
デッドラインミス検索のメニュー 図3.17:
検索されたデッドラインミスの表示図
3.18:
入力ファイル未選択のエラー表示Listing 3.16:
デッドラインミス検索のメニュー表示の実装...
p u b l i c c l a s s C h a r t C r e a t e r e x t e n d s A p p l i c a t i o n { ...
@ O v e r r i d e
p u b l i c v o i d s t a r t ( S t a g e s t a g e ) { ...
Me n u m e n u D e a d l i n e M i s s = new M e n u (" D e a d l i n e M i s s ") ; M e n u I t e m n e x t = new M e n u I t e m (" N e x t ") ;
ne x t . s e t O n A c t i o n ( new E v e n t H a n d l e r < A c t i o n E v e n t >() { p u b l i c v o i d h a n d l e ( A c t i o n E v e n t t ) {
try {
ne x t ( s t a g e ) ;
} c a t c h ( E x c e p t i o n e ) {
A l e r t c h a r t N u l l = new A l e r t ( A l e r t T y p e . E R R O R ) ; c h a r t N u l l . s e t T i t l e (" E r r o r ") ;
c h a r t N u l l . s e t C o n t e n t T e x t (" O p e n a f i l e f i r s t .") ; c h a r t N u l l . s h o w A n d W a i t () . i f P r e s e n t ( r e s p o n s e - > {
if ( r e s p o n s e == B u t t o n T y p e . OK ) { r e t u r n ;
} }) ; }
}
}) ;
M e n u I t e m p r e v i o u s = new M e n u I t e m (" P r e v i o u s ") ;
p r e v i o u s . s e t O n A c t i o n ( new E v e n t H a n d l e r < A c t i o n E v e n t >() { p u b l i c v o i d h a n d l e ( A c t i o n E v e n t t ) {
try {
p r e v i o u s ( s t a g e ) ; } c a t c h ( E x c e p t i o n e ) {
A l e r t c h a r t N u l l = new A l e r t ( A l e r t T y p e . E R R O R ) ; c h a r t N u l l . s e t T i t l e (" E r r o r ") ;
c h a r t N u l l . s e t C o n t e n t T e x t (" O p e n a f i l e f i r s t .") ; c h a r t N u l l . s h o w A n d W a i t () . i f P r e s e n t ( r e s p o n s e - > {
if ( r e s p o n s e == B u t t o n T y p e . OK ) { r e t u r n ;
} }) ; }
} }) ; ...
3.2
節で記述した入力ファイルの読み取りの部分でデッドラインミスが発生した時刻の重 複を排除した昇順のリストをあらかじめ作成しておく。これによって現在グラフに描画さ れてい部分にデッドラインミスが発生していなくても、デッドラインミスの発生箇所に ジャンプすることができる。メニューからDeadline Miss
→Next
を選択した際に呼び出 されるChartCreater
クラスのnext()
メソッドの実装は以下Listing3.17
である。前述した 入力ファイルが未選択の場合のエラー処理もここに記述されている。デッドラインミスが 発生した時刻のリストを参照し、次のデッドラインの時刻を中央に表示するグラフを表示 する。また、最後のデッドラインミスであるにもかかわらず、Nextが呼び出された場合 には図3.19
のようなエラーメッセージを表示する。図
3.19:
最後のデッドラインミスであることを示すエラー表示Listing 3.17:
デッドラインミスの後方への検索...
p u b l i c c l a s s C h a r t C r e a t e r e x t e n d s A p p l i c a t i o n { ...
p u b l i c v o i d n e x t ( S t a g e s t a g e ) t h r o w s E x c e p t i o n { if ( c h a r t == n u l l ) {
t h r o w new E x c e p t i o n () ; }
int c u r r e n t I n d e x = 0;
A r r a y L i s t < Integer > d e a d l i n e M i s s T i m e L i s t = g e t D e a d l i n e M i s s T i m e L i s t () ;
if ( d e a d l i n e M i s s T i m e L i s t == n u l l || d e a d l i n e M i s s T i m e L i s t . i s E m p t y () == t r u e || d e a d l i n e M i s s T i m e L i s t . s i z e () == 0) {
A l e r t n o D e a d l i n e M i s s = new A l e r t ( A l e r t T y p e . I N F O R M A T I O N ) ; n o D e a d l i n e M i s s . s e t T i t l e (" I n f o r m a t i o n ") ;
n o D e a d l i n e M i s s . s e t C o n t e n t T e x t (" T h e r e is no d e a d l i n e m i s s .") ; n o D e a d l i n e M i s s . s h o w A n d W a i t () . i f P r e s e n t ( r e s p o n s e - > {
if ( r e s p o n s e == B u t t o n T y p e . OK ) { r e t u r n ;
} }) ; } e l s e {
if ( d e a d l i n e m i s s I n d e x < d e a d l i n e M i s s T i m e L i s t . s i z e () - 1) { d e a d l i n e m i s s I n d e x ++;
int l a s t T i m e = t a s k L i s t . get ( t a s k L i s t . s i z e () - 1) . g e t T i m e () ;
int d e a d l i n e M i s s T i m e = d e a d l i n e M i s s T i m e L i s t . get ( d e a d l i n e m i s s I n d e x ) ;
if ( l a s t T i m e <= 50 || d e a d l i n e M i s s T i m e <= 25) { c r e a t e C h a r t (0 , l a s t T i m e , s t a g e ) ;
c u r r e n t M i n T i m e = 0;
c u r r e n t M a x T i m e = l a s t T i m e ;
} e l s e if ( l a s t T i m e >= 50 && d e a d l i n e M i s s T i m e >=
l a s t T i m e - 25) {
c r e a t e C h a r t ( l a s t T i m e - 50 , l a s t T i m e , s t a g e ) ; c u r r e n t M i n T i m e = l a s t T i m e - 50;
c u r r e n t M a x T i m e = l a s t T i m e ; } e l s e {
c r e a t e C h a r t ( d e a d l i n e M i s s T i m e - 25 , d e a d l i n e M i s s T i m e + 25 , s t a g e ) ;
c u r r e n t M i n T i m e = d e a d l i n e M i s s T i m e - 25;
c u r r e n t M a x T i m e = d e a d l i n e M i s s T i m e + 25;
} } e l s e {
int l a s t T i m e = t a s k L i s t . get ( t a s k L i s t . s i z e () - 1) . g e t T i m e () ;
int d e a d l i n e M i s s T i m e = d e a d l i n e M i s s T i m e L i s t . get ( d e a d l i n e m i s s I n d e x ) ;
if ( l a s t T i m e <= 50 || d e a d l i n e M i s s T i m e <= 25) { c r e a t e C h a r t (0 , l a s t T i m e , s t a g e ) ;
c u r r e n t M i n T i m e = 0;
c u r r e n t M a x T i m e = l a s t T i m e ;
} e l s e if ( l a s t T i m e >= 50 && d e a d l i n e M i s s T i m e >=
l a s t T i m e - 25) {
c r e a t e C h a r t ( l a s t T i m e - 50 , l a s t T i m e , s t a g e ) ; c u r r e n t M i n T i m e = l a s t T i m e - 50;
c u r r e n t M a x T i m e = l a s t T i m e ; } e l s e {
c r e a t e C h a r t ( d e a d l i n e M i s s T i m e - 25 , d e a d l i n e M i s s T i m e + 25 , s t a g e ) ;
c u r r e n t M i n T i m e = d e a d l i n e M i s s T i m e - 25;
c u r r e n t M a x T i m e = d e a d l i n e M i s s T i m e + 25;
}
A l e r t n o N e x t D e a d l i n e M i s s = new A l e r t ( A l e r t T y p e . I N F O R M A T I O N ) ;
n o N e x t D e a d l i n e M i s s . s e t T i t l e (" I n f o r m a t i o n ") ;
n o N e x t D e a d l i n e M i s s . s e t C o n t e n t T e x t (" T h i s is the l a s t d e a d l i n e m i s s .") ;
n o N e x t D e a d l i n e M i s s . s h o w A n d W a i t () . i f P r e s e n t ( r e s p o n s e - > { if ( r e s p o n s e == B u t t o n T y p e . OK ) {
r e t u r n ; }
}) ; }
} } ...
メニューから
Deadline Miss
→Previous
を選択した際に呼び出されるChartCreater
クラスの
prev()
メソッドの実装は以下Listing3.18
である。また、最初のデッドラインミスであるにもかかわらず、Previousが呼び出された場合には図
3.20
のようなエラーメッセー ジを表示する。図
3.20:
最初のデッドラインミスであることを示すエラー表示Listing 3.18:
デッドラインミスの前方への検索...
p u b l i c c l a s s C h a r t C r e a t e r e x t e n d s A p p l i c a t i o n { ...
p u b l i c v o i d p r e v ( S t a g e s t a g e ) t h r o w s E x c e p t i o n { if ( c h a r t == n u l l ) {
t h r o w new E x c e p t i o n () ; }
A r r a y L i s t < Integer > d e a d l i n e M i s s T i m e L i s t = g e t D e a d l i n e M i s s T i m e L i s t () ;
if ( d e a d l i n e M i s s T i m e L i s t == n u l l || d e a d l i n e M i s s T i m e L i s t . i s E m p t y () == t r u e || d e a d l i n e M i s s T i m e L i s t . s i z e () == 0) {
A l e r t n o D e a d l i n e M i s s = new A l e r t ( A l e r t T y p e . I N F O R M A T I O N ) ; n o D e a d l i n e M i s s . s e t T i t l e (" I n f o r m a t i o n ") ;
n o D e a d l i n e M i s s . s e t C o n t e n t T e x t (" T h e r e is no d e a d l i n e m i s s .") ; n o D e a d l i n e M i s s . s h o w A n d W a i t () . i f P r e s e n t ( r e s p o n s e - > {
if ( r e s p o n s e == B u t t o n T y p e . OK ) { r e t u r n ;
} }) ; } e l s e {
if ( d e a d l i n e m i s s I n d e x > 0) { d e a d l i n e m i s s I n d e x - -;
int l a s t T i m e = t a s k L i s t . get ( t a s k L i s t . s i z e () - 1) . g e t T i m e () ;
int d e a d l i n e M i s s T i m e = d e a d l i n e M i s s T i m e L i s t . get ( d e a d l i n e m i s s I n d e x ) ;
if ( l a s t T i m e <= 50 || d e a d l i n e M i s s T i m e <= 25) { c r e a t e C h a r t (0 , l a s t T i m e , s t a g e ) ;
c u r r e n t M i n T i m e = 0;
c u r r e n t M a x T i m e = l a s t T i m e ;
} e l s e if ( l a s t T i m e >= 50 && d e a d l i n e M i s s T i m e >=
l a s t T i m e - 25) {
c r e a t e C h a r t ( l a s t T i m e - 50 , l a s t T i m e , s t a g e ) ; c u r r e n t M i n T i m e = l a s t T i m e - 50;
c u r r e n t M a x T i m e = l a s t T i m e ; } e l s e {
c r e a t e C h a r t ( d e a d l i n e M i s s T i m e - 25 , d e a d l i n e M i s s T i m e + 25 , s t a g e ) ;
c u r r e n t M i n T i m e = d e a d l i n e M i s s T i m e - 25;
c u r r e n t M a x T i m e = d e a d l i n e M i s s T i m e + 25;
} } e l s e {
d e a d l i n e m i s s I n d e x = 0;
int l a s t T i m e = t a s k L i s t . get ( t a s k L i s t . s i z e () - 1) . g e t T i m e () ;
int d e a d l i n e M i s s T i m e = d e a d l i n e M i s s T i m e L i s t . get (0) ; if ( l a s t T i m e <= 50 || d e a d l i n e M i s s T i m e <= 25) {
c r e a t e C h a r t (0 , l a s t T i m e , s t a g e ) ; c u r r e n t M i n T i m e = 0;
c u r r e n t M a x T i m e = l a s t T i m e ;
} e l s e if ( l a s t T i m e >= 50 && d e a d l i n e M i s s T i m e >=
l a s t T i m e - 25) {
c r e a t e C h a r t ( l a s t T i m e - 50 , l a s t T i m e , s t a g e ) ; c u r r e n t M i n T i m e = l a s t T i m e - 50;
c u r r e n t M a x T i m e = l a s t T i m e ; } e l s e {
c r e a t e C h a r t ( d e a d l i n e M i s s T i m e - 25 , d e a d l i n e M i s s T i m e + 25 , s t a g e ) ;
c u r r e n t M i n T i m e = d e a d l i n e M i s s T i m e - 25;
c u r r e n t M a x T i m e = d e a d l i n e M i s s T i m e + 25;
}
A l e r t n o N e x t D e a d l i n e M i s s = new A l e r t ( A l e r t T y p e . I N F O R M A T I O N ) ;
n o N e x t D e a d l i n e M i s s . s e t T i t l e (" I n f o r m a t i o n ") ;
n o N e x t D e a d l i n e M i s s . s e t C o n t e n t T e x t (" T h i s is the f i r s t d e a d l i n e m i s s .") ;
n o N e x t D e a d l i n e M i s s . s h o w A n d W a i t () . i f P r e s e n t ( r e s p o n s e - > { if ( r e s p o n s e == B u t t o n T y p e . OK ) {
r e t u r n ; }
}) ; }
} }
なお、前方への検索でも後方への検索でもデッドラインミスが存在しない場合は図
3.21
のように表示される。図