GUIプログラミング3

28828 ワード

16.ツリー(JTree)の使用例
例16.1 JTreeの例を作成する.
package GUI1;



import java.awt.BorderLayout;

import java.awt.Container;



import javax.swing.event.TreeSelectionEvent;

import javax.swing.event.TreeSelectionListener;

import javax.swing.tree.DefaultMutableTreeNode;

import javax.swing.*;

public class demoJTree implements TreeSelectionListener {

    JFrame jf;

    JLabel jl;

    Container con;

    JTree jt;

    JScrollPane jsp;

    DefaultMutableTreeNode node,root;

    

    public demoJTree(){

        jf = new JFrame("JTree    ");

        jl = new JLabel();

        con = jf.getContentPane();

        root = new DefaultMutableTreeNode("Option");

        node = new DefaultMutableTreeNode("A");

        root.add(node);

        node.add(new DefaultMutableTreeNode("a1"));

        node.add(new DefaultMutableTreeNode("a2"));

        node = new DefaultMutableTreeNode("B");

        root.add(node);

        node.add(new DefaultMutableTreeNode("b1"));

        node.add(new DefaultMutableTreeNode("b2"));

        node.add(new DefaultMutableTreeNode("b3"));

        node.add(new DefaultMutableTreeNode("b4"));

        jt = new JTree(root);

        jt.addTreeSelectionListener(this);

        jsp = new JScrollPane(jt);

        con.add(jsp, BorderLayout.CENTER);

        con.add(jl, BorderLayout.SOUTH);

        jf.setSize(500, 400);

        jf.setLocation(300, 200);

        jf.setVisible(true);

        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }



    public void valueChanged(TreeSelectionEvent e) {

        jl.setText(e.getPath().toString());    

    }



    public static void main(String[] args) {

        new demoJTree();



    }

}

例16.2 JTreeにノードを追加した例.
package GUI1;



import java.awt.BorderLayout;

import java.awt.Container;

import java.awt.FlowLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;



import javax.swing.event.TreeSelectionEvent;

import javax.swing.event.TreeSelectionListener;

import javax.swing.tree.DefaultMutableTreeNode;

import javax.swing.tree.DefaultTreeModel;

import javax.swing.*;



public class addNodeInJTree implements TreeSelectionListener,ActionListener {

    JFrame jf;

    JLabel jl;

    JPanel jp;

    Container con;

    JTree jt;

    JScrollPane jsp;    

    JTextField jtf;

    JButton jbtn;

    private DefaultMutableTreeNode node,root;

    private DefaultTreeModel dtm;

    

    public addNodeInJTree(){

        jf = new JFrame("JTree    ");

        jl = new JLabel();

        jp = new JPanel();

        jtf = new JTextField();

        jtf.setColumns(11);

        jbtn = new JButton("     ");

        jbtn.addActionListener(this);

        con = jf.getContentPane();

        root = new DefaultMutableTreeNode("Option");

        node = new DefaultMutableTreeNode("A");

        root.add(node);

        node.add(new DefaultMutableTreeNode("a1"));

        node.add(new DefaultMutableTreeNode("a2"));

        node = new DefaultMutableTreeNode("B");

        root.add(node);

        node.add(new DefaultMutableTreeNode("b1"));

        node.add(new DefaultMutableTreeNode("b2"));

        node.add(new DefaultMutableTreeNode("b3"));

        node.add(new DefaultMutableTreeNode("b4"));

        dtm = new DefaultTreeModel(root);

        jt = new JTree(dtm);

        jt.addTreeSelectionListener(this);

        jsp = new JScrollPane(jt);

        jp.setLayout(new FlowLayout());

        jp.add(jl);

        jp.add(jtf);

        jp.add(jbtn);

        con.add(jsp, BorderLayout.CENTER);

        con.add(jp, BorderLayout.SOUTH);

        jf.setSize(500, 400);

        jf.setLocation(300, 200);

        jf.setVisible(true);

        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    DefaultMutableTreeNode rdmt;

    public void valueChanged(TreeSelectionEvent e) {

        jl.setText(e.getPath().toString());    

        rdmt = (DefaultMutableTreeNode)jt.getLastSelectedPathComponent();

    }



    public void actionPerformed(ActionEvent e) {

        DefaultMutableTreeNode dmt;

        if(e.getSource()==jbtn){

            dmt = new DefaultMutableTreeNode(jtf.getText());

            dtm.insertNodeInto(dmt,rdmt,0);

        }

        

    }



    public static void main(String[] args) {

        new addNodeInJTree();



    }



}

17.メニュー使用例
完全なメニューは、通常、メニューバー(JMemuBar)、ドロップダウンメニュー(JMemu)、メニュー項目(JMemuItem)の3つの部分から構成される.
例17.1メニュー使用例.
package GUI1;

import java.awt.BorderLayout;

import java.awt.Container;



import javax.swing.*;

public class demoJMenu {

    JFrame jf;

    JScrollPane jsp;

    JTextArea jta;

    Container con;

    JMenuBar jmb;

    JMenu file,edit,format,check,help;

    //     

    JMenuItem newItem,open,save,saveas,page,print,exit;

    //     

    JMenuItem undo,cut,copy,paste,find,replace,selectall;

    //     

    JMenuItem font;

    JCheckBoxMenuItem wrap;

    //  

    JMenuItem state;

    //  

    JMenuItem helpItem,about;

    

    public demoJMenu(){

        jf = new JFrame("JMenu    ");

        jta = new JTextArea();

        jsp = new JScrollPane(jta);

        con = jf.getContentPane();

        createMenu();

        jf.setJMenuBar(jmb);

        con.add(jsp, BorderLayout.CENTER);

        jf.setSize(500, 400);

        jf.setLocation(300, 200);

        jf.setVisible(true);

        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    private void createMenu() {

        jmb = new JMenuBar();

        file = new JMenu("  ");

        edit = new JMenu("  ");

        format = new JMenu("  ");

        check = new JMenu("  ");

        help = new JMenu("  ");

        //   newItem,open,save,saveas,page,print,exit

        newItem = new JMenuItem("  ");

        open = new JMenuItem("  ..");

        save = new JMenuItem("  ..");

        saveas = new JMenuItem("   ..");

        page = new JMenuItem("    ..");

        print = new JMenuItem("  ..");

        exit = new JMenuItem("  ");

        file.add(newItem);

        file.add(open);

        file.add(save);

        file.add(saveas);

        file.add(page);

        file.add(print);

        file.add(edit);

        jmb.add(file);

        //   undo,cut,copy,paste,find,replace,selectall;

        undo = new JMenuItem("  ");

        cut = new JMenuItem("  ");

        copy = new JMenuItem("  ");

        paste = new JMenuItem("  ");

        find = new JMenuItem("  ..");

        replace = new JMenuItem("  ..");

        selectall = new JMenuItem("  ");

        edit.add(undo);

        edit.addSeparator();

        edit.add(cut);

        edit.add(copy);

        edit.add(paste);

        edit.addSeparator();

        edit.add(find);

        edit.add(replace);

        edit.addSeparator();

        edit.add(selectall);

        jmb.add(edit);

        //  JMenuItem font;JCheckBoxMenuItem wrap;

        wrap = new JCheckBoxMenuItem("    ");

        font = new JMenuItem("  ");

        format.add(wrap);

        format.add(font);

        jmb.add(format);

        //  JMenuItem state;

        state = new JMenuItem("   ");

        check.add(state);

        jmb.add(check);

        //  JMenuItem helpItem,about;

        helpItem = new JMenuItem("    ");

        about = new JMenuItem("  ..");

        help.add(helpItem);

        help.add(about);

        jmb.add(help);

    }

    public static void main(String[] args) {

        new demoJMenu();

    }

}

文字メニュー項目の中間の区切り線は、file Menu.addSeparator().
注意:配列を簡略化できます.
最後に,JPopupMenuの利用について議論する.その作成はJMenuの作成と何の違いもありません.ただし、JMenuBarに追加する必要はありません.たとえば、前例のJTextAreaなどのコンポーネントにバインドする必要があります.これは、コンポーネントのsetComponentPopupMenu(JPopupMenu popup)メソッドを使用して、ユーザーがこのコンポーネントを右クリックすると、メニューが自動的にポップアップされ、プログラマーがメニュー表示の位置を計算する必要がありません.
18.レイアウト管理
18.1フローレイアウト(FlowLayout)
18.2ボーダーレイアウト(BorderLayout)
18.3グリッドレイアウト(GridLayout)
18.4カードレイアウト(CardLayout)
カードは一度に1枚しか見られず、カードを任意に切り替えることができないため、CardLayoutは分類操作や複数の操作ステップがあり、各ステップに前後関係がある場合に適しています.最初のステップが完了したら、2枚目のカードに切り替え、3枚目のカードに切り替えます.典型的な例は、プログラムのインストールウィザードです.
注意:複数のカード間を切り替える必要がある場合は、JTablePaneを選択し、そのラベルでカードを選択するのが一般的です.
例一般的なソフトウェアインストールプロセスをシミュレートするカードレイアウトの使用例.
package GUI1;



import java.awt.CardLayout;

import java.awt.Container;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;



import javax.swing.*;

public class demoCardLayout implements ActionListener {

    JFrame jf;

    JPanel jp1,jp2,jp3;

    JLabel jl1,jl2,jl3;

    JButton nextBtn1,prevBtn1,nextBtn2,prevBtn2,OKBtn;

    Container con;

    CardLayout cl;

    

    public demoCardLayout(){

        jf = new JFrame("CardLayout    ");

        cl = new CardLayout();

        con = jf.getContentPane();

        con.setLayout(cl);

        jl1 = new JLabel("     ");

        nextBtn1 = new JButton("   ");

        nextBtn1.addActionListener(this);

        jp1 = new JPanel();

        jp1.add(jl1);

        jp1.add(nextBtn1);

        con.add("first",jp1);

        

        jl2 = new JLabel("     ");

        prevBtn1 = new JButton("   ");

        prevBtn1.addActionListener(this);

        nextBtn2 = new JButton("   ");

        nextBtn2.addActionListener(this);

        jp2 = new JPanel();

        jp2.add(jl2);

        jp2.add(prevBtn1);

        jp2.add(nextBtn2);

        con.add("second", jp2);

        

        jl3 = new JLabel("     ");

        prevBtn2 = new JButton("   ");

        prevBtn2.addActionListener(this);

        OKBtn = new JButton("  ");

        OKBtn.addActionListener(this);

        jp3 = new JPanel();

        jp3.add(jl3);

        jp3.add(prevBtn2);

        jp3.add(OKBtn);

        con.add("third", jp3);

        

        jf.setSize(500, 400);

        jf.setLocation(300, 200);

        jf.setVisible(true);

        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    

    public void actionPerformed(ActionEvent e) {

        Object obj = e.getSource();

        if(obj==nextBtn1||obj==nextBtn2)

            cl.next(con);

        if(obj==prevBtn1||obj==prevBtn2)

            cl.previous(con);

        if(obj==OKBtn)

            jf.dispose();

    }



    public static void main(String[] args) {

        new demoCardLayout();



    }

}

18.5グリッドレイアウトの強化(GridBagLayout)
GridLayoutに似ていますが、後者よりも強力で、使用も複雑です.行と列にまたがるセルを作成できます.
例拡張メッシュレイアウトの使用例.
package GUI1;

import java.awt.Container;

import java.awt.GridBagConstraints;

import java.awt.GridBagLayout;



import javax.swing.*;

public class demoGridBagLayout {

    JFrame jf;

    Container con;

    GridBagLayout gbl;

    

    private void makebutton(String name,GridBagLayout gbl,GridBagConstraints c){

        JButton btn = new JButton(name);

        //  c           

        gbl.setConstraints(btn, c);

        con.add(btn);

    }

    

    public demoGridBagLayout(){

        jf = new JFrame("          ");

        con = jf.getContentPane();

        GridBagConstraints c = new GridBagConstraints();

        gbl = new GridBagLayout();

        con.setLayout(gbl);

        c.fill = GridBagConstraints.BOTH;

        //           

        c.weightx = 1.0;

        makebutton("Button1",gbl,c);

        makebutton("Button2",gbl,c);

        makebutton("Button3",gbl,c);

        c.gridwidth = GridBagConstraints.REMAINDER; //       

        makebutton("Button4",gbl,c);

        //         

        c.weightx = 0.0; //      

        //   gridwidth     REMINDER,       

        makebutton("Button5",gbl,c);

        //       

        c.gridwidth = GridBagConstraints.RELATIVE; //

        makebutton("Button6",gbl,c);

        c.gridwidth = GridBagConstraints.REMAINDER; //       

        makebutton("Button7",gbl,c);

        //        

        c.gridwidth = 1; //         

        c.gridheight = 2;

        c.weighty = 1;

        makebutton("Button8",gbl,c);

        //

        c.weighty = 0.0;

        c.gridwidth = GridBagConstraints.REMAINDER; //       

        c.gridheight = 1; //    

        makebutton("Button9",gbl,c);

        makebutton("Button10",gbl,c);

        //      

        jf.setSize(500, 400);

        jf.setLocation(300, 200);

        jf.setVisible(true);

        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    public static void main(String[] args) {

        new demoGridBagLayout();



    }



}