正方形の周長 #9
今度はSquarePerimeterで定義されているトップレベルウインドウとその中身を分離して、
中身のGUIの方をJPanelを継承したSquareParametersPaneクラスとしてコンポーネント化する。
といってもSquarePerimeterでは中身の方の定義が大部分を占めているので#8のSquarePerimeterとの差異だけを示す。
...snip import javax.swing.GroupLayout.Alignment; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; public class SquareParametersPane extends JPanel implements ActionListener, FocusListener { private SquareParameters params = new SquareParameters(); private JTextField side = new JTextField(String.valueOf(params.getSide()), 10); private JTextField peri = new JTextField(String.valueOf(params.getPerimeter()), 10); public SquareParametersPane() { JLabel lside = new JLabel("length of each side"); JLabel lperi = new JLabel("length of perimeter"); GroupLayout g = new GroupLayout(this); setLayout(g); g.setAutoCreateGaps(true); ...snip peri.addFocusListener(this); } public void actionPerformed(ActionEvent e) { ...snip } public void focusGained(FocusEvent e) {} public void focusLost(FocusEvent e) { ...snip } private void perform(Object source) { ...snip } }
SquarePerimeterにおいてrunメソッドで行っていたGUIの構築コードのうち、
トップレベルウインドウのJFrameに関する部分を除いて、
SquareParametersPaneのコンストラクタで行っている。
また、ActionEventやFocusEventの処理もSquareParametersPaneが受け持つ。
結局、SquarePerimeterのrun()のコードからJFrame部分を除外してコンストラクタに移し、
main()を取り除けばSquareParametersPaneとなる。