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
このコードを元に、項目を編集したり保存したりする処理を
追加してみるのもよいプログラム練習になると思います。
この記事へのコメントはこちら