Javaアプリの起動に、申し訳程度のパスワード入力画面をつけてみた

　小さな事業所においても徐々にセキュリティにうるさくなって来た時代でした。誰でも比較的自由に出入りする私の所でも、対応の必要が出てきました。通常業務外ですし、俄かプログラマーの私に難しいことはできないので、取りあえず簡単な方法で対処しました。パスワードを記したテキストファイルを「vc_afodra.dll」とでもして、どこかのフォルダーに隠しておくかUSBメモリーに入れるかしておき、起動時にそれを読込ませれば、一応の対策になるかなと。安直ですね💦。アプリを起動すると、次のような何のヘンテツモないパスワード入力画面が現れます。
![Passwd1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3189926/0f202301-1a6e-a8f5-f945-f0d8f28bab39.jpeg)
ここにパスワード(ここではhogehoge)を入力すれば、
![Passwd2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3189926/3e08803d-a25a-98ea-626e-8f00cff44ef5.jpeg)
と本体のウインドウに遷移します。ユーザー名入力テキストボックスもあると良いですね。以下、ソースです。
```PasswdTest.java
package PasswdTest;

import javax.swing.JFrame;

class PasswdTest extends JFrame{
	
	public static void main(String[] args)
	{
		JFrame mframe = new PasswdTest("パスワード入力よくできました");
		mframe.setDefaultCloseOperation(EXIT_ON_CLOSE);
		mframe.setSize(500, 300);
		mframe.setVisible(true);
	}
	
	PasswdTest(String title)
	{
		super(title);
		KidouDialog kd = new KidouDialog();
		kd.setVisible(true);	
	}

}
```
```KidouDialog.java
package PasswdTest;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GraphicsEnvironment;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.SwingConstants;
import javax.swing.border.LineBorder;

public class KidouDialog extends JDialog{
	int     ret_val;
	JLabel  jln,picL;
	JPasswordField jpf;
	JButton jb_ok ,jb_ex,jb_ae,jb_1e;
	String  pW;

	KidouDialog(){
		this.setTitle("アプリを実行しますか？");
		setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);

		pW="hogehoge";	// どこかのフォルダーに隠したファイルからでも読込むか？
		ret_val=0;

		jln = new JLabel("パスワード(半角英数字)を入力してください");
		jln.setHorizontalAlignment(SwingConstants.CENTER);

		ImageIcon icon = new ImageIcon("mama3s.jpg");	// お遊びがてら自分で描いたもの。著作権侵害はしてません。
		picL=new JLabel(icon);
		
		jpf= new JPasswordField(16);
		jpf.setBorder(new LineBorder(Color.red, 2));
		jpf.setEchoChar('*');
		jpf.setFont(new Font(getContentPane().getFont().getFontName(), Font.BOLD, 24));
		
		jb_ok=new JButton("起動");
		jb_ex=new JButton("終了");
		jb_1e=new JButton("1文字修正");
		jb_ae=new JButton("全消去");

		jb_ok.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				String str=new String(jpf.getPassword());
				if ( str.compareTo(pW) ==0 ){
					ret_val = 1;
					dispose();
				}else{
					JOptionPane.showMessageDialog(null,"パスワードが正しくありません。");
				}
			}
		});

		jb_ae.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				jpf.setText("");
			}
		});

		jb_1e.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				String st=new String(jpf.getPassword());
				if(st.length()>0) jpf.setText(st.substring(0,st.length()-1));
			}
		});
		
		jb_ex.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				ret_val = 2;
				dispose();
				System.exit(0); // 起動せず終了
			}
		});
		
		getContentPane().add(jln,BorderLayout.NORTH);
		getContentPane().add(jpf,BorderLayout.CENTER);
		getContentPane().add(picL,BorderLayout.WEST);
		
		JPanel jpe = new JPanel();
		jpe.setLayout(new GridLayout(0,1));
		jpe.add(jb_1e);
		jpe.add(jb_ae);
		getContentPane().add(jpe,BorderLayout.EAST);
	
		JPanel jps = new JPanel();
		jps.add(jb_ok);    
		jps.add(jb_ex);
		getContentPane().add(jps,BorderLayout.SOUTH);

		getRootPane().setDefaultButton(jb_ok);

		//Center in the screen
		GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
		// 変数desktopBoundsにデスクトップ領域を表すRectangleが代入される
		Rectangle desktopBounds = env.getMaximumWindowBounds();
		this.setSize(320,172);
		Dimension frameSize = this.getSize();
		setLocation(new Point((desktopBounds.width  - frameSize.width) / 2,
							  (desktopBounds.height - frameSize.height)/ 2));
		setModal(true);
	}
}
```
この程度では、優秀な職場や上司には通用しないですね。
　今回も初学者に参考になれば嬉しいです。（plaiades2022-12で検証）