環境準備 Eclipse は Pleiades の Neon です。Swing を使用する為の WindowBuilder のインストールとプロジェクト作成は、▼ 以下のリンク先を参照して下さい。 Pleiades All in One(NEON) で、Windows アプリを作成する手順( WindowBuilder + Swing デザイナー or SWT デザイナー[JFace] ) WEB へのアクセスは okhttp を使用します。ライブラリは MAVEN で取り込みます。okhttp は okio に依存しますが、リポジトリのファイルが壊れている場合は、okio の dependency も記述して、旧バージョンを順に試すといいでしょう。 pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>WinApp</groupId> <artifactId>WinApp</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>3.8.0</version> </dependency> </dependencies> <build> <sourceDirectory>src</sourceDirectory> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
MAVEN プロジェクトへの変更は、プロジェクトを右クリックして『構成』から、選択できます JTable は表示のみ対応した、JTableUnit と言うクラスを作成して使用しています。 JTableUnit
import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableColumn; public class JTableUnit extends JTable { private JScrollPane _scrollPane; public JTableUnit( ) { super(); _scrollPane = new JScrollPane(this); } @Override public boolean isCellEditable(int row, int column) { return false; } public JScrollPane getScrollPane() { return _scrollPane; } // ******************** // 初期化 // ******************** public void reset() { DefaultTableModel dtm = (DefaultTableModel) this.getModel(); dtm.setRowCount(0); int cols = this.getColumnCount(); for( int i = cols-1; i >= 0; i-- ) { this.removeColumn((this.getColumnModel()).getColumn(i)); } // データモデルも初期化 dtm.setColumnCount(0); } // ******************** // 行を全て削除 // ******************** public void clear(){ DefaultTableModel dtm = (DefaultTableModel) this.getModel(); dtm.setRowCount(0); } public void addColumn(String name) { DefaultTableModel dtm = (DefaultTableModel) this.getModel(); dtm.addColumn(name); } public void setColumnTitle(String name,String title) { TableColumn tc = this.getColumn(name); tc.setHeaderValue(title); tc.setIdentifier(name); } public void addRow() { DefaultTableModel dtm = (DefaultTableModel) this.getModel(); Object[] obj = null; dtm.addRow(obj); } public void setColumn(int row, int col, String data) { this.setValueAt( data, row, col ); } }
前提条件 CSV は、ローカル・WEB 共に shift_jis です。 WEB 上のデータは https://lightbox.sakura.ne.jp/demo/json/syain_csv.php です。 処理
import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class Main extends JFrame { private JPanel contentPane; private JTableUnit table; private JPanel panel; public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { Main frame = new Main(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } public Main() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 1000, 700); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); JButton buttonLocal = new JButton("ローカルCSV読込み"); buttonLocal.setBounds(10, 10, 150, 21); buttonLocal.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { loadCsv(); } }); contentPane.add(buttonLocal); JButton buttonWeb = new JButton("WEBCSV読込み"); buttonWeb.setBounds(172, 10, 150, 21); buttonWeb.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { loadWebCsv(); } }); contentPane.add(buttonWeb); JButton buttonClear = new JButton("行クリア"); buttonClear.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { table.clear(); } }); buttonClear.setBounds(334, 10, 150, 21); contentPane.add(buttonClear); panel = new JPanel(); panel.setBounds(12, 52, 960, 600); panel.setLayout(new BorderLayout(0, 0)); contentPane.add(panel); table = new JTableUnit(); panel.add(table.getScrollPane()); } // ************************* // ローカルCSV読込み // ************************* private void loadCsv(){ table.reset(); try { FileInputStream fis = new FileInputStream("C:\\Users\\lightbox\\Documents\\社員.csv"); InputStreamReader isr = new InputStreamReader(fis, "MS932"); BufferedReader br = new BufferedReader(isr); String cols_string; String[] col_data = null; int line_count = 0; while ( null != (cols_string = br.readLine() ) ) { // 空行を無視する if (cols_string.equals("")) { continue; } // 初回( タイトル部分 ) if ( col_data == null ) { col_data = cols_string.split(","); // addColumn と setColumnTitle は別々に実行する必要があります for( int i = 0; i < col_data.length; i++ ) { // カラムの ID を定義しています table.addColumn(String.format("col%d", i) ); } for( int i = 0; i < col_data.length; i++ ) { // カラムの ID に対してタイトル文字列をセットしています table.setColumnTitle(String.format("col%d", i), col_data[i] ); } continue; } // 2回目以降( データ部分 ) col_data = cols_string.split(","); // 空行の追加 table.addRow(); for( int i = 0; i < col_data.length; i++ ) { // 行, カラム でデータをセット table.setColumn(line_count, i, col_data[i] ); } line_count++; } br.close(); isr.close(); fis.close(); } catch (Exception e) { e.printStackTrace(); } } // ************************* // WEBCSV読込み // ************************* private void loadWebCsv(){ table.reset(); String url = "https://lightbox.sakura.ne.jp/demo/json/syain_csv.php"; String result ="[\"error\"]"; OkHttpClient client = new OkHttpClient(); Request.Builder builder = new Request.Builder(); builder.url(url); Request request = builder.build(); Response response = null; try { response = client.newCall(request).execute(); result = response.body().string(); } catch (IOException e) { e.printStackTrace(); } String[] row_data = result.split("\n"); String[] col_data = null; int line_count = 0; for( String cols_string : row_data ) { // 空行を無視する if (cols_string.equals("")) { continue; } // 初回( タイトル部分 ) if ( col_data == null ) { col_data = cols_string.split(","); for( int i = 0; i < col_data.length; i++ ) { // カラムの ID を定義しています table.addColumn(String.format("col%d", i) ); } for( int i = 0; i < col_data.length; i++ ) { // カラムの ID に対してタイトル文字列をセットしています table.setColumnTitle(String.format("col%d", i), col_data[i] ); } continue; } // 2回目以降( データ部分 ) col_data = cols_string.split(","); // 空行の追加 table.addRow(); col_data = cols_string.split(","); for( int i = 0; i < col_data.length; i++ ) { // 行, カラム でデータをセット table.setColumn(line_count, i, col_data[i] ); } line_count++; } } }
画面にデザイナで Panel を作成しておいて、JScrollPane 込みで作成されている JTableUnit を Panel に組み込んでいます(82、83 行)。 okhttp での キャラクタセットは、サーバ側から送られた Content-Type を元に response.body().string() 実行時に自動変換されます。
|
【java : Swingの最新記事】
- Java + Swing : JTable に CSV フォーマットのテキストファイルを読み込む
- Swing の JTable に 1) WEBのJSON2次元配列。2) WEB の JSON配列 を取り込んで表示する( Google Gson と okhttp を使用 )
- Java : JDialog で モーダルダイアログ
- Eclipse( Pleiades ) Helios に、VisualEditor をインストールして、JFrame で実行するまでの全手順画像
- Java : InputMap を使って JFrame 上のキーを全て処理する
- Java : WEB 上の XML を JTable に表示