#author("2021-06-23T17:41:11+09:00","","")
[[Java]]
#author("2021-06-24T15:55:54+09:00","","")
[[ソフトウェア開発>SoftwareEngineering]] / [[Java>../]] / [[サンプル集>./]]

*サンプル集 [#l734431d]
#contents
*画面制御 [#n11e484c]
**親ウィンドウを取得する [#mc367339]
#highlightjs([java])
 /**
  * container を乗せている親ウィンドウを取得します。
  * 作成日 : (2012/09/04 14:44:37)
  * @param component java.awt.container
  */
 private Window getParentWindow(Container container) {
     
     debugPrint("------------------------------------------------------------");
     debugPrint("-- 親ウィンドウを検索");
     debugPrint("------------------------------------------------------------");
     Container parentContainer = container.getParent();
     while (parentContainer != null) {
         debugPrint("parentContainer.getClass.getSuperclass().getName", parentContainer.getClass().getSuperclass().getName());
         debugPrint("parentContainer.getClass.getName", parentContainer.getClass().getName());
         debugPrint("parentContainer.getName", parentContainer.getName());
         
         if (parentContainer instanceof Window) return (Window)parentContainer;
         
         debugPrint("------------------------------------------------------------");
         parentContainer = parentContainer.getParent();
     }
     
     return null;
 }
//End 親ウィンドウを取得する
**ツールヒントに表示するテキストを登録 [#l70b74b6]
#highlightjs([java])
 /**
  * ツールヒントに表示するテキストを登録します
  *  テキストが空文字だと「・」が表示されるので、null に置き換えて登録します
  * 作成日 : (2013/04/12 10:18:07)
  * @param component javax.swing.JComponent
  * @param text java.lang.String
  */
 private void setToolTipText(JComponent component, String text) {
     if (component == null) return;
     
     if (text == null) {
         component.setToolTipText(null);
     } else if (text.equals("")) {
         component.setToolTipText(null);
     } else {
         component.setToolTipText(text);
     }
 }
//End ツールヒントに表示するテキストを登録
//End 画面制御
*文字列処理 [#v435885e]
**NULL 値の置き換え [#vcd0bf40]
***String nullToEmpty(String value) [#wfab7091]
#highlightjs([java])
 /**
  * value が NULL 値であれば空文字を戻します
  * 作成日 : (2013/06/04 9:31:48)
  * @return java.lang.String
  * @param value java.lang.String
  */
 private String nullToEmpty(String value) {
    if (value != null) return value;
    return "";
 }
//End String nullToEmpty(String value)
//End NULL 値の置き換え
**数値変換 [#m5a6a4d4]
***int strToIntDef(String, int) [#v5658192]
#highlightjs([java])
 /**
  * 文字列 value を int型に変換して戻す。
  *  文字列 value がint型に変換できない場合は、defaultValue を戻す。
  * 作成日 : (2011/11/21 13:17:17)
  * @return int
  * @param value java.lang.String
  * @param defaultValue int
  */
 private int strToIntDef(String value, int defaultValue) {
    int result = defaultValue;
    
    try {
        result = Integer.parseInt(value);
    } catch (Exception e) {
        result = defaultValue;
    }
    
    return result;
 }
//End int strToIntDef(String, int)
***long strToLongDef(String, long) [#e18ee3c8]
#highlightjs([java])
 /**
  * 文字列 value を long型に変換して戻す。
  *  文字列 value がlong型に変換できない場合は、defaultValue を戻す。
  * 作成日 : (2011/07/29 13:39:13)
  * @return long
  * @param value java.lang.String
  * @param defaultValue long
  */
 private long strToLongDef(String value, long defaultValue) {
    long result = defaultValue;
    
    try {
        result = Long.parseLong(value);
    } catch (Exception e) {
        result = defaultValue;
    }
    
    return result;
 }
//End long strToLongDef(String, long)
//End 数値変換
//End 文字列処理
*スレッド [#ic1fe8be]
**サブスレッドが停止するまで待つ [#a5d9c2bd]
-メンバ変数
#highlightjs([java])
    private boolean suspendThread = false;/* true:サブスレッドを中断する */
    private Thread subThread = null;/* COBOLとの通信用スレッド */
#br
-void waitSubThreadStoped()
#highlightjs([java])
 /**
  * サブスレッドが停止するまで待つ
  * 作成日 : (2012/10/05 14:47:12)
  */
 private void waitSubThreadStoped() {
 
    try {
        if (subThread == null) return;
        if (!subThread.isAlive()) return;
        
        subThread.join();
        
    } catch(InterruptedException e) {
        System.out.println("waitSubThreadStoped() InterruptedException");
        e.printStackTrace();
    } catch (Exception e) {
        System.out.println("waitSubThreadStoped() Exception");
        e.printStackTrace();
    }
 
 }
#br
-サブスレッド開始
#highlightjs([java])
    //----------------------------------------------------------
    // サブスレッドでデータを再取得する
    //----------------------------------------------------------
    subThread = new Thread(this);
    subThread.start();
#br
-サブスレッド停止
#highlightjs([java])
    //----------------------------------------------------------
    // サブスレッドが停止するまで待機する
    //----------------------------------------------------------
    suspendThread = true;
    waitSubThreadStoped();
//End サブスレッドが停止するまで待つ
**イベントディスパッチスレッドに制御を任せる [#n2e8bb93]
Swing はスレッドに対して安全ではありません。
イベントディスパッチスレッド以外のスレッド上で Swing にアクセスしない。
サブスレッドが開始している状態で終了ボタンをクリックすると、終了処理された後にイベントディスパッチスレッドに制御を任せた処理が実行される可能性があります。
(終了ボタンのクリックイベントはイベントディスパッチスレッドで実行されるため)
-メンバ変数
#highlightjs([java])
 private boolean eventDispatchProcessingDisabled = false;/* true:イベントディスパッチスレッドに制御を任せた処理を無効にする */
#br
-イベントディスパッチスレッドに制御を任せる
#highlightjs([java])
 //----------------------------------------------------------
 // イベントディスパッチスレッドに制御を任せる
 //----------------------------------------------------------
 SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        //----------------------------------------------------------
        // イベントディスパッチスレッドの処理が無効なら処理を中断
        //----------------------------------------------------------
        if (eventDispatchProcessingDisabled) return;
        
        
        //----------------------------------------------------------
        // TODO:イベントディスパッチスレッドで制御する処理を記載すること
        //----------------------------------------------------------
        
        
    }
 });
#br
-イベントディスパッチスレッドの処理を無効化
#highlightjs([java])
    //----------------------------------------------------------
    // イベントディスパッチスレッドの処理を無効化
    //----------------------------------------------------------
    eventDispatchProcessingDisabled = true;
//End イベントディスパッチスレッドに制御を任せる
//End スレッド
*CSV [#i2ce3781]
**CSVを読み込む [#e27d6fca]
-data.csv
 1A,1B,1C
 2A,2B,2C
 3A,3B,3C
 4A,4B,4C
 5A,5B,5C

-CSVReader.java
#highlightjs([java])
 import java.io.*;
 import java.util.StringTokenizer;
 
 public class CSVReader {
     
     public static void main(String args[]) throws Exception {
         
         String fileName = "data.csv";
         
         BufferedReader reader = new BufferedReader(new FileReader(fileName));
         
         String lineText = null;
         while ((lineText = reader.readLine()) != null) {
             
             StringTokenizer tokenizer = new StringTokenizer(lineText, ",");
             
             while (tokenizer.hasMoreTokens()) {
                 System.out.print(tokenizer.nextToken());
                 if (tokenizer.hasMoreTokens()) System.out.print(":");
             }
             
             System.out.println();
         }
         
         reader.close();
         
     }
     
 }

**CSVを書きこむ [#la8bc6c1]
-CSVWriter.java
#highlightjs([java])
 import java.io.*;
 
 public class CSVWriter {
     
     public static void main(String args[]) throws Exception {
         
         String fileName = "data.csv";
         
         BufferedWriter writer = new BufferedWriter(new FileWriter(fileName));
         
         writer.write("1D,1E,1F");
         writer.newLine();
         
         writer.write("2D,2E,2F");
         writer.newLine();
         
         writer.write("3D,3E,3F");
         writer.newLine();
         
         writer.write("4D,4E,4F");
         writer.newLine();
         
         writer.write("5D,5E,5F");
         writer.newLine();
         
         writer.close();
     }
     
 }

*XML [#wc5c682b]
**XMLを読み込む [#w8a3ae53]
-data.xml
 <?xml version="1.0" encoding="UTF-8"?>
 <root>
     <ヘッダー>
         <要素>ヘッダーの要素</要素>
     </ヘッダー>
     <トレイラー>
         <要素>トレイラーの要素</要素>
     </トレイラー>
 </root>

-XMLReader.java
 import org.w3c.dom.*;
 import javax.xml.parsers.*;
 import javax.xml.xpath.*;
 
 public class XMLReader {
     
     public static void main(String args[]) throws Exception {
         
         String fileName = "data.xml";
         
         Document xmlDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(fileName);
         
         for (int index = 0; index < xmlDoc.getElementsByTagName("要素").getLength(); index++) {
             System.out.println(xmlDoc.getElementsByTagName("要素").item(index).getFirstChild().getNodeValue());
         }
         
         
         XPath xPath = XPathFactory.newInstance().newXPath();
         
         System.out.println("--------------------------------------------------------------------------------");
         NodeList nodeList = (NodeList)xPath.evaluate("/root/ヘッダー/要素", xmlDoc, XPathConstants.NODESET);
         System.out.println(nodeList.item(0).getFirstChild().getNodeValue());
         
         
         System.out.println("--------------------------------------------------------------------------------");
         nodeList = (NodeList)xPath.evaluate("/root/トレイラー/要素", xmlDoc, XPathConstants.NODESET);
         System.out.println(nodeList.item(0).getFirstChild().getNodeValue());
         
     }
     
 }

-出力結果
 ヘッダーの要素
 トレイラーの要素
 --------------------------------------------------------------------------------
 ヘッダーの要素
 --------------------------------------------------------------------------------
 トレイラーの要素

** 絶対ロケーションパスを取得する [#kb6c905b]
-data.xml
 <?xml version="1.0" encoding="UTF-8"?>
 <ルートノード>
     <階層一>
         <階層二>
             <階層三>
                 <階層四>
                     <階層五>階層五の内容</階層五>
                 </階層四>
             </階層三>
         </階層二>
     </階層一>
 </ルートノード>

-AbsoluteLocationPath.java
 import org.w3c.dom.*;
 import javax.xml.parsers.*;
 
 
 
 public class AbsoluteLocationPath {
     
     public static void main(String args[]) throws Exception {
         
         String fileName = "data.xml";
         
         Document xmlDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(fileName);
         Node targetNode = xmlDoc.getElementsByTagName("階層五").item(0);
         System.out.println(targetNode.getFirstChild().getNodeValue());
         
         String absoluteLocationPath = getAbsoluteLocationPath(targetNode);
         System.out.println(String.format("絶対ロケーションパス:[%s]", absoluteLocationPath));
         
         System.out.println(targetNode.getFirstChild().getNodeValue());
     }
     
     
     
     private static String getAbsoluteLocationPath(Node node) {
         StringBuffer path = new StringBuffer();
         
         while (node.getParentNode() != null) {
             path.insert(0, "/" + node.getNodeName());
             node = node.getParentNode();
         }
         
         return path.toString();
     }
     
 }
 
*ファイル名から拡張子を除いたベース名を取得する [#o0b5eb7f]
-FileNameWithoutExtension.java
 public class FileNameWithoutExtension {
     
     public static void main(String args[]) throws Exception {
         System.out.printf("%s:[%s]\r\n", "sample.dat", getFileNameWithoutExtension("sample.dat"));
         System.out.printf("%s:[%s]\r\n", ".dat", getFileNameWithoutExtension(".dat"));
         System.out.printf("%s:[%s]\r\n", "sample_dat", getFileNameWithoutExtension("sample_dat"));
     }
     
     
     private static String getFileNameWithoutExtension(String fileName) {
         
         int startExtensionIndex = fileName.lastIndexOf('.');
         
         if (startExtensionIndex < 0) return fileName;
         if (startExtensionIndex == 0) return "";
         
         return fileName.substring(0, startExtensionIndex);
     }
     
 }

*プロパティファイル [#q35b6134]
**XML版 [#sd923a10]
-XMLProperties.properties
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
 <properties>
     <comment></comment>
     <entry key="key1">キー1</entry>
     <entry key="key2">キー2</entry>
     <entry key="key3">キー3</entry>
     <entry key="key4">キー4</entry>
 </properties>

-XMLProperties.java
 import java.util.Properties;
 import java.io.*;
 
 
 public class XMLProperties {
     
     public static void main(String args[]) throws Exception {
         String fileName = "XMLProperties.properties";
         InputStream inputStream = new FileInputStream(fileName);
         
         Properties configuration = new Properties();
         configuration.loadFromXML(inputStream);
         
         
         System.out.printf("%s:[%s]\r\n", "key1", configuration.getProperty("key1"));
         System.out.printf("%s:[%s]\r\n", "key2", configuration.getProperty("key2"));
         System.out.printf("%s:[%s]\r\n", "key3", configuration.getProperty("key3"));
         System.out.printf("%s:[%s]\r\n", "key4", configuration.getProperty("key4"));
     }
     
 }

*配列 [#j2137c49]
**String配列 [#vb3c177a]
***歯抜けになっている中身を前詰する [#h065a1ec]
 public class RemoveBlankItems{
     
     public static void main(String args[]) throws Exception {
         String items[] = new String[30];
         
         for (int i = 0; i < items.length; i++) {
             items[i] = "";
         }
         
         items[5] = "5番目のデータ";
         items[10] = "10番目のデータ";
         items[15] = "15番目のデータ";
         items[20] = "20番目のデータ";
         items[25] = "25番目のデータ";
         
         System.out.println("---------------------------------------------------------------------------");
         System.out.println("-- 未処理");
         for (int i = 0; i < items.length; i++) {
             System.out.println("items[" + Integer.toString(i) + "]:[" + items[i] + "]");
         }
         
         removeBlankItems(items);
         
         System.out.println("---------------------------------------------------------------------------");
         System.out.println("-- 処理後");
         for (int i = 0; i < items.length; i++) {
             System.out.println("items[" + Integer.toString(i) + "]:[" + items[i] + "]");
         }
     }
     
     
     private static void removeBlankItems(String items[]) {
         String buffer[] = new String[items.length];
         
         // 配列の中身を退避
         for (int index = 0; index < items.length; index++) {
             buffer[index] = items[index];
         }
         
         // 前方に詰めたい配列の中身をクリア
         for (int index = 0; index < items.length; index++) {
             items[index] = "";
         }
         
         // 前方に詰める
         int itemIndex = 0;
         for (int bufferIndex = 0; bufferIndex < buffer.length; bufferIndex++) {
             if (buffer[bufferIndex] == null) continue;
             if (buffer[bufferIndex].equals("")) continue;
             
             items[itemIndex] = buffer[bufferIndex];
             itemIndex++;
         }
         
     }
     
 }

*画像 [#l6555d97]
**画像を回転させる [#l6f31ae2]
 private Image rotate(Image sourceImage, int rotation) {
     int sourceWidth = sourceImage.getWidth(this);       // 幅(変換前の画像)
     int sourceHeight = sourceImage.getHeight(this);     // 高さ(変換後の画像)
     double angle = 0;                                   // 角度
     
     int targetWidth = sourceWidth;                      // 幅(変換後の画像)
     int targetHeight = sourceHeight;                    // 高さ(変換後の画像)
     
     double posX = 0;    // 中心点 X座標
     double posY = 0;    // 中心点 Y座標
     
     
     switch (rotation) {
         case 1: {
             // 右に90度回転する
             angle = Math.toRadians(90d);
             posX = (sourceWidth / 2) - ((sourceWidth - sourceHeight) / 2);
             posY = sourceHeight / 2;
             
             targetWidth = sourceHeight;
             targetHeight = sourceWidth;
             
             break;
         }
         
         case 2: {
             // 右に180度回転する
             angle = Math.toRadians(180d);
             posX = sourceWidth / 2;
             posY = sourceHeight / 2;
             
             targetWidth = sourceWidth;
             targetHeight = sourceHeight;
             
             break;
         }
         
         case 3: {
             // 右に270度回転する
             angle = Math.toRadians(270d);
             posX = sourceWidth / 2;
             posY = (sourceHeight / 2) + ((sourceWidth - sourceHeight) / 2);
             
             targetWidth = sourceHeight;
             targetHeight = sourceWidth;
             
             break;
         }
     }
     
     
     BufferedImage targetImage = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB);
     
     java.awt.geom.AffineTransform affin
         = java.awt.geom.AffineTransform.getRotateInstance(angle, posX, posY);
     
     Graphics2D g2 = (Graphics2D)targetImage.createGraphics();
     g2.drawImage(sourceImage, affin, null);
     
     return targetImage;
 }
*印刷処理(JDK 1.3) [#d35a9810]
**ページの印刷方向に初期値を設定する方法 [#nf7978ad]
印刷ジョブのプロパティを変更するためのダイアログにページの印刷方向に初期値を設定する方法を以下に示します。
ダイアログで指定した印刷方向でページが印刷されます。
***コード [#g58121af]
 import java.awt.*;
 import java.awt.print.*;
 
 public class DefaultOrientation implements Printable {
     private static Font fnt = new Font("Helvetica",Font.PLAIN,24);
     
     
     
     public static void main(String[] args) {
         PrinterJob job = PrinterJob.getPrinterJob();
         
         
         PageFormat defaultPage = job.defaultPage();
         defaultPage.setOrientation(PageFormat.LANDSCAPE);
         job.setPrintable(new DefaultOrientation(), defaultPage);    // Point-1
         
         
         if (job.printDialog()) {
             
             try {
                 job.print();
             } catch (PrinterException e) {
                 e.printStackTrace();
             }
             
         }
         
     }
     
     
     
     public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException {
         if (5 <= pageIndex) return Printable.NO_SUCH_PAGE;
         
         g.setFont(fnt);
         g.setColor(Color.green);
         g.drawString("Page " + (pageIndex+1), 100, 100);
         
         return Printable.PAGE_EXISTS;
     }
     
 }
//End コード
***実行結果 [#r4f57630]
#ref(DefaultOrientation_0001.PNG)
//End 実行結果
***解説 [#b1224969]
-Point-1
ページの印刷方向を指定した PageFormat をパラメータとして指定します。
//End 解説
***注意事項/連絡事項 [#o173ecd0]
-ダイアログで印刷方向を固定できない
印刷ジョブのプロパティを変更するためのダイアログでページの印刷方向を固定できません。(たぶん)
ダイアログで指定された印刷方向を無視してプログラムで定義した印刷方向で印刷することは可能です。
#br
-ダイアログで指定された印刷方向を取得できない
印刷ジョブのプロパティを変更するためのダイアログで指定された印刷方向を取得できません。(たぶん)
'''Printable'''.print(Graphics graphics, PageFormat pageFormat, int pageIndex) メソッドでは、 pageFormat パラメータにダイアログで指定された印刷方向が設定されています。
#br
//End 注意事項/連絡事項
//End ページの印刷方向に初期値を設定する方法
**参考サイト [#mc24f9ec]
-[[JavaTM 2D API の概要>http://java.sun.com/j2se/1.3/ja/docs/ja/guide/2d/spec/j2d-bookTOC.doc.html]]
//End 参考サイト
*デバッグ用メソッド [#m5bc0ae5]
**事前準備 [#z62b2e98]
デバッグ用のメソッドを使用するには下記の定数を定義しておく必要がある。
 private final boolean DEBUG_TRACE_ON = true;/* デバック出力する場合は true をセットする */
**デバッグ出力 [#p398b69f]
***void debugPrint(String) [#rbc262ac]
 /**
  * デバッグ用出力
  * 作成日 : (2011/07/12 13:36:31)
  * @param value java.lang.String
  */
 private void debugPrint(String value) {
     if (!DEBUG_TRACE_ON) return;
     
     System.out.println(value);
 }
//End void debugPrint(String) 
***void debugPrint(String[]) [#zc525ec4]
 /**
  * デバッグ用出力
  * 作成日 : (2011/01/14 10:21:24)
  * @param values java.lang.String[]
  */
 private void debugPrint(String[] values) {
    if (!DEBUG_TRACE_ON) return;
         
    for (int index = 0; index < values.length; index++) {
        if (0 < index) System.out.print(",");
        System.out.print(values[index]);
    }
    System.out.print("\r\n");
 }
//End void debugPrint(String[])

***void debugPrint(String, String) [#cb1157c8]
 /**
  * デバッグ用出力
  * 作成日 : (2011/02/15 10:06:48)
  * @param keyword java.lang.String
  * @param value java.lang.String
  */
 private void debugPrint(String keyword, String value) {
    if (!DEBUG_TRACE_ON) return;
         
    System.out.println(keyword + ":[" + value + "]");
 }
//End void debugPrint(String, String)

***void debugPrintTd(String) [#u7c4d4d2]
 /**
  * インターフェースにセットされている値を出力する
  * 作成日 : (2011/06/01 14:43:22)
  * @param keyword java.lang.String
  */
 private void debugPrintTd(String keyword) {
    if (!DEBUG_TRACE_ON) return;
        
    System.out.println("------------------------------------------------------------");
    System.out.println("-- " + keyword + " START");
    System.out.println("------------------------------------------------------------");
    
    
    System.out.println("------------------------------------------------------------");
    System.out.println("-- " + keyword + " END");
    System.out.println("------------------------------------------------------------");
 }

 debugPrintTd("Java >> COBOL");	// デバッグ用ロジック
 debugPrintTd("COBOL >> Java");	// デバッグ用ロジック
//End void debugPrintTd(String)

***void debugPrintDataTable(String) [#r7d78ec5]
 /**
  * デバック用
  *  メモリ内の入力データを出力する
  * 作成日 : (2011/08/29 9:35:25)
  */
 private void debugPrintDataTable(String keyword) {
    if (!DEBUG_TRACE_ON) return;
    
    System.out.println("------------------------------------------------------------");
    System.out.println("-- " + keyword + "DataTable START");
    System.out.println("------------------------------------------------------------");
    
    debugPrint("データ件数", Integer.toString(dataTable.size()));
    
    for (int index = 0; index < dataTable.size(); index++) {
        DataRow dataRow = (DataRow)dataTable.get(index);
        
        debugPrint(new String[] {
             index + "番目"
            ,dataRow.toString()
        });
    }
    
    System.out.println("------------------------------------------------------------");
    System.out.println("-- " + keyword + "DataTable END");
    System.out.println("------------------------------------------------------------");
 }
//End void debugPrintDataTable(String)

***void debugPrintTabOrder(JComponent, int) [#m7bafd82]
 /**
  * デバッグ用出力
  *  タブ移動順序を出力する
  * 作成日 : (2011/06/10 9:12:44)
  * @param firstComponent javax.swing.JComponent 
  * @param upperBound int 無限ループを回避するために使用
  */
 private void debugPrintTabOrder(JComponent firstComponent, int upperBound) {
    if (!DEBUG_TRACE_ON) return;
    if (firstComponent == null) return;
 
    
    System.out.println("------------------------------------------------------------");
    System.out.println("-- タブ移動順序 START");
    System.out.println("------------------------------------------------------------");
    System.out.println("移動順序,オブジェクト名");
 
    
    int index = 0;
    JComponent targetComponent = firstComponent;
    while (true) {
        
        debugPrint(new String[] {
             index + "番目"
            ,targetComponent.getName()
        });
 
 
        targetComponent = (JComponent)targetComponent.getNextFocusableComponent();		
        index++;
 
            
        if (upperBound < index) break;
        if (targetComponent == null) break;
        if (targetComponent.equals(firstComponent)) break;
    }
 
    
    System.out.println("------------------------------------------------------------");
    System.out.println("-- タブ移動順序 END");
    System.out.println("------------------------------------------------------------");
 }
//End void debugPrintTabOrder(JComponent, int)
***void debugPrintTime(String) [#sb4ff8e8]
 /**
  * デバック用
  *  1970年1月1日午前0時からの経過時間をミリ秒で出力する
  * 作成日 : (2012/05/07 11:52:08)
  * @param s java.lang.String
  */
 private void debugPrintTime(String value) {
    if (!DEBUG_TRACE_ON) return;
    
    debugPrint(value, Long.toString((new Date()).getTime()));
 }
//End void debugPrintTime(String)

トップ   差分 履歴 リロード   一覧 検索 最終更新   ヘルプ   最終更新のRSS