JavaSwing组件大全实例演示

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

JavaSwing组件⼤全实例演⽰
⼀抛砖引⽟
本⽂指在利⽤⼀个⼩”Swing 组件⼤全”来引导⼤家学习这门语⾔,熟悉Java Swing的各个组件。

并在学习过程中参考作者这⼀程序的⽅法和思想,最终形成⾃⼰的思维⽅式和学习⽅式。

你能举⼀返三是作者最开⼼的事情。

⼩程序演⽰了Java Swing⼤部分组件。

最后附上了全部代码及详细的注释说明。

希望本⽂能对⼤家学习Java有所帮助。

随着Java风潮席卷国内,学习Java的⽅法和路径越来越多。

⽽在⼤量的书本前,在Java庞⼤的类库前⼤⼤家都有点迷失⽅向的感觉,是学 J2EE,J2ME还是。

然⽽所有的这些都或多或少的离不开J2SE。

万丈⾼楼平地起。

J2SE是整个Java的基础,学好了这个对Java的各个⽅向都是很有利的。

⽽学习J2SE的最初点就在界⾯设计,因为界⾯编程是你来感觉最直接的⼿段,是提⾼⼤家编程兴趣的很好开始,因为你写完程序编译后可马上看到⾃⼰的成果。

⽽不像后台编程做完了都感受不到效果。

⽽好的界⾯也是你测试你其他程序的基础。

界⾯设计!不就是拖拉操作吗?如果是VB,VC等可视化的编程,的确只是⼀些拖拉操作,由于Java语⾔的设计中所有的东西都是程序代码,在 Java中如果想要设计⼀个好的界⾯,可不是简单的拖拉操作能完成的。

即使使⽤了如JBuilder这么强⼤的可视化⼯具,你也得亲⾃动⼿写⼀些界⾯设计代码才能很好的完成你的任务。

如果你能在此基础上理解Java界⾯设计的思想,对你学习这门语⾔将有莫⼤的帮助。

Java界⾯设计主要涉及Awt,Swing两⼤类库,Swing是Awt的扩展和功能加强。

下⾯我们就以Swing为基础来说说整个Java的界⾯设计。

⼆感受效果
在开始之前,让我们看看这篇⽂章要达到的效果,有了⽬标和成果才有学习的兴趣,起码我是这样认为和学习的。

如下图所⽰,这就是我们设计的界⾯,它包括了Swing中⼤部分常⽤的组件。

有些功能界⾯上反映不出来,⼤家可尝试编译源代码点南击各个部分,看看它们的响应事件。

三设计思想和⽅法
不知道⼤家(⼀般是初学者)在看编程书籍的时候有这种体会没有:在看的过程中,好像⼤部理解了,并且效率还不错,可是回头来要⾃⼰写个和书上⼀样的程序出来,可能不少⼈只有重新拿书照打的了;有些⼈在照书上打过了⼀遍,也似乎理解了。

可回头来真正到⽤的时候,好像⼜不记得了。

作者本⼈在初学编程时就经历过很多次这种情况。

追其原因,⽆外乎没有融会贯通所学的知识,编程最讲求动⼿⼆字,动⼿的真正意义在于写⾃⼰所想所领会的程序⽽不是copy现成的程序。

因为只有经过⾃⼰思考,设计才能把书上的知识真正溶⼊⾃⼰的⼤脑。

下⾯我们以”Swing 组件⼤全”来说说这个⽅法和思想。

在看完书上介绍的Swing组件这章后,我⼼中对Swing⼤概有了个了解,只差动⼿了。

⽽本⼈⼜不想照书上的例⼦⼀个个来试。

于是就想到了做个程序把书上介绍的所有组件放到⼀个界⾯来,并尝试⽤到书上介绍的所有⽅法。

砍柴不误磨⼑功!在开始这前,我⼿画了⼀份设计图纸,如上⾯界⾯所⽰(当然没那么漂亮了)。

并⽤简单的⼯程思想对结构进⾏了⼤概的划分。

这⾥把整个界⾯划分为⼀个主模块和五⼤⼦模块。

所有的⼦模块都是继承⾄相应的容器,主模块SwingTest既是管理模块也是主界⾯,继承JFrame主框架,管理本⾝的属性及JFrame上的其他⼦模块。

MenuTest⼦模块继承⾄JmenuBar负责菜单的显⽰和事件处理。

其他⼦模块继承⾄JPanel,管理放置在其上的组件的布局和显⽰。

从⼦模块的名字⼤家也可看到他们的位置和功能。

如下图所⽰:
在编写程序前想好结构和思路是个很好的习惯,它将会帮你⼤⼤减少⼯作量,提⾼程序的可读性和效率。

四容器,布局管理器,嵌板
Swing中所有的组件都是放到容器中,主要的容器包括:JFrame,JPanel,JWindow,JDialog,JPanle。

JFrame是的主框架,⼏乎所有的Java应⽤界⾯都是在主框架之中的。

有些容器并⾮⼀层,⽽由⼏层嵌板组成,本⽂将会⽤到其中在个:拆分嵌板(JSplitPane),内容嵌板, 页签式嵌板(TabbedPane)
拆分嵌板:按指定的⽅向和⽅式拆分其内的两个⼦组件,记住⼀个拆分嵌板只能拆分两个⼦组件,如果想要拆分三个,⼤家⾃⼰先想⼀想办法。

本节最后给出了答案。

内容嵌板: JFrame,Jwindow,Jdialog就是上⾯提到的有多层嵌板的容器,如果要在这些容器上⾯放置组件,必须放置在他们的内容嵌板(pane)上。

我们通过函数getContentPane()可得到当前容器的内容嵌板。

页签式嵌板:这个嵌板如同卡⽚,在上⾯提供⽂件夹式的页签,当前只显⽰⼀页,如要进⼊下⼀页,只要点击上⾯的页签。

有些如JPanel是可以直接放置组件的容器。

所以不需要使⽤嵌板。

如果要按⾃⼰的想法排列放在容器上的组件,我们必须使⽤到布局管理器(Layout)来进⾏管理。

Java系统默认的布局管理器为边界管理器 (BorderLayout)。

它把版⾯分为五⼤块,中央区域(Center),顶端(North),底部(South),左侧(West),右侧 (East),细⼼的你可能会发现我们的主界⾯就是⽤的这个布局架构。

其他的⼏个布局管理器有:
流布局(FlowLayout):把其内的组件按从左到右,从上到下的流⽅式排列。

⽹格布局(GridLayout):把组件放置到布局中的设置的每个⽹格中
⽆序⽹格布局(GridBagLayout):类似于⽹格布局,但功能更强⼤也更复杂。

能处理所有的布局。

如果你仔细观察会发现我们的主界⾯最右边会发现使⽤了⽹格布局。

下⾯来看看我们的主模块的构造函数代码,来感受⼀下上⾯的结构设计。

public SwingTest()
{
// 初始化所有⼦模块
MenuTest menuTest = new MenuTest();
LeftPanel leftPanel = new LeftPanel();
RightPanel rightPanel = new RightPanel();
BottomPanel bottomPanel = new BottomPanel();
CenterPanel centerPanel = new CenterPanel();
// 设置主框架的布局
Container c = this.getContentPane();
// c.setLayout(new BorderLayout())
this.setJMenuBar(menuTest);
c.add(leftPanel,BorderLayout.WEST);
c.add(rightPanel,BorderLayout.EAST);
c.add(centerPanel,BorderLayout.CENTER);
c.add(bottomPanel,BorderLayout.SOUTH);
setSize(700,500);
setTitle("Swing 组件⼤全简体版");
// 隐藏frame的标题栏,此功暂时关闭,以⽅便使⽤window事件
// setUndecorated(true);
setLocation(200,150);
show();
}
如拆分三个⼦组件,可把⼀个拆分嵌板做为另⼀个拆分嵌板的⼦组件!
五事件
在Swing 中每个组件都可触发事件,⼀旦触发事件会被⼀个或多个Listener(监听器)接收。

不同类型的事件分别由个别的class表⽰。

事件发⽣点可以和处理事件的代码分开。

要想处理事件,只要产⽣Listener对象,并调⽤组件的addXXXListener()⽅法注册事件。

我们⼤部分是通过继承事件接⼝来处理事件的。

但是继承Java接⼝我们必须实现出接⼝中的所有⽅法。

有些接⼝包含了⼤量的函数,如果要⼀个个实现是件很⿇烦的事件上,Java中定义了相应接⼝的Adapter接配器类来解决这种情况。

接配器类已经帮我们实现了接⼝的所有⽅法,⽽我们只要继承接配器就可在代码内做我们想做的事情。

也即只要实现或覆写我们想要实现的⽅法。

下⾯我们还是以主模块为例,来处理关闭窗⼝事件。

// 利⽤⽆名内隐类,增加窗⼝事件
this.addWindowListener(new WindowAdapter()
{
public void WindowClosing(WindowEvent e)
{
// 释放资源,退出程序
dispose();
System.exit(0);
}
});
如上所⽰,我们向主框架注册了⼀个窗⼝事件addWindowListener(),事件继承了WindowAdapter接配器,并重载了⽅法WindowClosing(),⽅法中利⽤dispose()释放窗⼝资源,System.exit(0)关闭窗⼝。

六总结
好了,我们来回顾⼀个我们的上⾯的内容:设计的思路,容器,嵌板,布局管理器, Swing组件的事件。

⼤家明⽩了为什么做项⽬能快速提⾼⾃⼰⽔平了吧。

其实上⾯的⽅法原理和做项⽬差不多,任何事只要经过⾃⼰的⼤脑思考,亲⼿操作,想忘记并不是那么容易的了。

相信看了本⽂和代码再辅以相关的书籍介绍,⼤家对Swing处理会有⼀定的感性理解了。

开始动⼿吧。

发挥你的天才思维,⾃⼰设计⼀个更好的Swing组件⼤全吧。

当然你也可在本程序的基础上完善其中更复杂的功能。

⽐如:把树形列表内容⽤window⽂件资源器代替,把表格的处理和数据库相连接或和相关数据连接,让⽂本区可显⽰。

哦,天啊。

说不定⼀个好的产品也会因此诞⽣。

再次强调开始之前请先设计你的界⾯,画出你的程序结构图。

即使再⼩的程序也请你⼤概勾⼀个它的轮廓。

七具体代码
由于代码中已经附上了⽐较详细的注释,在此就不⼀⼀解释说明了。

在此要提醒⼤家在研究源代码时要注意⼏个复杂的组件的处理⽅式:如树形组件 (JTree),表格(JTable),⽂本区(JtextArea),定时器(Timer)。

为了⽅便⼤家直接复制源代码来编译,所有的模块都是放在⼀个主类中实现的。

所有源代码的事件都是⽤嵌套的内隐类⽅法来实现的。

如果⼤家不习惯这种写法,程序中已经消除了各模块之间的关联性,可很⽅便的把各⼦模块分离成类⽂件。

代码只是演⽰了Swing的⼤部组件,各个组件没有很深⼊的处理了。

下⾯是源码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.tree.*;
import javax.swing.event.*;
import javax.swing.border.*;
import javax.swing.table.*;
/**
* Swing 组件测试程序
* 测试Swing所有组件及其相应的事件
* @author 天翼.李 2003.4.17 晚23:14
* @link
* @link robococde@
*/
public class SwingTest extends JFrame
{
/**
* 主模块,初始化所有⼦模块,并设置主框架的相关属性
*/
public SwingTest()
{
// 初始化所有模块
MenuTest menuTest = new MenuTest();
LeftPanel leftPanel = new LeftPanel();
RightPanel rightPanel = new RightPanel();
BottomPanel bottomPanel = new BottomPanel();
CenterPanel centerPanel = new CenterPanel();
// 设置主框架的布局
Container c = this.getContentPane();
// c.setLayout(new BorderLayout())
this.setJMenuBar(menuTest);
c.add(leftPanel,BorderLayout.WEST);
c.add(rightPanel,BorderLayout.EAST);
c.add(centerPanel,BorderLayout.CENTER);
c.add(bottomPanel,BorderLayout.SOUTH);
// 利⽤⽆名内隐类,增加窗⼝事件
this.addWindowListener(new WindowAdapter()
{
public void WindowClosing(WindowEvent e)
{
// 释放资源,退出程序
dispose();
System.exit(0);
}
});
setSize(700,500);
setTitle("Swing 组件⼤全简体版");
// 隐藏frame的标题栏,此功暂时关闭,以⽅便使⽤window事件
// setUndecorated(true);
setLocation(200,150);
show();
}
////////////////////////////////////////////////////////////////////////////
/**
* 菜单栏处理模块
* JMenuBar --+
* --JMenu--+
* --JMenuItem --ActionListener
*
*/
class MenuTest extends JMenuBar
{
private JDialog aboutDialog;
/**
* 菜单初始化操作
*/
public MenuTest()
{
JMenu fileMenu = new JMenu("⽂件");
JMenuItem exitMenuItem = new JMenuItem("退出",KeyEvent.VK_E);
JMenuItem aboutMenuItem = new JMenuItem("关于...",KeyEvent.VK_A);
fileMenu.add(exitMenuItem);
fileMenu.add(aboutMenuItem);
this.add(fileMenu);
aboutDialog = new JDialog();
initAboutDialog();
// 菜单事件
exitMenuItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
dispose();
System.exit(0);
}
});
aboutMenuItem.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
// "关于"对话框的处理
aboutDialog.show();
}
});
}
/**
* 返回关于对话框
*/
public JDialog getAboutDialog()
{
return aboutDialog;
}
/**
* 设置"关于"对话框的外观及响应事件,操作和JFrame⼀样都是在内容
* 框架上进⾏的
*/
public void initAboutDialog()
{
aboutDialog.setTitle("关于");
Container con =aboutDialog.getContentPane();
// Swing 中使⽤html语句
Icon icon = new ImageIcon("smile.gif");
JLabel aboutLabel = new JLabel("<html><b><font size=5>"+
"<center>Swing 组件⼤全简体版!"+"<br>天翼.李",icon,JLabel.CENTER);
//JLabel aboutLabel = new JLabel("Swing 组件⼤全简体版!",icon,JLabel.CENTER); con.add(aboutLabel,BorderLayout.CENTER);
aboutDialog.setSize(450,225);
aboutDialog.setLocation(300,300);
aboutDialog.addWindowListener(new WindowAdapter()
{
public void WindowClosing(WindowEvent e)
{
dispose();
}
});
}
}
////////////////////////////////////////////////////////////////////////////
/**
* 最左边模块,继承JPanel,初始化内容为JTree
* JPanel--+
* --JTree
*/
class LeftPanel extends JPanel
{
private int i = 0;
public LeftPanel()
{
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
DefaultMutableTreeNode child = new DefaultMutableTreeNode("Child");
DefaultMutableTreeNode select = new DefaultMutableTreeNode("select");
DefaultMutableTreeNode child1 = new DefaultMutableTreeNode(""+i);
root.add(child);
root.add(select);
child.add(child1);
JTree tree = new JTree(root);
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION); // 每个节点的⾏⾼
tree.setRowHeight(20);
tree.addTreeSelectionListener(new TreeSelectionListener ()
{
public void valueChanged(TreeSelectionEvent e)
{
// 内隐类不能直接引⽤外部类tree,1.外部变量可申明为final 2.新建外部类的对象
JTree tree =(JTree)e.getSource();
DefaultMutableTreeNode selectNode = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent(); i++;
selectNode.add(new DefaultMutableTreeNode(""+i));
}
});
tree.setPreferredSize(new Dimension(100,300));
// tree.setEnabled(true);
JScrollPane scrollPane = new JScrollPane(tree);
//scrollPane.setSize(100,350);
this.add(scrollPane);
}
}
////////////////////////////////////////////////////////////////////////////
/**
* 最下⾯层模块,继承JPanel,初始化内容为进度条,并由定时器控制
* JPanel--+
* --JProcessBar --Timer
*/
class BottomPanel extends JPanel
{
private JProgressBar pb;
////////////////////////////////////////
//public class
//////////////////////////////
public BottomPanel()
{
pb = new JProgressBar();
pb.setPreferredSize(new Dimension(680,20));
// 设置定时器,⽤来控制进度条的处理
Timer time = new Timer(1,new ActionListener()
{
int counter = 0;
public void actionPerformed(ActionEvent e)
{
counter++;
pb.setValue(counter);
Timer t = (Timer)e.getSource();
// 如果进度条达到最⼤值重新开发计数
if (counter == pb.getMaximum())
{
t.stop();
counter =0;
t.start();
}
}
});
time.start();
pb.setStringPainted(true);
pb.setMinimum(0);
pb.setMaximum(1000);
pb.setBackground(Color.white);
pb.setForeground(Color.red);
this.add(pb);
}
/**
* 设置进度条的数据模型
*/
public void setProcessBar(BoundedRangeModel rangeModel)
{
pb.setModel(rangeModel);
}
}
////////////////////////////////////////////////////////////////////////////
/**
* 最右边模块,继承JPanel,初始化各种按钮
* JPanel--+
* --JButton --JToggleButton -- JList -- JCombox --JCheckBox ....
*/
class RightPanel extends JPanel
{
public RightPanel()
{
this.setLayout(new GridLayout(8,1));
// 初始化各种按钮
JCheckBox checkBox = new JCheckBox("复选按钮");
JButton button = new JButton("打开⽂件");
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
JFileChooser file = new JFileChooser();
int result = file.showOpenDialog(new JPanel());
if (result ==file.APPROVE_OPTION)
{
String fileName = file.getSelectedFile().getName();
String dir = file.getCurrentDirectory().toString();
JOptionPane.showConfirmDialog(null,dir+"\\"+fileName,"选择的⽂件",JOptionPane.YES_OPTION); }
}
});
////////////////////////////////////////
//public
//////////////////////////////////////////
JToggleButton toggleButton = new JToggleButton("双态按钮");
ButtonGroup buttonGroup = new ButtonGroup();
JRadioButton radioButton1 = new JRadioButton("单选按钮1",false);
JRadioButton radioButton2 = new JRadioButton("单选按钮2",false);
// 组合框的处理
JComboBox comboBox = new JComboBox();
comboBox.setToolTipText("点击下拉列表增加选项");
comboBox.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
JComboBox comboBox =(JComboBox)e.getSource();
comboBox.addItem("程序员");
comboBox.addItem("分析员");
}
});
// 列表框的处理
DefaultListModel litem = new DefaultListModel();
litem.addElement("⾹蕉");
litem.addElement("⽔果");
JList list = new JList(litem);
list.addListSelectionListener(new ListSelectionListener ()
{
public void valueChanged(ListSelectionEvent e)
{
JList l = (JList)e.getSource();
Object s= l.getSelectedValue();
JOptionPane.showMessageDialog(null,s,"消息框",JOptionPane.YES_OPTION);
}
});
// 增加按钮组
buttonGroup.add(radioButton1);
buttonGroup.add(radioButton2);
// 增加各种按钮到JPanel中显⽰
add(button);
add(toggleButton);
add(checkBox);
add(radioButton1);
add(radioButton2);
add(comboBox);
add(list);
this.setBorder(new EtchedBorder(EtchedBorder.LOWERED,Color.LIGHT_GRAY,Color.blue)); }
}
////////////////////////////////////////////////////////////////////////////
/**
* 中间层模块,继承JPanel,初始化页签,并在页签中设置⽂本区,表格,
* ⽂本区上下⽤分隔条分隔
* JPanel--+
* -JTabbedPane--+
* --Draw --JTable -JTextAreas -JText --JPopupMenu
*/
class CenterPanel extends JPanel
{
public CenterPanel()
JTabbedPane tab = new JTabbedPane(JTabbedPane.TOP);
JTextField textField = new JTextField("⽂本域,点击打开<⽂件按钮>可选择⽂件");
textField.setActionCommand("textField");
JTextPane textPane = new JTextPane();
textPane.setCursor(new Cursor(Cursor.TEXT_CURSOR));
textPane.setText("编辑器,试着点击⽂本区,试着拉动分隔条。

");
textPane.addMouseListener(new MouseAdapter ()
{
public void mousePressed (MouseEvent e)
{
JTextPane textPane = (JTextPane)e.getSource();
textPane.setText("编辑器点击命令成功");
// textField.setText(""+textPane.getText());
}
});
/*
UpperCaseDocument doc = new Document();
textField.setDocumentsetDocument(doc);
doc.addDocumentListener(new DocumentListener()
{
public void changedUpdate(DocumentEvent e){}
public void removeUpdate(DocumentEvent e){}
public void insertUpdate(DocumentEvent e)
{
Document text = (Document)e.getDocument();
text.setText("复制成功");
}
});
*/
JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,textField,textPane); JTable table = new JTable(10,10);
//table.showHorizontalLines(true);
//table.showVerticalLines(true);
//table.gridColor(Color.blue);
JPanel pane = new JPanel();
pane.add(table.getTableHeader(),BorderLayout.NORTH);
pane.add(table);
tab.addTab("⽂本演⽰",splitPane);
//tab.addTab(table.getTableHeader());
tab.addTab("表格演⽰",pane);
tab.setPreferredSize(new Dimension(500,600));
this.add(tab);
this.setEnabled(true);
}
}
public static void main(String args[])
{
// 设置主框架属性,此处没有使⽤,可打开看看效果
//try
//{
// UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
//}
//catch (Exception e){}
new SwingTest();
}
}。

相关文档
最新文档