SQLの窓

2020年10月11日


Java + Swing : JTable に CSV フォーマットのテキストファイルを読み込む

動作確認は、以下の環境で行っています
JDK11
✅ Visual Studio Code + Java Extension Pack
テキストファイルの入力は行毎に読み込む方法で、オーソドックスな以下のクラスを使います。 ✅ FileInputStream => InputStreamReader => BufferedReader キャラクタセットの設定は InputStreamReader で行い、読み込みは BufferedReader の readLine を使用したループ処理です
while ( null != (line_buffer = br.readLine() ) ) {
	// ループ処理
}
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.InputStreamReader;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

public class Main extends JFrame {

	private JPanel contentPane;
	private JTable 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);

		// ボタン
		JButton btnNewButton = new JButton("読み込み");
		btnNewButton.setBounds(10, 10, 91, 21);
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				
				loadCsv();
				
			}
		});
		
		contentPane.setLayout(null);
		contentPane.add(btnNewButton);
		
		panel = new JPanel();
		panel.setBounds(12, 52, 960, 600);
		panel.setLayout(new BorderLayout(0, 0));
		contentPane.add(panel);
		
		table = new JTable() {

			@Override
			public boolean isCellEditable(int row, int column) {
				return false;
			}
			
		};

		JScrollPane scrollPane = new JScrollPane(table);
		panel.add(scrollPane);
		
		scrollPane.setVerticalScrollBarPolicy(
				JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
		scrollPane.setHorizontalScrollBarPolicy(
				JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

	}
	
	// ********************
	// 初期化
	// ********************
	private void reset() {

		DefaultTableModel dtm = (DefaultTableModel) table.getModel();
		dtm.setRowCount(0);
		
		int cols = table.getColumnCount();

		for( int i = cols-1; i >= 0; i-- ) {
			table.removeColumn((table.getColumnModel()).getColumn(i));
		}
		
		// データモデルも初期化
		dtm.setColumnCount(0);

	}
	// ********************
	// 行を全て削除
	// ********************
	private void clear(){
		DefaultTableModel dtm = (DefaultTableModel) table.getModel();
		dtm.setRowCount(0);
	}
	
	// ********************
	// CSV
	// ********************
	private void loadCsv(){
		
		reset();

		try {

			FileInputStream fis = new FileInputStream("c:\\app\\java20\\sample-10-12\\社員マスタ.csv");
			InputStreamReader isr = new InputStreamReader(fis, "MS932");
			BufferedReader br = new BufferedReader(isr);

			String line_buffer;
			String[] adata;
			int line_count = -1;
			while ( null != (line_buffer = br.readLine() ) ) {

				// カンマで分解
				adata = line_buffer.split(",");

				// 1行目はタイトル
				if ( line_count == -1 ) {
					int count = adata.length;
					// 先に全ての列を登録する必要があります
					for( int i = 0; i < count; i++) {
						String id = String.format("col%d", i);
						addColumn( table,  id );
					}
					// タイトル文字列の変更を行っています。
					// 変更しない場合は、タイトルは列を登録時の第二引数になります
					int i = 0;
					for( String value:  adata ) {
						String id = String.format("col%d", i++);
						setColumnTitle( table, id, value );
					}
				}
				// 2行目以降がデータ
				else {
					addRow(table);
					int i = 0;
					for( String value:  adata ) {
						setColumn( table, line_count, i++, value );
					}
				}

				line_count++;

			}
			
			br.close();
			isr.close();
			fis.close();
		}
		catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	// ****************************
	// 列の追加	
	// ****************************
	private void addColumn(JTable table, String name) {
		DefaultTableModel dtm = (DefaultTableModel) table.getModel();
		dtm.addColumn(name);
	}
	// ****************************
	// 列のタイトル文字列変更
	// ****************************
	private void setColumnTitle(JTable table, String name,String title) {
		TableColumn tc1 = table.getColumn(name);
		 tc1.setHeaderValue(title);
		 tc1.setIdentifier(name);
	}
	// ****************************
	// 空の行追加
	// ****************************
	private void addRow(JTable table) {
		DefaultTableModel dtm = (DefaultTableModel) table.getModel();
		Object[] obj  = null;
		dtm.addRow(obj);
	}
	// ****************************
	// 指定カラムへデータをセット
	// ****************************
	private void setColumn(JTable table,int row,int col, String data) {
		table.setValueAt( data, row,  col  );
	}
	
}




posted by lightbox at 2020-10-11 21:21 | java : Swing | このブログの読者になる | 更新情報をチェックする

Python : shift_jis の3列の csv フォーマットのデータを ttk.Treeview に表示する



Python : ttk.Treeview で表形式を使用して環境変数の一覧表示 で作成した Treeview を利用しました

sample_textfile.py
# shift_jis の3列の csv フォーマットのデータを Treeview に表示する
#
from buill_grid import *

with open('cp932.txt', encoding='cp932') as fp:
	for line_buffer in fp:
		# 行末の改行を削除する
		line_buffer = line_buffer.rstrip("\n")
		print(line_buffer)
		# カンマで分割
		csv = line_buffer.split(",")
		print(csv)
		# Treeview にセット
		grid.insert("","end",values=(f"{csv[0]}",f"{csv[1]}", f"{csv[2]}"))

# ウインドウ開始
form.mainloop()

buill_grid.py
import tkinter as tk
import tkinter.ttk as ttk

# メインフォーム
form = tk.Tk()
form.title("タイトル")
form.geometry("800x600")

# ツリービュー(表)
grid = ttk.Treeview(form, show="headings")

# 列ID
grid["columns"] = ("A","B","C")

# 列幅
grid.column("A", width=150)
grid.column("B", width=150)
grid.column("C", width=150)

# タイトル
grid.heading("A", text="A")
grid.heading("B", text="B")
grid.heading("C", text="C")

# 位置指定して作成
grid.place(x=20, y=40, height=500)

# スクロールバーを同期させて form に配置
vsb = ttk.Scrollbar(form, orient="vertical", command=grid.yview)
vsb.place(x=20+450+3, y=40+3, height=500)
grid.configure(yscrollcommand=vsb.set)





posted by lightbox at 2020-10-11 19:41 | Python | このブログの読者になる | 更新情報をチェックする

Python : ttk.Treeview で表形式を使用して環境変数の一覧表示



※ 列の ID は、視認性を上げる為に日本語の名称を使用しています。

import os
import tkinter as tk
import tkinter.ttk as ttk

# メインフォーム
form = tk.Tk()
form.title("タイトル")
form.geometry("800x600")

# ツリービュー(表)
grid = ttk.Treeview(form, show="headings")

# 列ID
grid["columns"] = ("番号","変数","値")

# 列幅
grid.column("番号", width=30)
grid.column("変数", width=150)
grid.column("値", width=500)

# タイトル
grid.heading("番号", text="")
grid.heading("変数", text="変数")
grid.heading("値", text="値")

# データ
i = 0
for k, v in os.environ.items():
	i = i + 1
	grid.insert("","end",values=(i,f"{k}", f"{v}"))

# 位置指定して作成
grid.place(x=20, y=40, height=500)

# スクロールバーを同期させて form に配置
vsb = ttk.Scrollbar(form, orient="vertical", command=grid.yview)
vsb.place(x=20+680+3, y=40+3, height=500)
grid.configure(yscrollcommand=vsb.set)


form.mainloop()

スクロールバー部分は、Stack OverFlow の『Python Treeview scrollbar』を参考にしています



posted by lightbox at 2020-10-11 00:11 | Python | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり