個数があらかじめわかっている場合は配列もいいですが、個数が不明な場合はリストを使いましょう。
ArrayList (Java Platform SE 8 )
せっかくBook
クラスを作ったんですから、最初からBook
クラスに入れてしまいましょう(多次元配列はややこしくなりがちなので、できるだけ避けたほうがいいです)
Java
1 //String data[][];
2 ArrayList < Book > books ;
この時、複数の蔵書がマッチした場合、進むボタンを押すと2個目、3個目の蔵書情報がテキストフィールドに表示でき、戻るボタンを押すと前の蔵書情報を表示する方法を教えて頂きたいです。
if分でどうにかやろうと思いましたが全くできませんでした。
最初は1件だけの表示だったんでしょうか?(それを拡張しようとして今こうなっている?)
何件ヒットするかわからない以上、このアプローチ(if文)はどう考えても無理がありますよね?
よく考えてください。
棚に複数の本があって、今そのうちの一冊を手に取っています。
次に進むにはそれを棚に返し、隣の本を手に持ちますね?
つまり蔵書とは別で「今手に取っている本」という変数がいるのです。
本自体を変数にする(Book current
のような)場合もありますが、今回は棚の左から何番目という「インデックス番号」のほうがいいでしょう。
進むにはインデックスを増やし、戻るときは減らします(もちろん行き過ぎないようにする必要があります)
検索も同じように蔵書とは別の、「検索にヒットした本のリスト」変数を用意すればいいでしょう。
Java
1 import java . awt . GridBagConstraints ;
2 import java . awt . GridBagLayout ;
3 import java . awt . event . ActionEvent ;
4 import java . awt . event . ActionListener ;
5 import java . io . BufferedReader ;
6 import java . io . FileReader ;
7 import java . util . ArrayList ;
8 import javax . swing . BorderFactory ;
9 import javax . swing . JButton ;
10 import javax . swing . JFrame ;
11 import javax . swing . JLabel ;
12 import javax . swing . JPanel ;
13 import javax . swing . JTextField ;
14
15
16 public class BookData extends JFrame implements ActionListener {
17 public static void main ( String [ ] args ) {
18 new BookData ( "Search Book" ) . setVisible ( true ) ;
19 }
20
21 private JButton searchButton = new JButton ( "検索" ) ;
22 private JButton previousButton = new JButton ( "<" ) ;
23 private JButton nextButton = new JButton ( ">" ) ;
24 private JButton saveButton = new JButton ( "検索結果保存" ) ;
25
26 private JTextField searchText = new JTextField ( ) ;
27 private JLabel resultText = new JLabel ( ) ;
28 private JLabel indexText = new JLabel ( ) ;
29
30 private JTextField titleText = new JTextField ( ) ;
31 private JTextField authorText = new JTextField ( ) ;
32 private JTextField publisherText = new JTextField ( ) ;
33 private JTextField yopText = new JTextField ( ) ;
34 private JTextField isbnText = new JTextField ( ) ;
35
36 private ArrayList < Book > books = new ArrayList < Book > ( ) ; // 全部の本
37 private ArrayList < Book > searchBooks = new ArrayList < Book > ( ) ; // 検索にヒットした本
38 private int index ; // 今表示中の本の(searchBooks中の)インデックス番号
39
40 BookData ( String title ) {
41 super ( title ) ;
42 setSize ( 800 , 400 ) ;
43 setLocationRelativeTo ( null ) ;
44 setDefaultCloseOperation ( EXIT_ON_CLOSE ) ;
45
46 initialize ( ) ;
47 readCsv ( "booklist.csv" ) ;
48 updateText ( ) ;
49 }
50
51 private void initialize ( ) {
52 JPanel panel = new JPanel ( new GridBagLayout ( ) ) ;
53 panel . setBorder ( BorderFactory . createEmptyBorder ( 10 , 20 , 10 , 20 ) ) ;
54 GridBagConstraints gbc = new GridBagConstraints ( ) ;
55 gbc . fill = GridBagConstraints . HORIZONTAL ;
56 gbc . weighty = 1 ;
57
58 gbc . gridy = 0 ;
59 panel . add ( new JLabel ( "検索語:" ) , gbc ) ;
60 gbc . gridy = 1 ;
61 panel . add ( new JLabel ( "結果:" ) , gbc ) ;
62 gbc . gridy = 2 ;
63 panel . add ( new JLabel ( "タイトル:" ) , gbc ) ;
64 gbc . gridy = 3 ;
65 panel . add ( new JLabel ( "著者:" ) , gbc ) ;
66 gbc . gridy = 4 ;
67 panel . add ( new JLabel ( "出版社:" ) , gbc ) ;
68 gbc . gridy = 5 ;
69 panel . add ( new JLabel ( "出版年:" ) , gbc ) ;
70 gbc . gridy = 6 ;
71 panel . add ( new JLabel ( "ISBN:" ) , gbc ) ;
72
73 gbc . gridx = 1 ;
74 gbc . gridy = 0 ;
75 gbc . weightx = 1 ;
76 panel . add ( searchText , gbc ) ;
77 gbc . gridy = 1 ;
78 panel . add ( resultText , gbc ) ;
79 gbc . gridy = 2 ;
80 panel . add ( titleText , gbc ) ;
81 gbc . gridy = 3 ;
82 panel . add ( authorText , gbc ) ;
83 gbc . gridy = 4 ;
84 panel . add ( publisherText , gbc ) ;
85 gbc . gridy = 5 ;
86 panel . add ( yopText , gbc ) ;
87 gbc . gridy = 6 ;
88 panel . add ( isbnText , gbc ) ;
89
90 gbc . anchor = GridBagConstraints . CENTER ;
91 gbc . fill = GridBagConstraints . NONE ;
92 gbc . gridx = 0 ;
93 gbc . gridy = 7 ;
94 gbc . gridwidth = 2 ;
95 JPanel panel2 = new JPanel ( ) ;
96 panel2 . add ( previousButton ) ;
97 panel2 . add ( indexText ) ;
98 panel2 . add ( nextButton ) ;
99 panel . add ( panel2 , gbc ) ;
100
101 gbc . anchor = GridBagConstraints . EAST ;
102 gbc . gridy = 7 ;
103 panel . add ( saveButton , gbc ) ;
104
105 gbc . anchor = GridBagConstraints . CENTER ;
106 gbc . gridx = 2 ;
107 gbc . gridy = 0 ;
108 gbc . gridwidth = 1 ;
109 gbc . weightx = 0 ;
110 panel . add ( searchButton , gbc ) ;
111
112 add ( panel ) ;
113
114 searchText . addActionListener ( this ) ; // Enterキーを押したとき
115 searchButton . addActionListener ( this ) ;
116 previousButton . addActionListener ( this ) ;
117 nextButton . addActionListener ( this ) ;
118 // saveButton.addActionListener(this);
119 }
120
121 private void readCsv ( String filePath ) {
122 try ( BufferedReader br = new BufferedReader ( new FileReader ( filePath ) ) ) {
123 String line ;
124 while ( ( line = br . readLine ( ) ) != null ) {
125 String [ ] split = line . split ( "," ) ;
126 Book book = new Book ( split [ 0 ] , split [ 1 ] , split [ 2 ] , split [ 3 ] , split [ 4 ] ) ;
127 books . add ( book ) ;
128 searchBooks . add ( book ) ;
129 }
130 } catch ( Exception e ) {
131 e . printStackTrace ( ) ;
132 }
133 }
134
135 @Override public void actionPerformed ( ActionEvent e ) {
136 if ( e . getSource ( ) == searchButton || e . getSource ( ) == searchText ) {
137 searchBooks . clear ( ) ;
138 index = 0 ;
139 String s = searchText . getText ( ) ;
140 for ( Book book : books ) {
141 // sが空文字列 "" だった場合true なので空で再検索すると全件表示
142 if ( book . contains ( s ) ) {
143 searchBooks . add ( book ) ;
144 }
145 }
146 } else if ( e . getSource ( ) == nextButton ) {
147 if ( index < searchBooks . size ( ) - 1 ) {
148 index ++ ;
149 }
150 } else if ( e . getSource ( ) == previousButton ) {
151 if ( 0 < index ) {
152 index -- ;
153 }
154 }
155
156 updateText ( ) ; // 表示の更新
157 }
158
159 private void updateText ( ) {
160 Book book ;
161 if ( searchBooks . isEmpty ( ) ) { // 検索結果がなかった時
162 // titleText.setText("") のようにするのは
163 // コードが重複するのでカラのBookを与えちゃう
164 book = Book . empty ;
165 } else {
166 book = searchBooks . get ( index ) ;
167 }
168
169 resultText . setText ( searchBooks . size ( ) + " / " + books . size ( ) + " 件" ) ;
170 indexText . setText ( String . valueOf ( index + 1 ) ) ;
171
172 titleText . setText ( book . getTitle ( ) ) ;
173 authorText . setText ( book . getAuthor ( ) ) ;
174 publisherText . setText ( book . getPublisher ( ) ) ;
175 yopText . setText ( book . getYop ( ) ) ;
176 isbnText . setText ( book . getIsbn ( ) ) ;
177 }
178 }
179
180 class Book {
181 private String title ;
182 private String author ;
183 private String publisher ;
184 private String yop ;
185 private String isbn ;
186
187 public static Book empty = new Book ( ) ; // カラのBook
188
189 private Book ( ) { } // empty用
190
191 public Book ( String title , String author , String publisher , String yop , String isbn ) {
192 this . title = title ;
193 this . author = author ;
194 this . publisher = publisher ;
195 this . yop = yop ;
196 this . isbn = isbn ;
197 }
198
199 public boolean contains ( String s ) { // どれかのメンバに部分一致しているかどうか
200 return title . contains ( s ) || author . contains ( s ) || publisher . contains ( s )
201 || yop . contains ( s ) || isbn . contains ( s ) ;
202 }
203
204 public String getTitle ( ) { return title ; }
205
206 public void setTitle ( String title ) { this . title = title ; }
207
208 public String getAuthor ( ) { return author ; }
209
210 public void setAuthor ( String author ) { this . author = author ; }
211
212 public String getPublisher ( ) { return publisher ; }
213
214 public void setPublisher ( String publisher ) { this . publisher = publisher ; }
215
216 public String getYop ( ) { return yop ; }
217
218 public void setYop ( String yop ) { this . yop = yop ; }
219
220 public String getIsbn ( ) { return isbn ; }
221
222 public void setIsbn ( String isbn ) { this . isbn = isbn ; }
223 }
以降本題とは関係ない細かい点。
button1) { //検索ボタン
コメントをつけるくらいなら、わかりやすい変数名にしましょう。
文字列が含まれているかどうかは、indexOf
よりcontains
のほうがわかりやすいです。
String#contains (Java Platform SE 8 )
一覧性を考えると、JTable
を検討されてもよさそうです(結構難しいですが^^;
JTable (Java Platform SE 8 )
How to Use Tables (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)