write:2022-3-28

文章目录

  • 边框(Border)
  • 文本框(JTextFied)
  • 文本区域(JTextArea)与滚动面板(JScrollPane)
  • 下拉列表(JComboBox)
  • 菜单(JMenu)
  • 对话框(JDialog)
  • 课堂小结

边框(Border)

JComponent类有一个setBorder(Border border)方法,用来为组件设置边框。
所有的边框类都实现了javax.swing.border.Border接口。

各种border的形式:

eg:(在一个面板中创建多种Border)

package Swing;import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;public class BordersDemo extends JFrame {/** 按照参数指定的边框创建一个JPanel对象 */public static JPanel getPanelWithBorder(Border b){JPanel jp = new JPanel();jp.setLayout(new BorderLayout());String nm = b.getClass().toString();//获得边框对象b的完整的类名  eg:得到javax.swing.border.TitleBordernm = nm.substring(nm.lastIndexOf('.')+1);//去掉前缀包名  eg:上述去掉包名得到TitleBorder//在JPanel中央有一个JLabel,它显示边框类的名字jp.add(new JLabel(nm,JLabel.CENTER),BorderLayout.CENTER);jp.setBorder(b);//设置JPanel的边框return jp;}//构造方法public BordersDemo(String title){super(title);setLayout(new GridLayout(2,4));add(getPanelWithBorder (new TitledBorder("Title")));//带标题的边框add(getPanelWithBorder (new EtchedBorder()));//嵌入式的边框add(getPanelWithBorder (new LineBorder(Color.BLUE)));//带有边界线的边框,边界线颜色为蓝色add(getPanelWithBorder(new MatteBorder(5,5,30,30,Color.PINK)));add(getPanelWithBorder (new BevelBorder(BevelBorder.RAISED)));//凸起来的边框add(getPanelWithBorder (new SoftBevelBorder(BevelBorder.LOWERED)));//凹下去的边框add(getPanelWithBorder(new CompoundBorder(new EtchedBorder(), new LineBorder(Color.BLUE))));setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);pack();setVisible(true);}public static void main(String[] args) {new BordersDemo("Hello");}
}

运行结果:

文本框(JTextFied)

文本框用来显示或者输入文本;
JTextField与一个javax.swing.text.PlainDocument关联,PlainDocument保存了JTextField的文档。
当用户向文本框输入文本,AWT线程(JVM自动创建,作用:显示图形界面外观以及响应图形界面上的各种操作)会自动调用PlainDocument的insertString()方法,把用户输入的文本存放到PlainDocument中。

eg:

package Swing;import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class TextFieldDemo extends JFrame {private JButton b1 = new JButton("输入文本"),b2 = new JButton("拷贝");//三个文本框private JTextFieldt1 = new JTextField(30),t2 = new JTextField(30),t3 = new JTextField(30);private String str = new String();//存放用户当前选择的文本private UpperCaseDocument ucd = new UpperCaseDocument();//构造方法public TextFieldDemo(String title){super(title);//为两个Button注册事件监听器b1.addActionListener(new ActionListenerB1());b2.addActionListener(new ActionListenerB2());t1.setDocument(ucd);//使t1文本框和UpperCaseDocument对象ucd关联ucd.addDocumentListener(new DocumentListenerT());//为UpperCaseDocument对象ucd注册文档监听器setLayout(new GridLayout(4,1));JPanel buttonPanel = new JPanel();buttonPanel.add(b1);buttonPanel.add(b2);add(buttonPanel);add(t1);add(t2);add(t3);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);pack();setVisible(true);}//主函数public static void main(String[] args) {new TextFieldDemo("Hello");}//两个按钮的监听事件
class ActionListenerB1 implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {t1.setEditable(true);//按钮b1按钮,文本框t1是可编辑的}
}
class ActionListenerB2 implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {if (t1.getSelectedText()==null)//若选择文本的为空,则读取整个文本框的所有文本,否则只读取选择的str = t1.getText();elsestr = t1.getSelectedText();ucd.setUpperCase(false);t1.setText("Inserted by Button2:"+str);//重新设置文本框内容ucd.setUpperCase(true);t1.setEditable(false);//文本框t1不是可编辑的}
}
//UpperCaseDocument对象ucd的监听器
class DocumentListenerT implements DocumentListener{@Overridepublic void insertUpdate(DocumentEvent e) {//增加操作t2.setText(t1.getText());//显示与t1文本框一样得内容t3.setText("Text:"+t1.getText());}@Overridepublic void removeUpdate(DocumentEvent e) {//删除操作t2.setText(t1.getText());}@Overridepublic void changedUpdate(DocumentEvent e) {}//修改操作
}
}
//关联
class UpperCaseDocument extends PlainDocument{  //可与文本框关联private boolean upperCase = true;public void setUpperCase(boolean flag){upperCase = flag;}public void insertString(int offset, String str, AttributeSet attSet) throws BadLocationException{   //覆盖了plainDocument的insertString方法if (upperCase) str = str.toUpperCase();//把用户输入的文本改成大写super.insertString(offset, str, attSet);//调用父类的insertString方法}
}

运行结果

按下“输入文本”按钮:

选中后三个单词然后按下“拷贝”按钮:

文本区域(JTextArea)与滚动面板(JScrollPane)

JTextField与JTextArea的区别:
1)JTextField表示文本框,只能输入一行文本,而JTextArea表示文本区域,可以输入多行文本。
2)当用户在文本框内输入回车,将触发ActionEvent事件。当用户在文本区域内输入回车,仅仅意味着换行输入文本,并不会触发ActionEvent事件。如果希望对文本区域内的文本进行保存或拷贝等操作,应该使用另外的按钮或菜单来触发ActionEvent事件。

图形区别:

JScrollPane表示带滚动条的面板,默认情况下,只有当面板中的内容超过了面板的面积时,才会显示滚动条。
在构造JScrollPane对象时,也可以在构造方法中指定在水平方向和垂直方向滚动条的显示方式。

eg:

package Swing;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class TextAreaDemo extends JFrame {JTextArea area1 = new JTextArea(5,10);JTextArea area2 = new JTextArea(5,10);//创建5行10列的文本区域//在垂直方向总是显示滚动条,在水平方向只有当需要的时候才显示滚动条JScrollPane pane1 = new JScrollPane(area1,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);//panel2按默认方式创建,在垂直和水平方向都只有当需要的时候才显示滚动条JScrollPane pane2 = new JScrollPane(area2);JButton copyButton = new JButton("copy");//构造方法public TextAreaDemo(String title){super(title);copyButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {area2.setText(area1.getSelectedText()); //把第一个文本区域中被选中的文本拷贝到第二个文本区域中}});setLayout(new FlowLayout());add(pane1);add(copyButton);add(pane2);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);pack();setVisible(true);}public static void main(String[] args) {new TextAreaDemo("Hello");}
}

运行结果:

输入文字后选中部分文字点击按钮:(回车只代表换行)

下拉列表(JComboBox)

JComboBox表示下拉列表,可以提供多个选项,并且只允许用户选择一项。下拉列表的优点在于能节省空间,使界面更加紧凑。只有当用户点击下拉列表,才会显示列表中的所有选项。
默认情况下,JComboBox是不可编辑的,可以调用setEditable(true)使它可以被编辑。

eg:

package Swing;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;public class ComboBoxDemo extends JFrame {//下拉列表的初始选项private Set<String> initCities = new HashSet<String>(Arrays.asList(new String[]{"北京","上海","南京","杭州","深圳"}));//可以下拉列表增添的新的的选项private Set<String> moreCities = new HashSet<String>(Arrays.asList(new String[]{"济南","沈阳","合肥","拉萨","重庆","兰州"}));private JTextField textField = new JTextField(20);private JComboBox<String> comboBox = new JComboBox<String>();private JButton button = new JButton("添加城市");//构造方法public ComboBoxDemo(String title){super(title);for (String city:initCities)comboBox.addItem(city);//使用循环遍历initCities集合中的每个元素,并加入下拉列表中//button注册事件监听器button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {String city = (String)comboBox.getSelectedItem();if (moreCities.contains(city)){//判断用户输入的城市是否在moreCities列表中comboBox.addItem(city); //向下拉列表中加入新的城市textField.setText("添加"+city+"成功");moreCities.remove(city);}else {textField.setText("添加"+city+"失败。不在可选范围内。");}}});//comboBox注册事件监听器(当用户在下拉列表中选中某一项触发)comboBox.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {textField.setText("index:"+comboBox.getSelectedIndex()+" "+comboBox.getSelectedItem());}});comboBox.setEditable(true); //使下拉列表可以被编辑textField.setEditable(false);setLayout(new FlowLayout());add(comboBox);add(button);add(textField);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);pack();setVisible(true);}public static void main(String[] args) {new ComboBoxDemo("Hello");}
}

运行结果

当在下拉列表中选中某一项时:

当在下拉列表中输入某个城市并点击“添加城市”按钮时:

菜单(JMenu)

菜单的组织方式为:一个菜单条JMenuBar中可以包含多个菜单JMenu,一个菜单JMenu中可以包含多个菜单项JMenuItem。有一些支持菜单的组件,如JFrame、JDialog和JApplet有一个setMenuBar(JMenuBar bar)方法,可以用这个方法来设置菜单条。
JMenuItem有两个子类:JRadioButtonMenuItem和JCheckBoxMenuItem,它们分别表示单选菜单项和复选菜单项。
当用户选择了某个菜单项,就会触发一个ActionEvent事件,该事件由ActionListener负责处理。
图解:

eg:

package Swing;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;public class MenuDemo extends JFrame {private final Color colorValues[]={ Color.BLACK, Color.BLUE,Color.RED, Color.GREEN };private JRadioButtonMenuItem colorItems[], fonts[];private JCheckBoxMenuItem styleItems[];private JLabel displayLabel;private ButtonGroup fontGroup, colorGroup;private int style;public MenuDemo(String title) {super(title);JMenu fileMenu = new JMenu("File");fileMenu.setMnemonic('F');  //设置快捷键JMenuItem aboutItem = new JMenuItem("About...");aboutItem.setMnemonic('A');  //设置快捷键fileMenu.add(aboutItem);aboutItem.addActionListener(new ActionListener() {@Override// 显示一个消息对话框public void actionPerformed(ActionEvent event){JOptionPane.showMessageDialog(MenuDemo.this,"本例子用于演示菜单的用法","About", JOptionPane.PLAIN_MESSAGE);}});JMenuItem exitItem = new JMenuItem("Exit");exitItem.setMnemonic('x');fileMenu.add(exitItem);exitItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event){System.exit(0);}});JMenuBar bar = new JMenuBar();setJMenuBar(bar);  //在JFrame中设置菜单条bar.add(fileMenu);JMenu formatMenu = new JMenu("Format");formatMenu.setMnemonic('r');String colors[]= { "Black", "Blue", "Red", "Green" };JMenu colorMenu = new JMenu("Color");colorMenu.setMnemonic('C');colorItems = new JRadioButtonMenuItem[colors.length ];colorGroup = new ButtonGroup();ItemHandler itemHandler = new ItemHandler();for(int count = 0; count < colors.length; count++) {colorItems[count]=new JRadioButtonMenuItem(colors[count]);colorMenu.add(colorItems[count]);colorGroup.add(colorItems[count]);colorItems[count].addActionListener(itemHandler);}colorItems[0 ].setSelected(true);formatMenu.add(colorMenu);formatMenu.addSeparator();String fontNames[]= { "Serif", "Monospaced", "SansSerif" };JMenu fontMenu = new JMenu("Font");fontMenu.setMnemonic('n');fonts = new JRadioButtonMenuItem[fontNames.length ];fontGroup = new ButtonGroup();for (int count = 0; count < fonts.length; count++) {fonts[count ]= new JRadioButtonMenuItem(fontNames[count]);fontMenu.add(fonts[count]);fontGroup.add(fonts[count]);fonts[count].addActionListener(itemHandler);}fonts[0].setSelected(true);fontMenu.addSeparator(); //设置分割线String styleNames[]= { "Bold", "Italic" };styleItems = new JCheckBoxMenuItem[styleNames.length ];StyleHandler styleHandler = new StyleHandler();for (int count = 0; count < styleNames.length; count++) {styleItems[count]=new JCheckBoxMenuItem(styleNames[count]);fontMenu.add(styleItems[count]);styleItems[count].addItemListener(styleHandler);}formatMenu.add(fontMenu);bar.add(formatMenu);displayLabel = new JLabel("Hello World", SwingConstants.CENTER);displayLabel.setForeground(colorValues[0]);displayLabel.setFont(new Font("Serif", Font.PLAIN, 72));setBackground(Color.WHITE);add(displayLabel, BorderLayout.CENTER);setSize(500, 200);setVisible(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public static void main(String args[]){ new MenuDemo("Hello");  }/** 处理MenuItem的事件 */private class ItemHandler implements ActionListener {public void actionPerformed(ActionEvent event){// 处理颜色for(int count = 0; count < colorItems.length; count++)if(colorItems[count].isSelected()) {displayLabel.setForeground(colorValues[count]);break;}// 处理字体for(int count = 0; count < fonts.length; count++)if(event.getSource() == fonts[count]) {displayLabel.setFont(new Font(fonts[count].getText(), style, 72));break;}repaint();}}/** 处理复选菜单项的事件 */private class StyleHandler implements ItemListener {@Overridepublic void itemStateChanged(ItemEvent e){style = 0;if(styleItems[0].isSelected())style += Font.BOLD;if(styleItems[1].isSelected()) style += Font.ITALIC;displayLabel.setFont(new Font(displayLabel.getFont().getName(),style,72));repaint();}}
}

运行结果:

对话框(JDialog)

JDialog表示对话框。对话框是在现有窗口的基础上弹出的另一个窗口。
对话框可用来处理个别细节问题,使得这些细节不与原先窗口的内容混在一起。JDialog的默认布局管理器为BorderLayout。

  1. JDialog的默认布局管理器为BorderLayout,它具有以下形式的构造方法:
    public JDialog(Frame owner,String title,boolean modal)
    以上参数owner表示对话框所属的Frame,参数title表示对话框的标题,参数modal有两个可选值:
    参数modal为true:表示模式对话框,这是JDialog的默认值。如果对话框被显示,那么其他窗口都处于不活动状态,只有当用户关闭了对话框,才能操纵其他窗口。
    参数modal为false:表示非模式对话框。当对话框被显示,其他窗口照样处于活动状态。
  2. 当对话框被关闭时,通常不希望结束整个应用程序,因此只需调用JDialog的dispose()方法销毁对话框,从而释放对话框所占用的资源。

eg:

package Swing;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;public class DialogDemo extends JFrame {private JButton button = new JButton("提交");private MyDialog dialog = new MyDialog(this);private JTextField textField = new JTextField(10);public DialogDemo(String title){super(title);textField.setEditable(false);button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {dialog.setVisible(true);textField.setText(dialog.getText());}});setLayout(new FlowLayout());add(textField);add(button);setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );setSize(500,300);    setVisible( true );}public static void main( String args[] ){new DialogDemo("DialogDemo");  }}class MyDialog extends JDialog{private JLabel label = new JLabel("请输入姓名:");private JTextField textField = new JTextField(10);private JButton button = new JButton("OK");public MyDialog(JFrame parent){super(parent,"提示",true);setLayout(new FlowLayout());add(label);add(textField);button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {dispose();// 销毁对话框(只是图形界面销毁,dialog对象仍然存在)}});add(button);pack();}public String getText(){return  textField.getText();}
}

运行结果:
点击“提交”按钮:

输入:perth

点击“OK”:

课堂小结

介绍了一些常见的Swing组件的用法,在使用Swing组件时,主要要掌握以下内容:
(1)Swing组件的构造方法。多数Swing组件都有默认构造方法,此外还有带参数的构造方法,用来设置组件的显示方式或工作方式。比如在构造对话框JDialog实例时,可以指定是否为模式对话框。
(2)各种Swing组件的使用场合,比较功能相近的Swing组件的区别。比如JTextField和JTextArea都支持输入和显示文本,前者只能处理单行文本,而后者能够处理多行文本。
(3)各种Swing组件所能触发的事件以及相应的事件监听器。各种按钮(包括菜单项)都会触发ActionEvent事件。当用户在JTextField中输入回车,会触发ActionEvent事件,而在JTextArea中输入回车,不会触发任何ActionEvent事件。ActionEvent事件的监听器为ActionListener。

JAVA之Swing组件(常用)相关推荐

  1. JAVA中Swing组件的标签,组合框和列表

    依旧接着上一篇文章来介绍Swing组件: 一.JLabel: 标签就是一个静态文本,使用方法也是很简单: 我们看一下例子: public class Action extends JFrame{JLa ...

  2. java的Swing组件模拟qq登录界面

    代码来自传智播客第二版(java)图片可根据自己喜好下载相关图片,建议将图片放到工作空间的目录下面,这样就可以直接获取图片,例如以这个格式"xxx.jpg",xxx图片名,jpg格 ...

  3. 用java的swing组件实现简易的图书管理系统

    图书管理系统在生活和学校中是最为常见的,这学期的java课程设计题目中的其中一个就是实现图书管理系统, 做完课设后,在此记录下. 我的图书管理系统一共分为几个模块.图书查询模块,管理员模块(默认只有一 ...

  4. java Swing组件总结

    文章目录 Jframe JDialog JPanel和JScrollPane容器 文本组件 按钮组件 1.JCheckBox 2.JRadionButton JComboBox组件 菜单组件 1.下拉 ...

  5. java 画笔跟swing组件_「软帝学院」:2019思维最清晰的java学习路线

    第一步 首先要做好学习前的准备工作:java语言一般用于大型的服务器程序开发,所有有必要了解如下内容:Unix开发环境Unix系统原理.Unix开发环境.Unix常用命令.熟练掌握Unix常用命令:熟 ...

  6. java 语言程序设计 李尊朝 第12章 Swing 组件

    早期的JDK版本中提供了Java抽象窗口工具集(Abstract Window Toolkit, AWT),其目的是为程序员创建图形用户界面提供支持,但是AWT功能有限,因此在后来的JDK版 本中,又 ...

  7. Java核心(Swing 程序设计3-常用面板、按钮组件)

    一.常用面板 面板也是一个 Swing 容器,它可以作为容器容纳其他组件,但它必须被添加到其他容器中.Swing 中常用的面板包括 JPanel 面板以及 JScrollPane 面板. 1.1 JP ...

  8. java swing 控件_Java Swing组件

    一.        java swing 组件技术简介 1.swing的特性 l  是AWT的扩展,swing比AWT提供了更多的组件和外观 l  它是纯java代码编写(除了JFrame.JDial ...

  9. java swing控件大全_java swing 组件大全(新手快进)

    import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.tree.*; import  ...

最新文章

  1. DTH11驱动实例稳定修改补充
  2. Mycat源码中的单例模式
  3. php curl cookiejar,php使用CURL不依赖COOKIEJAR获取COOKIE的方法
  4. Spring-Aop-注解实现
  5. python的.arsort()函数的用法
  6. Python_模块Module
  7. dao和mysql映射_hibernate通过数据库生成实体类,映射文件和DAO(实用)
  8. 工程实践中最常用的10大数据结构与算法讲解
  9. 武汉市计算机学校报名条件,自主招生报名条件
  10. 这些和编程有关的日本动漫,你都看过那几部?
  11. 【手写汉字识别】基于深度学习的脱机手写汉字识别技术研究
  12. 我打算学python,可是我的拖延症已经晚期了
  13. 心情日志 —— 2015/09/09
  14. 冠军斩获10万奖金!首届“域见杯”医检AI开发者大赛精彩落幕
  15. 以色列初创企业Skyline AI获300万美元种子融资,红杉资本领投
  16. ubuntu下安装Qt操作流程
  17. gappproxy教育网代理
  18. 【Airtest更新】AirtestIDE更新至1.2.10;Airtest更新至1.2.0
  19. iframe详细介绍
  20. 2022年12月编程语言排行榜,最新数据来了!

热门文章

  1. Lichee Zero 荔枝派 零 入坑记录
  2. 网络安全CTF夺旗赛入门到入狱-密码学下篇
  3. Unix下C语言开发工具
  4. 用到zlib库的程序运行时报错:无法定位程序输入点createfile2于动态链接库KERNEL32.DLL上
  5. 基于JAVA语言的中小型企业进销存系统
  6. Python5小时爬取100G图片的代码
  7. 计算机机房整改工作报告,机房整改总结.doc
  8. openCV Python基础--镜像翻转和图像旋转
  9. 淘宝顶部导航——待解决的问题——已解决
  10. 雅可比迭代法——高赛迭代法