PC のフォント一覧とポストスクリプト名からJTableの標準化

  アプレットによる実装





クライアントの PC に、JRE または JDK の 6 がインストールされている場合のみ表示されます。

フォントそのものはかなり専門外なので良く解りませんが、PDF がらみで指定するフォント名で
ポストスクリプト名 が必要だったので、探したのですが、Java でしか見つからなかったので。

どうせ Java 環境無ければ動かないのだから、どうせなんでまったくやったことの無いアプレットで実装してみました。
Eclipse ですぐ実装はできたのですが、JTable があまりにもわけの解らない
仕様で動いているようなので標準化を行ないました。

その前に、二度としないであろうアプレットの WEB での実装方法ですが・・・

1) Eclipse から エクスポートで通常の JAR を作る( エラー警告は問題ありません )
2) アップロード
3) 以下の HTML
( アーカイブは複数書けるはずです )

  
<APPLET code="Swing_psname.class" style='width:500px;height:300px;'
	archive="psname.jar"
>
  



  JTable の標準化



一番の問題は、JTable から見た TabelColumn と dataModel が同期していないという所でした。
そもそも、addRow が JTable に無いとこらへんからそういう仕様なんでしょうが、
そのわりに全体をコントロールできそうなフィールドやメソッドがプロテクトだったり。

で、マニュアル・サンプルに何も書いて無いで、ある方向からだけ「動くでしょ?」てな、感じの悪いものでした。

以下、直接の問題点。

1) 全体から見ると、カラム名と ID と いう二つの識別がある
2) そのくせ ヘッダタイトル変更しただけで勝手に ID が変わる。
3) JTable から addColumn しても、dataModel は無視されてる

上記問題を裏付ける結果コードが以下

LboxTable.java
  
import javax.swing.*;
import javax.swing.table.*;


public class LboxTable extends JTable {

	public JScrollPane root = null;

	// ***************************************************
	// コンストラクタ
	// ***************************************************
	public LboxTable () {
		super(0,0);

		// テーブル作成と同時にスクロールを実装する
		this.root = new JScrollPane(this);

		// 必要な時にスクロールバーを表示する
		this.root.setVerticalScrollBarPolicy(
				JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
		this.root.setHorizontalScrollBarPolicy(
				JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

	}

	// ***************************************************
	// カラム追加
	// ***************************************************
	public void AddColumn(String name) {

		// まず JTable が直接管理しているカラムを作る。
		TableColumn col = new TableColumn();
		this.addColumn(col);

		// データモデルにも指定した名前で追加する
		((DefaultTableModel)this.dataModel).addColumn(name);

	}

	// ***************************************************
	// 行追加
	// ***************************************************
	public int AddRow( ) {

		// 追加は空で良い
		Object obj [] = null;

		// データモデルに追加
		((DefaultTableModel)this.dataModel).addRow(obj);

		// 追加された行番号を返す
		return this.getRowCount()-1;

	}

	// ***************************************************
	// カラム値の変更
	// ***************************************************
	public void SetColumnText( int nRow, String name, Object value ) {

		// 行位置、カラム位置で変更
		this.setValueAt(
			value,
			nRow,
			// カラム位置を ID から取得
			(this.getColumn(name)).getModelIndex()
		);

	}

	// ***************************************************
	// カラム幅の変更
	// ***************************************************
	public void SetColumnWidth( String name, int width ) {

		// 自動調整だと、変更しても反映されないので
		this.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );

		TableColumn tc = this.getColumn(name);
		tc.setPreferredWidth(width);

	}

	// ***************************************************
	// カラムタイトルの変更
	// ***************************************************
	public void SetColumnTitle( String name, String value ) {

		TableColumn tc = this.getColumn(name);
		// ヘッダをまず最初に変更
		tc.setHeaderValue(value);
		// ID が変更されてしまうので戻す
		tc.setIdentifier(name);

		// 再表示が必要
		this.tableHeader.resizeAndRepaint();

	}
}
  



  呼び出し側のソースコード

カラムは先に全部追加しておいてから変更します
( 仕様です。選択肢ありませんでした )

ソースの構造は、Visual Editor の仕様です。
( これも選択肢ありません )

  
import java.awt.*;
import javax.swing.*;
import javax.swing.JPanel;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Rectangle;
import java.awt.FlowLayout;
import java.awt.Insets;
import java.awt.CardLayout;
import javax.swing.JPopupMenu;
import javax.swing.JButton;
import java.awt.BorderLayout;
import javax.swing.BoxLayout;
import java.awt.Dimension;

public class Swing_psname extends JApplet {

	private LboxTable jTable = null;
	private JPanel jPanel = null;
	/**
	 * This is the xxx default constructor
	 */
	public Swing_psname() {
		super();
	}

	/**
	 * This method initializes this
	 *
	 * @return void
	 */
	public void init() {
		this.setSize(444, 299);
		this.setContentPane(getJPanel());
	}

	/**
	 * This method initializes jTable
	 *
	 * @return javax.swing.JTable
	 */
	private JScrollPane getJTable() {
		if (jTable == null) {

			jTable = new LboxTable();
			jTable.setName("jTable");

			jTable.AddColumn("FONT_NAME");
			jTable.AddColumn("PS_NAME");

			jTable.SetColumnTitle("FONT_NAME", "フォント名");
			jTable.SetColumnTitle("PS_NAME", "ポストスクリプト名");

		}


	// *****************************************************
	// フォント名とポストスクリプト名
	GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
	Font[] fontList = env.getAllFonts();
	for (int i = 0; i < fontList.length; i++) {
		int nRow = jTable.AddRow();
		jTable.SetColumnText(nRow, "FONT_NAME", fontList[i].getFontName());
		jTable.SetColumnText(nRow, "PS_NAME", fontList[i].getPSName());
	}
	// *****************************************************


		return jTable.root;
	}

	/**
	 * This method initializes jPanel
	 *
	 * @return javax.swing.JPanel
	 */
	private JPanel getJPanel() {
		if (jPanel == null) {
			jPanel = new JPanel();
			jPanel.setLayout(new BoxLayout(getJPanel(), BoxLayout.X_AXIS));
			jPanel.add(getJTable(), null);
		}
		return jPanel;
	}


}  //  @jve:decl-index=0:visual-constraint="18,10"
  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ