回答の前にまず、teratailはマルチポストの推奨はしていません。
推奨しないだけで禁止ではないので、下記対応をお願いします(Qiitaのポリシーは知りません)
[Q&A] 5秒ごとに画像が変わるスライドショーを作りたいです - Qiita
他のサービスにも質問投稿をしたい(してしまった)
teratailでは、マルチポスト※の推奨はしていません。
やむを得ず複数のサイトに質問を投稿された場合は、質問内容にマルチポストをする理由を書き、他のサイトの投稿へのリンクを貼ってください。また、解決した際には必ずteratail及びすべての投稿に解決した旨と、どのように解決したかを記載してください。
また、teratail上で誤って同じ質問を複数投稿してしまった場合は、質問の削除リクエストを送ってください。
※「マルチポスト」とは、同じ内容の文章を複数のQ&Aサイトや掲示板などへ投稿することです。
ヘルプ|teratail(テラテイル)
参考サイトはリンクになるようにしましょう。その際は原典にあたるようにしましょう。
java - Auto Slideshow in JavaFX Pagination - Stack Overflow
あとこちらの質問も、結局やりたいことは同じですよね?
Eclipse - スライドショーを作りたい|teratail
Eclipse - 時間制のスライドショーを作成したい|teratail
回答のついていないこの2つは削除申請し、この質問のタイトルは「スライドショー」を入れたわかりやすい名前に変えてください。
さて回答ですがこんな感じでしょうか?
じわじわメモリ使用量が増えてリークしていそうな気がしますが、Image
やImageView
をキャッシュしても変わりませんでした。。。
ちょっとよくわかりません^^;
Java
1 import java . io . File ;
2 import java . util . ArrayList ;
3 import java . util . Arrays ;
4 import java . util . List ;
5
6 import javafx . animation . KeyFrame ;
7 import javafx . animation . Timeline ;
8 import javafx . application . Application ;
9 import javafx . event . ActionEvent ;
10 import javafx . event . EventHandler ;
11 import javafx . scene . Scene ;
12 import javafx . scene . control . Button ;
13 import javafx . scene . control . Pagination ;
14 import javafx . scene . image . Image ;
15 import javafx . scene . image . ImageView ;
16 import javafx . scene . layout . BorderPane ;
17 import javafx . scene . layout . VBox ;
18 import javafx . stage . Stage ;
19 import javafx . util . Duration ;
20
21
22 public class Main extends Application {
23 public static void main ( String [ ] args ) { launch ( args ) ; }
24
25 @Override public void start ( Stage primaryStage ) {
26 BorderPane root = new BorderPane ( ) ;
27 Button button = new Button ( "スライドショー" ) ;
28 button . setOnAction ( new saiEventHandler ( ) ) ;
29
30 root . setCenter ( button ) ;
31 primaryStage . setScene ( new Scene ( root , 500 , 400 ) ) ;
32 primaryStage . show ( ) ;
33 }
34 }
35
36 class saiEventHandler implements EventHandler < ActionEvent > {
37 public void handle ( ActionEvent e ) {
38 List < String > exts = Arrays . asList ( ".bmp" , ".gif" , ".jpg" , ".jpeg" , ".png" ) ; // 画像拡張子
39
40 File dir = new File ( "image" ) ; // 該当フォルダ
41 File [ ] files = dir . listFiles ( ) ; // 該当フォルダのフォルダ・ファイルを列挙
42
43 List < File > images = new ArrayList < > ( ) ; // 画像ファイル
44 for ( File file : files ) {
45 if ( file . isDirectory ( ) ) continue ; // フォルダは無視
46
47 String fileName = file . getName ( ) ; // 名前
48 int index = fileName . lastIndexOf ( "." ) ;
49 if ( index == - 1 ) continue ; // 拡張子がなければ無視
50
51 String ext = fileName . substring ( index ) ; // 拡張子(.込み)
52 if ( exts . contains ( ext ) ) images . add ( file ) ; // 拡張子が画像だったら追加
53 }
54
55
56 Pagination pagination = new Pagination ( images . size ( ) ) ;
57 pagination . setPageFactory ( pageIndex -> new ImageView ( new Image ( images . get ( pageIndex ) . toURI ( ) . toString ( ) ) ) ) ;
58
59 Timeline fiveSecondsWonder = new Timeline ( new KeyFrame ( Duration . seconds ( 5 ) , event -> {
60 int pos = ( pagination . getCurrentPageIndex ( ) + 1 ) % pagination . getPageCount ( ) ;
61 pagination . setCurrentPageIndex ( pos ) ;
62 } ) ) ;
63 fiveSecondsWonder . setCycleCount ( Timeline . INDEFINITE ) ;
64 fiveSecondsWonder . play ( ) ;
65
66 Stage stage5 = new Stage ( ) ;
67 // Paginationのコントローラ部分を隠す(セコいw ちゃんとやるならcssをあてる .pagination .pagination-control { visibility: hidden; })
68 stage5 . setScene ( new Scene ( new VBox ( pagination ) , 200 , 100 ) ) ;
69 stage5 . show ( ) ;
70 }
71 }
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/06 09:36
2021/01/06 09:43
2021/01/06 10:19
2021/01/06 10:26
2021/01/06 10:27
2021/01/06 10:54