GUI程序设计3

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. 菜单使用示例

一个完整的菜单通常由3部分构成:菜单条(JMemuBar)、下拉式菜单(JMemu)和菜单项(JMemuItem)。

例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();
    }
}

文字菜单项中间的分隔线采用这样的方法:fileMenu.addSeparator()。

注:可以用数组简化。

最后,讨论一下JPopupMenu的使用。它的创建和JMenu的创建并没有什么不同。只是它不需要加到JMenuBar中,而是需要绑定到某个组件上(例如上例中的JTextArea),这可以使用组件的setComponentPopupMenu(JPopupMenu popup)方法,以后当用户在这个组件上右击时,该菜单将会自动弹出来,这就无需程序员计算菜单显示的位置。

18. 布局管理

18.1 流式布局(FlowLayout)

18.2 边框布局(BorderLayout)

18.3 网格布局(GridLayout)

18.4 卡片布局(CardLayout)

由于一次只能看到一张卡片,而且不能任意地切换卡片,所以CardLayout比较适合分类操作或者是有多个操作步骤、每个步骤有先后关系的情况。当第一步完成后,切换到第二张卡片,然后切换到第三张卡片......典型的例子是程序的安装向导。

注意:如果需要在多张卡片之间来回切换,一般会选择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();

    }

}
时间: 2024-10-06 19:18:17

GUI程序设计3的相关文章

MATLAB GUI 程序设计中将axes保存为矢量图的方法

MATLAB进行GUI程序设计时,一个figure中通常包含多个axes控件. 保存矢量图的常用指令saveas和print只能以figure为单位保存图片,而不能将figure中的某一个axes单独保存. 而getframe+imwrite的方法虽然可以保存axes,但只能保存为位图,不能保存为矢量图,必定造成图像细节信息丢失. 下面给出一种解决方案. 创建一个新的.不可见的figure和axes,将要保存的axes内容复制至新的axes中,并保存新的figure. 由于新的figure中只有

GUI程序设计

1. 对话框(JDialog)使用示例 例1. JDialog简单使用示例. import javax.swing.JLabel; public class demoJDialog { JFrame mainJFrame; JLabel myJLabel; JDialog subJDialog; public demoJDialog(){ mainJFrame = new JFrame("带对话框的JFrame演示窗口"); myJLabel = new JLabel("世界

Python Chapter 9: 使用Tkinter进行GUI程序设计 Part 2

6.几何管理器 Tkinter中的几何管理器分为:网格管理器.包管理器与位置管理器(最好不要对同一容器中的小构件使用多种管理器) ①网格管理器:将各个空间分布在看不见的网格中 1 # Program 9.7 2 from tkinter import * 3 4 class GridManagerDemo: 5 window = Tk() 6 window.title("Grid Manager Demo") 7 8 message = Message(window, text = &

MATLAB GUI程序设计中ListBox空间在运行期间消失的原因及解决方法

在运行期间,ListBox控件突然消失,同时给出如下错误提示: Warning: single-selection listbox control requires that Value be an integer within String rangeControl will not be rendered until all of its parameter values are valid 此错误经常出现在清空List之后.原因在于,List的Value属性指示当前选中的列表项序号,如果超

java GUI之基本图形

1.为了支持图形用户界面程序设计,java1.0的标准类库中包含一个抽象窗口工具箱(Abstract Window Toolkit,AWT). 这个工具箱极不成熟,其编程模型也不是面向对象的,有很大的局限性.为此,java1.2最终决定放弃AWT中的GUI,而是添加了一个Swing库. Swing组件不仅可以完全替代AWT组件,而且提供了更多的复杂组件. 必须注意GUI程序设计是,不能混用AWT组件和Swing组件(例如不能将javax.swing.JList添加到java.awt.Frame中

嵌入式linux QT开发(三)——GUI原理分析

嵌入式linux QT开发(三)--GUI原理分析 一.命令行程序 命令行程序是面向过程的程序设计. 命令行程序的特点: A.基于顺序结构执行 B.程序执行过程中不需与用户交互 C.程序执行结束给出最终运行结果 命令行程序适用场合: A.单任务场合 B.无交互.简单交互场合 C.服务器应用场合 二.GUI程序 GUI程序的特点: A.基于消息驱动模型的程序 B.程序执行依赖用户交互过程 C.程序执行过程中实时响应用户操作 D.一般程序执行后不会主动退出 GUI程序适用场合: A.多任务场合 B.

201671010145 2016-2017《Java程序设计》JAVA图形程序设计基本框架

在Java 1.0 刚刚出现的时候,包含了一个用于基本GUI程序设计的类库,Sun将它称为抽象窗口工具箱(Abstract Window Toolkit, AWT). 1996年,Netscape创建了一种称为IFC(Internet Foundation Class)的GUI库.Sun与Netscape合作完善了这种方式,创建了一个名为Swing的用户界面库. Swing没有完全替代AWT,而是基于AWT架构之上.Swing仅仅提供了能力更加强大的用户界面组件.尤其在采用Swing编写的程序中

徐思201771010132 《面向对象程序设计(java)》课程学习总结

1.实验目的与要求 (1) 综合掌握java基本程序结构: (2) 综合掌握java面向对象程序设计特点: (3) 综合掌握java GUI 程序设计结构: (4) 综合掌握java多线程编程模型: (5) 综合编程练习. 2.实验内容和步骤 任务1:填写课程课后调查问卷,网址:https://www.wjx.cn/jq/33108969.aspx. 任务2:综合编程练习 练习1:设计一个用户信息采集程序,要求如下: (1)  用户信息输入界面如下图所示: (1)用户点击提交按钮时,用户输入信息

201771010126 王燕《面向对象程序设计(java)》第十八周学习总结

实验十八  总复习 实验时间 2018-12-30 1.实验目的与要求 (1) 综合掌握java基本程序结构: (2) 综合掌握java面向对象程序设计特点: (3) 综合掌握java GUI 程序设计结构: (4) 综合掌握java多线程编程模型: (5) 综合编程练习. 2.实验内容和步骤 任务1:填写课程课后调查问卷,网址:https://www.wjx.cn/jq/33108969.aspx. 任务2:综合编程练习 练习1:设计一个用户信息采集程序,要求如下: 1 package pro