正方形の周長 #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となる。