Checklistツールを作ってみよう3

 

旧来の(といいますか、オブジェクト指向ではない)プログラムでは
チェックされた行(チェックボックス)の色を変えるには、
どの行(チェックボックス)かを調べてそこの色を変える、という処理になります。

毎度、管理人イガジーです。

オブジェクト指向では、「クリックされたら自分自身の色を変える」という
行(チェックボックス)を作って並べる。という形になります。
必要な処理は、それ自身に持たせる。という考え方になるのですね。

具体的な、処理を抱いたチェックボックスは次のような感じになるでしょう。

class MyJCheckBox extends JCheckBox implements ItemListener {
	private static final long serialVersionUID = 1L;

	MyJCheckBox(String lbl) {
		super(lbl);
		this.addItemListener(this);
	}
	
	void setColor(){
		if (isSelected()) setBackground(c1);
		else  setBackground(c0);
	}
	@Override
	public void itemStateChanged(ItemEvent arg0) {
		setColor();
	}
} // class MyJCheckBox

これをつかった全体のコードは次のようになります。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JViewport;

public class JCheckLists1 {

	String []lb={
		"はぶらし",
		"タオル",
		"ビニール袋",
		"着替え",
		"めがね",
		"手帳・ペン",
		"財布",
		"ノートパソコン",
		"ACアダプタ",
		"携帯充電器",
		"文庫本",
		};

	int items=lb.length;
	JFrame f0;
	JPanel p0;
	MyJCheckBox []cb =new MyJCheckBox[items];
	JScrollPane jsp;
	Color c0=new Color(255,255,230);
	Color c1=Color.LIGHT_GRAY;

	JCheckLists1() { // constructor
		f0=new JFrame("JCheckLists");
		f0.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent ev) {
				System.exit(0);
			}
		});
		p0=new JPanel(new GridLayout((items>6)?items:6,1,0,1));
		for (int i=0;i<items;++i) {
			if (lb[i].charAt(0)=='#') {
				p0.add(new JLabel(lb[i].substring(1)));
			}else{
				cb[i]=new MyJCheckBox(lb[i]);
				cb[i].setBackground(c0);
				p0.add(cb[i]);
			}
		}
		jsp=new JScrollPane(p0);
//		jsp.setWheelScrollingEnabled(false);
		jsp.addMouseWheelListener(new MouseWheelListener() {
			public void mouseWheelMoved(MouseWheelEvent e) {
				Rectangle spbb=jsp.getViewportBorderBounds();
				Dimension p0sz=p0.getSize();
				JViewport vp=jsp.getViewport();
				Point pp=vp.getViewPosition();
				pp.y+=e.getWheelRotation()*20;
				if (pp.y<0) pp.y=0;
				int maxy=p0sz.height-spbb.height;
				if (pp.y>maxy) pp.y=maxy;
				vp.setViewPosition(pp);
				jsp.setViewport(vp);
			}
		});
		f0.add(jsp,BorderLayout.CENTER);
		f0.setSize(260,260);
		f0.setVisible(true);
	}
	public static void main(String[] args) {
		new JCheckLists1();
	}

	class MyJCheckBox extends JCheckBox implements ItemListener {
		private static final long serialVersionUID = 1L;
		MyJCheckBox(String lbl) {
			super(lbl);
			this.addItemListener(this);
		}
		void setColor(){
			if (isSelected()) setBackground(c1);
			else  setBackground(c0);
		}
		@Override
		public void itemStateChanged(ItemEvent arg0) {
			setColor();
		}
	} // class MyJCheckBox

このコードを元に、項目を編集したり保存したりする処理を
追加してみるのもよいプログラム練習になると思います。

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)