tag:crieit.net,2005:https://crieit.net/tags/Swing/feed 「Swing」の記事 - Crieit Crieitでタグ「Swing」に投稿された最近の記事 2020-01-09T09:39:32+09:00 https://crieit.net/tags/Swing/feed tag:crieit.net,2005:PublicArticle/15669 2020-01-09T09:39:32+09:00 2020-01-09T09:39:32+09:00 https://crieit.net/posts/Swing-Oracle-JTable 【Swing】Oracleに接続して取得したデータをJTable に表示してみる <p>前回に引き続き、Swingを弄ってみます。<br /> 今回はWPFの時と同様、猫の一覧を表示しました。</p> <p>プログラムは前回のものを流用します。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/09/09/2400/" target="_blank" rel="noopener noreferrer" data-blogcard="1">【Swing】Oracleに接続して取得したデータをコンボボックスに設定する</a></p> <h2 id="画面の変更"><a href="#%E7%94%BB%E9%9D%A2%E3%81%AE%E5%A4%89%E6%9B%B4">画面の変更</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/SwingJTable000.jpg" alt="JTableの配置" /></p> <p>JScrollPane、JTableを配置します。<br /> こうすることにより、JTableにヘッダー、スクロールバーが表示されるようになります。</p> <h2 id="プログラムの修正"><a href="#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E4%BF%AE%E6%AD%A3">プログラムの修正</a></h2> <h3 id="新規クラス(インナー)の追加"><a href="#%E6%96%B0%E8%A6%8F%E3%82%AF%E3%83%A9%E3%82%B9%EF%BC%88%E3%82%A4%E3%83%B3%E3%83%8A%E3%83%BC%EF%BC%89%E3%81%AE%E8%BF%BD%E5%8A%A0">新規クラス(インナー)の追加</a></h3> <p>検索ボタン押下時の処理を追加します。<br /> イベントは、「ActionListener」を実装したクラスで行います。</p> <p>MainForm.java</p> <pre><code> /** * 検索ボタンアクションリスナークラス * * @author doraxdora * */ public class SearchActionListener implements ActionListener { /** * イベントハンドラ. * */ @Override public void actionPerformed(ActionEvent event) { if (event.getSource().equals(btnSearch)) { try { // SQL文の組み立て // 画面で指定された条件を組み込む String sql = "SELECT C.NO" + ", C.NAME" + ", C.SEX" + ", C.AGE" + ", K.KIND_NAME" + ", C.FAVORITE" + " FROM TBLCAT C" + " LEFT OUTER JOIN MSTKIND K ON (" + " C.KIND_CD = K.KIND_CD" + " )"; String where = ""; String searchName = txSearchName.getText(); if (searchName != null &amp;&amp; !searchName.equals("")) { where = " WHERE C.NAME LIKE '" + searchName + "%'"; } String searchKind = (String)cbSearchKind.getSelectedItem(); if (searchKind != null &amp;&amp; !searchKind.equals("指定なし")) { if (where != "") { where += " AND"; } else { where += " WHERE"; } where += " K.KIND_NAME = '" + searchKind + "'"; } sql += where; sql += " ORDER BY C.NO"; // データを取得し、JTableにセットする TableModel の形に編集 DBAccess dba = new DBAccess(); ResultSet rs = dba.executeQuery(sql); List<String[]> list = new ArrayList<String[]>(); while (rs != null &amp;&amp; rs.next()) { String[] items = new String[6]; items[0] = rs.getString("NO"); items[1] = rs.getString("NAME"); items[2] = rs.getString("SEX"); items[3] = rs.getString("AGE"); items[4] = rs.getString("KIND_NAME"); items[5] = rs.getString("FAVORITE"); list.add(items); } // JTable にセット String[] columnHeader = {"No","名前","性別","年齢","種別","好物"}; DefaultTableModel tm = new DefaultTableModel((String[][])list.toArray(new String[0][0]), columnHeader); tblCatData.setModel(tm); } catch (Exception e) { System.out.println(e.getMessage()); } } } } </code></pre> <p> </p> <h3 id="初期化処理の修正"><a href="#%E5%88%9D%E6%9C%9F%E5%8C%96%E5%87%A6%E7%90%86%E3%81%AE%E4%BF%AE%E6%AD%A3">初期化処理の修正</a></h3> <p>少し整理しました。<br /> あとは検索ボタン押下時の処理に、作成したクラスをセットします。</p> <p>MainForm.java</p> <pre><code> /** * 画面生成処理. * */ public MainForm() { // メインパネル setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 480, 304); mainPanel = new JPanel(); mainPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(mainPanel); mainPanel.setLayout(new BorderLayout(0, 0)); JPanel panel = new JPanel(); FlowLayout flowLayout = (FlowLayout) panel.getLayout(); flowLayout.setHgap(10); flowLayout.setAlignment(FlowLayout.LEFT); mainPanel.add(panel, BorderLayout.NORTH); // 名前ラベル JLabel label = new JLabel("名前:"); panel.add(label); // 名前テキストボックス txSearchName = new JTextField(); panel.add(txSearchName); txSearchName.setColumns(10); // 種別ラベル JLabel label_1 = new JLabel("種別:"); panel.add(label_1); // 種別コンボボックス cbSearchKind = new JComboBox<String>(); cbSearchKind.setMinimumSize(new Dimension(100, 19)); cbSearchKind.setBounds(195, 7, 119, 19); panel.add(cbSearchKind); // 検索ボタン btnSearch = new JButton("検索"); // 検索ボタン押下時の処理としてインナークラスをセット btnSearch.addActionListener(new SearchActionListener()); panel.add(btnSearch); // スクロールパネル // JTableは基本スクロールパネルとセットで使用する // 縦横のスクロールおよび、ヘッダが表示されるようになります。 scrollPane = new JScrollPane(); mainPanel.add(scrollPane, BorderLayout.CENTER); // 猫一覧テーブル tblCatData = new JTable(); tblCatData.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); scrollPane.setViewportView(tblCatData); } </code></pre> <p> </p> <h2 id="起動してみる"><a href="#%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">起動してみる</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/SwingJTable001.jpg" alt="起動後画面" /></p> <p>起動後の画面です。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/SwingJTable002.jpg" alt="検索結果1" /></p> <p>検索条件を指定しないで検索した結果。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/SwingJTable003.jpg" alt="検索結果2" /></p> <p>名前を指定して検索した結果。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/SwingJTable004.jpg" alt="検索結果3" /></p> <p>種別を指定して検索した結果。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>Swingはひとまずここまでにするかもしれません。<br /> 次回は Java FX なんかもやってみようかなーとか思っています。</p> <p>ではでは。</p> doraxdora tag:crieit.net,2005:PublicArticle/15668 2020-01-09T09:37:13+09:00 2020-01-09T09:37:13+09:00 https://crieit.net/posts/Swing-Oracle 【Swing】Oracleに接続して取得したデータをコンボボックスに設定する <p>今回は、Oracleからデータを取得してコンボボックスに設定してみたいと思います。</p> <p>プロジェクトは前回のものを流用します。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/08/26/post-2203/" target="_blank" rel="noopener noreferrer">【Swing】eclipse に Swingプラグインをインストールして Hello Wolrd してみる</a></p> <h2 id="新規クラスの追加"><a href="#%E6%96%B0%E8%A6%8F%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E8%BF%BD%E5%8A%A0">新規クラスの追加</a></h2> <h3 id="パッケージの作成"><a href="#%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E4%BD%9C%E6%88%90">パッケージの作成</a></h3> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/SwingCombo000.jpg" alt="" /><br /> パッケージ・エクスプローラーから「src」を右クリックし、「新規」>「パッケージ」を選択します。</p> <div class="mceTemp"></div> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/SwingCombo001.jpg" alt="パッケージ作成" /></p> <p>パッケージ名を入力し、「完了」ボタンをクリックします。<br /> 今回は「jp.co.doraxdora.common」としました。</p> <h3 id="クラスの作成"><a href="#%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E4%BD%9C%E6%88%90">クラスの作成</a></h3> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/SwingCombo002.jpg" alt="クラス作成" /></p> <p>パッケージ・エクスプローラーから作成したパッケージを右クリックし、<br /> 「新規」>「クラス」を選択します。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/SwingCombo003.jpg" alt="クラス作成" /></p> <p>クラス名を入力し、「完了」ボタンをクリックします。<br /> 今回は「DBAccess」としました。</p> <p>DBAccess.java</p> <pre><code> /** * */ package jp.co.doraxdora.common; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.List; import oracle.jdbc.pool.OracleDataSource; /** * @author doraxdora * */ public class DBAccess { private static String DB_URL = "jdbc:oracle:thin:USER01/USER01@localhost:1521:XE"; private static Connection con = null; /** * コンストラクタ. * * @throws Exception */ public DBAccess() throws Exception{ super(); // ドライバのロード OracleDataSource ds = new OracleDataSource(); ds.setURL(DB_URL); // DB接続 con = ds.getConnection(); } /** * SQLを実行して結果を取得します. * @param sql * @return */ public ResultSet executeQuery(String sql) throws Exception { PreparedStatement stmt = con.prepareStatement(sql); return stmt.executeQuery(); } /** * パラメータを指定してSQLを実行し、結果を取得します. * * @param sql * @param param * @return * @throws Exception */ public ResultSet executeQuery(String sql, List<Object> param) throws Exception { PreparedStatement stmt = con.prepareStatement(sql); for (int i = 0; i < param.size(); i++) { if (param.get(i) instanceof String) { stmt.setString(i, (String) param.get(i)); } else if (param.get(i) instanceof Integer) { stmt.setInt(i, (int) param.get(i)); } } return stmt.executeQuery(); } } </code></pre> <p> </p> <h3 id="ライブラリの追加"><a href="#%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E8%BF%BD%E5%8A%A0">ライブラリの追加</a></h3> <p>Oracle からデータを取得するために、ライブラリを追加します。<br /> パッケージ・エクスプローラーからプロジェクトを右クリックし、「プロパティ」を開きます。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/SwingCombo004.jpg" alt="Javaのビルドパス" /></p> <p>「Javaのビルドパス」メニューを選択し、「ライブラリー」タブを表示、<br /> 「外部 JAR の追加」ボタンをクリックします。</p> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/SwingCombo005.jpg" alt="ファイル選択" /></p> <p>ファイル選択ダイアログが表示されるので、<br /> Oracle のインストールディレクトリから対象のファイルが格納されているフォルダを開きます。</p> <p>デフォルト(Oracle 11g XE)の場合は次の場所に格納されています。</p> <p>C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib</p> <p>ライブラリフォルダーに格納されている「ojdbc6.jar」を開きます。</p> <p> </p> <h3 id="画面の修正"><a href="#%E7%94%BB%E9%9D%A2%E3%81%AE%E4%BF%AE%E6%AD%A3">画面の修正</a></h3> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/SwingCombo006.jpg" alt="コンポーネントの配置" /></p> <p>WPFの時と同様に、名前ラベル・テキスト、種別ラベル・コンボボックス、ボタンを配置します。</p> <h3 id="プログラムの修正"><a href="#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E4%BF%AE%E6%AD%A3">プログラムの修正</a></h3> <p>初期表示時に、<br /> Oracle からデータを取得してコンボボックスに設定するように修正します。</p> <p>MainForm.java</p> <pre><code> package jp.co.doraxdora.form; import java.awt.EventQueue; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; import javax.swing.DefaultComboBoxModel; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.border.EmptyBorder; import jp.co.doraxdora.common.DBAccess; public class MainForm extends JFrame { private JPanel contentPane; private JTextField textField; private JComboBox<String> comboBox; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { MainForm frame = new MainForm(); // コンポーネント初期化 frame.initializeComponent(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public MainForm() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 462, 304); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); JLabel label = new JLabel("名前:"); label.setBounds(12, 10, 46, 13); contentPane.add(label); textField = new JTextField(); textField.setBounds(47, 7, 96, 19); contentPane.add(textField); textField.setColumns(10); JLabel label_1 = new JLabel("種別:"); label_1.setBounds(159, 10, 56, 13); contentPane.add(label_1); comboBox = new JComboBox(); comboBox.setBounds(195, 7, 119, 19); contentPane.add(comboBox); JButton btnNewButton = new JButton("検索"); btnNewButton.setBounds(345, 6, 91, 21); contentPane.add(btnNewButton); } /** * コンポーネントの初期化処理. * */ private void initializeComponent() throws Exception { DBAccess dba = new DBAccess(); ResultSet rs = dba.executeQuery("SELECT * FROM MSTKIND ORDER BY KIND_CD"); List<String> list = new ArrayList<String>(); while (rs != null &amp;&amp; rs.next()) { list.add((rs.getString("KIND_NAME"))); } DefaultComboBoxModel<String> model = new DefaultComboBoxModel<String>((String[])list.toArray(new String[0])); comboBox.setModel(model); } } </code></pre> <p> </p> <h2 id="起動してみる"><a href="#%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">起動してみる</a></h2> <p><img src="https://www.doraxdora.com/wp-content/uploads/2017/09/SwingCombo007.jpg" alt="画面" /></p> <p>無事にデータを設定することができました。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>ひとまずデータの取得まではできたので、<br /> 次回はデータテーブルを設置して、検索したデータを表示するところをやろうかと思います。</p> <p>ではでは。</p> <p> </p> doraxdora