• Swing基本组件的用法(一)


    语雀笔记:https://www.yuque.com/huangzhanqi/rhwoir/paaoghdyv0tgksk1icon-default.png?t=N7T8https://www.yuque.com/huangzhanqi/rhwoir/paaoghdyv0tgksk1Java图形化界面: Java图形化界面学习demo与资料 (gitee.com)icon-default.png?t=N7T8https://gitee.com/zhanqi214/java-graphical-interface

    Swing组件层次

    Swing组件继承体系图:

    大部分Swing 组件都是 JComponent抽象类的直接或间接子类(并不是全部的 Swing 组件),JComponent 类定义了所有子类组件的通用方法 ,JComponent 类是 AWT 里 java.awt. Container 类的子类 ,这也是 AWT 和 Swing 的联系之一。 绝大部分 Swing 组件类继承了 Container类,所以Swing 组件都可作为 容器使用 ( JFrame继承了Frame 类)。

    Swing组件和AWT组件的对应关系:

    大部分情况下,只需要在AWT组件的名称前面加个J,就可以得到其对应的Swing组件名称,但有几个例外:

    1. JComboBox: 对应于 AWT 里的 Choice 组件,但比 Choice 组件功能更丰富 。
      1. JFileChooser: 对应于 AWT 里的 FileDialog 组件 。
        1. JScrollBar: 对应于 AWT 里的 Scrollbar 组件,注意两个组件类名中 b 字母的大小写差别。
        2. JCheckBox : 对应于 AWT 里的 Checkbox 组件, 注意两个组件类名中 b 字母的大小 写差别 。
        3. JCheckBoxMenultem: 对应于 AWT 里的 CheckboxMenuItem 组件,注意两个组件类名中 b字母的大小写差别。

    Swing组件按照功能来分类:

    1. 顶层容器: JFrame、JApplet、JDialog 和 JWindow 。
      1. 中间容器: JPanel 、 JScrollPane 、 JSplitPane 、 JToolBar 等 。
      2. 特殊容器:在用户界面上具有特殊作用的中间容器,如 JIntemalFrame 、 JRootPane 、 JLayeredPane和 JDestopPane 等 。
      3. 基本组件 : 实现人机交互的组件,如 JButton、 JComboBox 、 JList、 JMenu、 JSlider 等 。
      4. 不可编辑信息的显示组件:向用户显示不可编辑信息的组件,如JLabel 、 JProgressBar 和 JToolTip等。
      5. 可编辑信息的显示组件:向用户显示能被编辑的格式化信息的组件,如 JTable 、 JTextArea 和JTextField 等 。
      6. 特殊对话框组件:可以直接产生特殊对话框的组件 , 如 JColorChooser 和 JFileChooser 等。

    AWT组件的Swing实现

    Swing 为除 Canvas 之外的所有 AWT 组件提供了相应的实现,Swing 组件比 AWT 组件的功能更加强大。相对于 AWT 组件, Swing 组件具有如下 4 个额外的功能 :

    1. 可以为 Swing 组件设置提示信息。使用 setToolTipText()方法,为组件设置对用户有帮助的提示信息 。
    2. 很多 Swing 组件如按钮、标签、菜单项等,除使用文字外,还可以使用图标修饰自己。为了允许在 Swing 组件中使用图标, Swing为Icon 接口提供了 一个实现类: Imagelcon ,该实现类代表一个图像图标。
    3. 支持插拔式的外观风格。每个 JComponent 对象都有一个相应的 ComponentUI 对象,为它完成所有的绘画、事件处理、决定尺寸大小等工作。 ComponentUI 对象依赖当前使用的 PLAF , 使用 UIManager.setLookAndFeel()方法可以改变图形界面的外观风格 。
    4. 支持设置边框。Swing 组件可以设置一个或多个边框。 Swing 中提供了各式各样的边框供用户边 用,也能建立组合边框或自己设计边框。 一种空白边框可以用于增大组件,同时协助布局管理器对容器中的组件进行合理的布局。

    每个 Swing 组件都有一个对应的UI 类,例如 JButton组件就有一个对应的 ButtonUI 类来作为UI代理 。每个 Swing组件的UI代理的类名总是将该 Swing 组件类名的 J 去掉,然后在后面添加 UI 后缀 。 UI代理类通常是一个抽象基类 , 不同的 PLAF 会有不同的UI代理实现类 。 Swing 类库中包含了几套UI代理,分别放在不同的包下, 每套UI代理都几乎包含了所有 Swing组件的 ComponentUI实现,每套这样的实现都被称为一种PLAF 实现 。以 JButton 为例,其 UI 代理的继承层次下图:

    如果需要改变程序的外观风格, 则可以使用如下代码:

    1. //容器:
    2. JFrame jf = new JFrame();
    3. try {
    4. //设置外观风格
    5. UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
    6. //刷新jf容器及其内部组件的外观
    7. SwingUtilities.updateComponentTreeUI(jf);
    8. } catch (Exception e) {
    9. e.printStackTrace();
    10. }

    案例:

    使用Swing组件,实现下图中的界面效果:

    演示代码:

    1. package swing;
    2. import awt.day01.Utils;
    3. import javax.swing.*;
    4. import java.awt.*;
    5. import java.awt.event.ActionEvent;
    6. import java.awt.event.InputEvent;
    7. public class SwingComponentDemo {
    8. private JFrame frame = new JFrame("Swimg测试");
    9. private JMenuBar jMenuBar = new JMenuBar();
    10. private JMenu fileMenu = new JMenu("文件");
    11. private JMenuItem openFile = new JMenuItem("打开文件");
    12. private JMenuItem newFile = new JMenuItem("新建文件");
    13. private JMenuItem saveFile = new JMenuItem("保存文件");
    14. private JMenuItem exit = new JMenuItem("退出",new ImageIcon("src/swing/img/component/exit.png"));
    15. private JMenu editMenu = new JMenu("编辑");
    16. private JCheckBoxMenuItem autoWrap = new JCheckBoxMenuItem("自动换行");
    17. private JMenuItem copy = new JMenuItem("复制",new ImageIcon("src/swing/img/component/copy.png"));
    18. private JMenuItem paste = new JMenuItem("粘贴",new ImageIcon("src/swing/img/component/paste.png"));
    19. private JMenu formate = new JMenu("格式");
    20. private JMenuItem annotation = new JMenuItem("注释");
    21. private JMenuItem deAnnotation = new JMenuItem("取消注释");
    22. private Box xBox = new Box(BoxLayout.X_AXIS);
    23. private Box yBox = new Box(BoxLayout.Y_AXIS);
    24. private Box vBox = new Box(BoxLayout.Y_AXIS);
    25. private JPanel panel1 = new JPanel();
    26. private JPanel panel2 = new JPanel();
    27. private String[] color = {"红色", "绿色", "蓝色"};
    28. private JComboBox jComboBox = new JComboBox<>(color);
    29. private JList jList = new JList<>(color);
    30. private JTextArea textArea = new JTextArea(8, 20);
    31. private JRadioButton male = new JRadioButton("男", true);
    32. private JRadioButton female = new JRadioButton("女", false);
    33. private ButtonGroup genderGroup=new ButtonGroup();
    34. private JCheckBox isMarried = new JCheckBox("是否已婚?", false);
    35. private JTextField textField = new JTextField(30);
    36. private JButton ok = new JButton("确定", new ImageIcon("src/swing/img/component/ok.png"));
    37. private JPopupMenu popupMenu = new JPopupMenu();
    38. private ButtonGroup styleGroup = new ButtonGroup();
    39. JRadioButtonMenuItem metalItem = new JRadioButtonMenuItem("Metal 风格",true);
    40. JRadioButtonMenuItem nimbusItem = new JRadioButtonMenuItem("Nimbus 风格",true);
    41. JRadioButtonMenuItem windowsItem = new JRadioButtonMenuItem("Windows 风格",true);
    42. JRadioButtonMenuItem classicItem = new JRadioButtonMenuItem("Windows 经典风格",true);
    43. JRadioButtonMenuItem motifItem = new JRadioButtonMenuItem("Motif 风格",true);
    44. // JScrollPane scrollPane = new JScrollPane();
    45. public void init(){
    46. //菜单栏
    47. frame.setJMenuBar(jMenuBar);
    48. frame.setBackground(Color.GRAY);
    49. jMenuBar.add(fileMenu);
    50. jMenuBar.add(editMenu);
    51. fileMenu.add(openFile);
    52. fileMenu.add(newFile);
    53. fileMenu.add(saveFile);
    54. fileMenu.add(exit);
    55. editMenu.add(autoWrap);
    56. editMenu.add(copy);
    57. editMenu.add(paste);
    58. editMenu.add(formate);
    59. formate.add(annotation);
    60. formate.add(deAnnotation);
    61. annotation.setToolTipText("将程序代码注释起来");
    62. exit.addActionListener(e -> System.exit(0));
    63. newFile.setAccelerator(KeyStroke.getKeyStroke('N', InputEvent.CTRL_MASK));
    64. newFile.addActionListener(e -> textArea.append("用户点击了新建文件"));
    65. saveFile.setAccelerator(KeyStroke.getKeyStroke('S',InputEvent.CTRL_MASK));
    66. saveFile.addActionListener(this::textAreaClear);
    67. //X轴box组装
    68. frame.add(xBox);
    69. xBox.add(yBox);
    70. xBox.add(jList);
    71. //Y轴box组装
    72. yBox.add(vBox);
    73. vBox.add(textArea);
    74. vBox.add(panel1);
    75. vBox.add(panel2);
    76. panel1.add(jComboBox);
    77. genderGroup.add(male);
    78. genderGroup.add(female);
    79. panel1.add(male);
    80. panel1.add(female);
    81. panel1.add(isMarried);
    82. panel2.add(textField);
    83. panel2.add(ok);
    84. //右键菜单组装
    85. this.buildRightMenu();
    86. Utils.setJFrame(frame);
    87. }
    88. private void buildRightMenu() {
    89. textArea.add(popupMenu);
    90. popupMenu.add(metalItem);
    91. popupMenu.add(nimbusItem);
    92. popupMenu.add(windowsItem);
    93. popupMenu.add(classicItem);
    94. popupMenu.add(motifItem);
    95. styleGroup.add(metalItem);
    96. styleGroup.add(nimbusItem);
    97. styleGroup.add(windowsItem);
    98. styleGroup.add(classicItem);
    99. styleGroup.add(motifItem);
    100. //给组件设置右键菜单,不需要使用监听器,只需要调用setComponentPopupMenu()方法即可,更简单。
    101. textArea.setComponentPopupMenu(popupMenu);
    102. // textArea.add(scrollPane);
    103. metalItem.addActionListener(e -> {
    104. try {
    105. UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
    106. this.updateUI();
    107. } catch (ClassNotFoundException ex) {
    108. throw new RuntimeException(ex);
    109. } catch (InstantiationException ex) {
    110. throw new RuntimeException(ex);
    111. } catch (IllegalAccessException ex) {
    112. throw new RuntimeException(ex);
    113. } catch (UnsupportedLookAndFeelException ex) {
    114. throw new RuntimeException(ex);
    115. }
    116. });
    117. nimbusItem.addActionListener(e -> {
    118. try {
    119. UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
    120. this.updateUI();
    121. } catch (ClassNotFoundException ex) {
    122. throw new RuntimeException(ex);
    123. } catch (InstantiationException ex) {
    124. throw new RuntimeException(ex);
    125. } catch (IllegalAccessException ex) {
    126. throw new RuntimeException(ex);
    127. } catch (UnsupportedLookAndFeelException ex) {
    128. throw new RuntimeException(ex);
    129. }
    130. });
    131. windowsItem.addActionListener(e -> {
    132. try {
    133. UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
    134. this.updateUI();
    135. } catch (ClassNotFoundException ex) {
    136. throw new RuntimeException(ex);
    137. } catch (InstantiationException ex) {
    138. throw new RuntimeException(ex);
    139. } catch (IllegalAccessException ex) {
    140. throw new RuntimeException(ex);
    141. } catch (UnsupportedLookAndFeelException ex) {
    142. throw new RuntimeException(ex);
    143. }
    144. });
    145. classicItem.addActionListener(e -> {
    146. try {
    147. UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel");
    148. this.updateUI();
    149. } catch (ClassNotFoundException ex) {
    150. throw new RuntimeException(ex);
    151. } catch (InstantiationException ex) {
    152. throw new RuntimeException(ex);
    153. } catch (IllegalAccessException ex) {
    154. throw new RuntimeException(ex);
    155. } catch (UnsupportedLookAndFeelException ex) {
    156. throw new RuntimeException(ex);
    157. }
    158. });
    159. motifItem.addActionListener(e -> {
    160. try {
    161. UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
    162. this.updateUI();
    163. } catch (ClassNotFoundException ex) {
    164. throw new RuntimeException(ex);
    165. } catch (InstantiationException ex) {
    166. throw new RuntimeException(ex);
    167. } catch (IllegalAccessException ex) {
    168. throw new RuntimeException(ex);
    169. } catch (UnsupportedLookAndFeelException ex) {
    170. throw new RuntimeException(ex);
    171. }
    172. });
    173. }
    174. private void updateUI() {
    175. SwingUtilities.updateComponentTreeUI(frame.getContentPane());
    176. SwingUtilities.updateComponentTreeUI(jMenuBar);
    177. SwingUtilities.updateComponentTreeUI(popupMenu);
    178. }
    179. public static void main(String[] args) {
    180. new SwingComponentDemo().init();
    181. }
    182. private void textAreaClear(ActionEvent e) {
    183. textArea.setText("");
    184. }
    185. }
  • 相关阅读:
    【Linux】网络管理
    【python】(六)python的封装、继承和多态
    GBase 8d的特性-高性能
    pdf文件转txt怎么转?这几个方法你值得收藏
    Linux·socket编程
    [附源码]Python计算机毕业设计Django行程规划app
    linux rm文件后空间不释放怎么处理
    【Hack The Box】linux练习-- Blunder
    有没有友友会make或n8n啊
    阿里云linux升级新版本npm、nodejs
  • 原文地址:https://blog.csdn.net/m0_73843666/article/details/132872425