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

GUI程序设计3的更多相关文章

  1. ATL的GUI程序设计(4)

    第四章 对话框和控件 对于Win32 GUI的程序设计来说,其实大部分的情况下我们都不需要自己进行窗口类的设计,而是可以使用Win32中与用户交互的标准方式--对话框(Dialog Box).我们可以 ...

  2. ATL的GUI程序设计(3)

    第三章 ATL的窗口类 CWindowImpl.CWindow.CWinTraits,ATL窗口类的奥秘尽在此三者之中.在本章里,李马将为你详细解说它们的使用方法.另外,本章的内容也可以算是本书的核心 ...

  3. ATL的GUI程序设计(2)

    from:http://blog.titilima.com/atlgui-2.html 第二章 一个最简单窗口程序的转型 我知道,可能会有很多朋友对上一章的"Hello, World!&qu ...

  4. ATL的GUI程序设计(前言)

    前言 也许,你是一个顽固的SDK簇拥者: 也许,你对MFC抱着无比排斥的态度,甚至像我一样对它几乎一无所知: 也许,你符合上面两条,而且正在寻求着一种出路: 也许,你找到了一条出路--WTL,但是仍然 ...

  5. ATL的GUI程序设计(1)

    from:http://blog.titilima.com/atlgui-1.html 第一章 不能免俗的"Hello, World!" 在这一章里,就像所有的入门级教程一样,我也 ...

  6. Java GUI程序设计

    在实际应用中,我们见到的许多应用界面都属于GUI图形型用户界面.如:我们点击QQ图标,就会弹出一个QQ登陆界面的对话框.这个QQ图标就可以被称作图形化的用户界面. 其实,用户界面的类型分为两类:Com ...

  7. GUI程序设计2

    8. 按钮(JButton)使用示例 例14. 按钮使用示例. package GUI; import java.awt.BorderLayout; import java.awt.Container ...

  8. GUI程序设计

    1. 对话框(JDialog)使用示例 例1. JDialog简单使用示例. import javax.swing.JLabel; public class demoJDialog { JFrame ...

  9. Matlab GUI程序设计入门——信号发生器+时域分析

    背景:学习matlab gui编程入门,完成一个基于GUIDE的图形化界面程序,结合信号生成及分析等. 操作步骤: 1.新建程序 新建一个GUIDE程序 这里选择第一个选项,即创建一个空白的GUIDE ...

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

    在运行期间,ListBox控件突然消失,同时给出如下错误提示: Warning: single-selection listbox control requires that Value be an ...

随机推荐

  1. 【知了堂学习笔记】java 编写几种常见排序算法3

    排序的分类: 1.希尔排序 希尔排序是快速插入排序的改进版,希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰 ...

  2. CSUOJ 1956 数字和

    Description 长者对小明施加了膜法,使得小明每天起床就像马丁的早晨一样. 今天小明早上起来后发现身体虽然变小,头脑依旧不变变傻. 他有一条纸带,上面有n个数字,第i个数字为Ai. 他想把纸带 ...

  3. MySQL Insert语句单个批次数量过多导致的CPU性能问题分析

    [问题] 最近有台服务器比较频繁的CPU报警,表现的特征有CPU sys占比偏高,大量慢查询,大量并发线程堆积.后面开发对insert的相关业务限流后,服务器性能恢复正常. [异常期间线程处理情况] ...

  4. 【原创】获取MySQL crash 时的core file

    最近有台服务器的MySQL经常crash,为了进一步定位问题,开启了mysql core file功能,开启步骤如下,供参考 [开启步骤] 1. my.cnf文件中增加2个配置选项 [mysqld] ...

  5. JXOI2017-2018 解题报告

    链接:JXOI2017-2018 解题报告 代码预览:Github

  6. VS15 openGL 编程指南 配置库 triangle例子

    最近去图书馆借了一本书<OpenGL编程指南(原书第八版)>,今天倒腾了一天才把第一个例子运行出来. 所以,给大家分享一下,希望能快速解决配置问题. 一.下载需要的库文件 首先,我们需要去 ...

  7. Java 关于集合框架那点事儿

     1.引入集合框架  采用数组存在的一些缺陷:   1.数组长度固定不变,不能很好地适应元素数量动态变化的情况.   2.可通过数组名.length获取数组的长度,却无法直接获取数组中真实存储的个数. ...

  8. 【基础知识】ASP.NET[基础二(aspx)]

    1.cs可以调用aspx中的runat=server控件,aspx中也可以访问测试中定义的字段.函数,还可以编写复杂的C#代码,for等所有C#代码都可以写在aspx中(不推荐这样写): 2.把代码写 ...

  9. 1015 Reversible Primes (20)(20 point(s))

    problem A reversible prime in any number system is a prime whose "reverse" in that number ...

  10. python pip 不能用报错: ImportError: No module named _internal

    使用python pip安装包的时候报错: Traceback (most recent call last): File "/usr/local/bin/pip", line 7 ...