Swing GUI开发(一)

Springboot整合Swing制作简单GUI客户端项目记录 业务的要求千奇百怪,今天要写个GUI客户端,JAVA是无所不能的 Swing 和 JavaFx 以前学java的时候,用过一点Swing,而JavaFx没有接触过,所以没选。 若两者都没用过,强烈建议使用JavaFx,Swing已经停止更新维护,样式风格像上古的windows 98,JavaFx是08年Oracle推出的新项目,界面趋势基本是Web UI了,是一个新时代。 我使用了美化ui来规避Swing极其丑陋的外观 Springboot项目整合Swing 新建一个Springboot web项目,用. 阅读详情
一.Swing简介
Swing的产生主要原因就是AWT不能满足图形化用户界面发展的需要。
AWT设计的初衷是支持开发小应用程序的简单用户界面。例如AWT缺少剪贴板、打印支持、键盘导航等特性,而且原来的AWT甚至不包括弹出式菜单或滚动窗格等基本元素。

  此外AWT还存在着严重的缺陷,人们使AWT适应基于继承的、具有很大伸缩性的事件模型,基于同位体的体系结构也成为其致命的弱点。

  随着发展的需要,Swing出现了,Swing组件几乎都是轻量组件,与重量组件相比,没有本地的对等组件,不像重量组件要在它们自己的本地不透明窗体中绘制,轻量组件在它们的重量组件的窗口中绘制。
Swing是由100%纯Java实现的,Swing组件是用Java实现的轻量级( light-weight)组件,没有本地代码,不依赖操作系统的支持,这是它与AWT组件的最大区别。由于AWT组件通过与具体平台相关的对等类(Peer)实现,因此Swing比AWT组件具有更强的实用性。Swing在不同的平台上表现一致,并且有能力提供本地窗口系统不支持的其它特性。
Swing采用了一种MVC的设计范式,即"模型-视图-控制"(Model-View-Controller),其中模型用来保存内容,视图用来显示内容,控制器用来控制用户输入。
Swing外观感觉采用可插入的外观感觉(Pluggable Look and Feel,PL&F)
在AWT组件中,由于控制组件外观的对等类与具体平台相关,使得AWT组件总是只有与本机相关的外观。Swing使得程序在一个平台上运行时能够有不同的外观。用户可以选择自己习惯的外观。以下三幅图是在同一个操作系统下得到不同的外观。

Metal风格


java.awt.Component
    -java.awt.Container
       -java.awt.Window
          -java.awt.Frame-javax.swing.JFrame
          -javax.Dialog-javax.swing.JDialog
          -javax.swing.JWindow
       -java.awt.Applet-javax.swing.JApplet
       -javax.swing.Box
       -javax.swing.Jcomponet
Swing包是JFC(Java Foundation Classes)的一部分,由许多包组成,如下表:

      包        描述
  Com.sum.swing.plaf.motif用户界面代表类,它们实现Motif界面样式  
Com.sum.java.swing.plaf.windows用户界面代表类,它们实现Windows界面样式
  Javax.swing  Swing组件和使用工具
  Javax.swing.border   Swing轻量组件的边框
  Javax.swing.colorchooser  JcolorChooser的支持类/接口
  Javax.swing.event  事件和侦听器类
  Javax.swing.filechooser  JFileChooser的支持类/接口
  Javax.swing.pending  未完全实现的Swing组件
  Javax.swing.plaf  抽象类,定义UI代表的行为
  Javax.swing.plaf.basic  实现所有标准界面样式公共功能的基类
  Javax.swing.plaf.metal用户界面代表类,它们实现Metal界面样式
  Javax.swing.table  Jtable组件
  Javax.swing.text  支持文档的显示和编辑
  Javax.swing.text.html  支持显示和编辑HTML文档
  Javax.swing.text.html.parser  Html文档的分析器
  Javax.swing.text.rtf  支持显示和编辑RTF文件
  Javax.swing.tree  Jtree组件的支持类
  Javax.swing.undo  支持取消操作

swing包是Swing提供的最大包,它包含将近100个类和25个接口,几乎所有的Swing组件都在swing包中,只有JtableHeader和   JtextComponent是例外,它们分别在swing.table和swing.text中。
  swing.border包中定义了事件和事件监听器类,与AWT的event包类似。它们都包括事件类和监听器接口。
  swing.pending包包含了没有完全实现的Swing组件。
  swing.table包中主要包括了表格组建(JTable)的支持类。
  swing.tree同样是JTree的支持类。
  swing.text、swing.text.html、swing.text.html.parser和swing.text.rtf都是用于显示和编辑文档的包。

Swing是AWT的扩展,它提供了许多新的图形界面组件。Swing组件以"J"开头,除了有与AWT类似的按钮(JButton)、标签(JLabel)、复选框(JCheckBox)、菜单(JMenu)等基本组件外,还增加了一个丰富的高层组件集合,如表格(JTable)、树(JTree)。

1.1MVC(Model-View-Control)体系结构
Swing胜过AWT的主要优势在于MVC体系结构的普遍使用。在一个MVC用户界面中,存三个通讯对象:模型、视图和控件。模型是指定的逻辑表示法,视图是模型的可视化表示法,而控件则指定了如何处理用户输入。当模型发生改变时,它会通知所有依赖它的视图,视图使用控件指定其相应机制。
在Swing组件中视图和控件两部分合为一体。每个组件有一个相关的分离模型和它使用的界面(包括视图和控件)。比如,按钮JButton有一个存储其状态的分离模型ButtonModel对象。组件的模型是自动设置的,例如一般都使用JButton 而不是使用ButtonModel 对象。另外,通过Model类的子类或通过实现适当的接口,可以为组件建立自己的模型。把数据模型与组件联系起来用setModel( )方法。
1.2:可存取性支持

所有Swing组件都实现了Accessible接口,提供对可存取性的支持,使得辅助功能如屏幕阅读器能够十分方便的从Swing组件中得到信息。
1.3 支持键盘操作
在Swing组件中,使用JComponent类的registerKeyboardAction()方法,能使用户通过键盘操作来替代鼠标驱动GUI上Swing组件的相应动作。有些类还为键盘操作提供了更便利的方法。

  其实这就相当于热键,使得用户可以只用键盘进行操作。
1.4 设置边框
对Swing组件可以设置一个和多个边框。Swing中提供了各式各样的边框供用户选用,也能建立组合边框或自己设计边框。一种空白边框可以增大组件,协助布局管理器对容器中的组件进行合理的布局。
1.5:使用图标(Icon)
与AWT的部件不同,许多Swing组件如按钮、标签,除了使用文字外,还可以使用图标修饰自己。

二.Swing程序结构简介
例:
import javax.swing.*; //引入Swing包名
              //import com.sun.java.swing.*;
              //使用JDK 1.2 Beta 4版和所有Swing 1.1 Beta 3
             //之前的
版本,引入Swing包名用此方法。
  import java.awt.*;
  import java.awt.event.*;
  public class SwingApplication {
    private static String labelPrefix = "Number of button clicks: ";
    private int numClicks = 0; //计数器,计算点击次数
    public Component createComponents() {
      final JLabel label = new JLabel(labelPrefix + "0 ");

      JButton button = new JButton("I'm a Swing button!");
    button.setMnemonic(KeyEvent.VK_I); //设置按钮的热键为'I'
    button.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        numClicks++;
        label.setText(labelPrefix + numClicks);
                 //显示按钮被点击的次数

      }
    });
    label.setLabelFor(button);

    /* 在顶层容器及其内容之间放置空间的常用办法是把内容添加到Jpanel上,而Jpanel本身没有边框的。*/

    JPanel pane = new JPanel();
    pane.setBorder(BorderFactory.createEmptyBorder(
              30, //top
              30, //left
              10, //bottom
              30) //right
              );
     pane.setLayout(new GridLayout(0, 1)); //单列多行
     pane.add(button);
     pane.add(label);
     return pane;
  }

  public static void main(String[] args) {
     try {
       UIManager.setLookAndFeel(
         UIManager.getCrossPlatformLookAndFeelClassName());
                          //设置窗口风格

     } catch (Exception e) { }

     //创建顶层容器并添加内容.
     JFrame frame = new JFrame("SwingApplication");
     SwingApplication app = new SwingApplication();
     Component contents = app.createComponents();
     frame.getContentPane().add(contents, BorderLayout.CENTER);

     //窗口设置结束,开始显示
     frame.addWindowListener(new WindowAdapter() {
                      //匿名类用于注册监听器

       public void windowClosing(WindowEvent e) {
         System.exit(0);
       }
     });
     frame.pack();
     frame.setVisible(true);
   }
  }

Swing的程序设计一般可按照下列流程进行:
  1. 引入Swing包
  2. 选择"外观和感觉"
  3. 设置顶层容器
  4. 设置按钮和标签
  5. 向容器中添加组件
  6. 在组件周围添加边界
  7. 进行事件处理
2.1.Swing组件和容器
在Swing中不但用轻量级的组件替代了AWT中的重量级的组件,而且Swing的替代组件中都包含有一些其他的特性。例如,Swing的按钮和标签可显示图标和文本,而AWT的按钮和标签只能显示文本。Swing中的大多数组件都是AWT组件名前面加了一个"J"。
Jcomponent是一个抽象类,用于定义所有子类组件的一般方法,其类层次结构如下所示:
   java.lang.Object
       |
       +--java.awt.Component
            |
            +--java.awt.Container
                |
                +--javax.swing.JComponent

  并不是所有的Swing组件都继承于JComponent类,JComponent类继承于Container类,所以凡是此类的组件都可作为容器使用。

  组件从功能上分可分为:

  1) 顶层容器:JFrame,JApplet,JDialog,JWindow共4个

  2) 中间容器:JPanel,JScrollPane,JSplitPane,JToolBar 

  3) 特殊容器:在GUI上起特殊作用的中间层,如JInternalFrame,JLayeredPane,JRootPane.

  4) 基本控件:实现人际交互的组件,如Jbutton, JComboBox, JList, JMenu, JSlider, JtextField。

  5) 不可编辑信息的显示:向用户显示不可编辑信息的组件,例如JLabel, JProgressBar, ToolTip。

  6) 可编辑信息的显示:向用户显示能被编辑的格式化信息的组件,如JColorChooser, JFileChoose, JFileChooser, Jtable, JtextArea。

  JComponent类的特殊功能又分为:

  1) 边框设置:使用setBorder()方法可以设置组件外围的边框,使用一个EmptyBorder对象能在组件周围留出空白。

  2) 双缓冲区:使用双缓冲技术能改进频繁变化的组件的显示效果。与AWT组件不同,JComponent组件默认双缓冲区,不必自己重写代码。如果想关闭双缓冲区,可以在组件上施加setDoubleBuffered(false)方法。

  3) 提示信息:使用setTooltipText()方法,为组件设置对用户有帮助的提示信息。

  4) 键盘导航:使用registerKeyboardAction( ) 方法,能使用户用键盘代替鼠标来驱动组件。JComponent类的子类AbstractButton还提供了便利的方法--用setMnemonic( )方法指明一个字符,通过这个字符和一个当前L&F的特殊修饰共同激活按钮动作。

  5) 可插入L&F:每个Jcomponent对象有一个相应的ComponentUI对象,为它完成所有的绘画、事件处理、决定尺寸大小等工作。 ComponentUI对象依赖当前使用的L&F,用UIManager.setLookAndFeel( )方法可以设置需要的L&F.

  6) 支持布局:通过设置组件最大、最小、推荐尺寸的方法和设置X、Y对齐参数值的方法能指定布局管理器的约束条件,为布局提供支持。

2.1 使用Swing的基本规则
与AWT组件不同,Swing组件不能直接添加到顶层容器中,它必须添加到一个与Swing顶层容器相关联的内容面板(content pane)上。内容面板是顶层容器包含的一个普通容器,它是一个轻量级组件。基本规则如下:
  (1)把Swing组件放入一个顶层Swing容器的内容面板上
  (2)避免使用非Swing的重量级组件。
        

  对JFrame添加组件有两种方式:
  1) 用getContentPane( )方法获得JFrame的内容面板,再对其加入组件:frame.getContentPane().add(childComponent)
  2) 建立一个Jpanel或 JDesktopPane之类的中间容器,把组件添加到容器中,用setContentPane()方法把该容器置为JFrame的内容面板:
    Jpanel contentPane=new Jpanel( );
    ……//把其它组件添加到Jpanel中;
    frame.setContentPane(contentPane);
    //把contentPane对象设置成为frame的内容面板

2.3:根面板(JRootPane)
java.lang.Object
  extended byjava.awt.Component
      extended byjava.awt.Container
          extended byjavax.swing.JComponent
              extended byjavax.swing.JRootPane



根面板由一个玻璃面板(glassPane)、一个内容面板(contentPane)和一个可选择的菜单条(JMenuBar)组成,而内容面板和可选择的菜单条放在同一分层。玻璃面板是完全透明的,缺省值为不可见,为接收鼠标事件和在所有组件上绘图提供方便。

  根面板提供的方法:
  Container getContentPane(); //The following text describes this graphic.获得内容面板
  setContentPane(Container); //设置内容面
  JMenuBar getMenuBar( ); //活动菜单条
  setMenuBar(JMenuBar); //设置菜单条
  JLayeredPane getLayeredPane(); //获得分层面板
  setLayeredPane(JLayeredPane); //设置分层面板
  Component getGlassPane(); //获得玻璃面板
  setGlassPane(Component); //设置玻璃面板

2.4:分层面板(JLayeredPane)
java.lang.Object
  extended byjava.awt.Component
      extended byjava.awt.Container
          extended byjavax.swing.JComponent
              extended byjavax.swing.JLayeredPane
Swing提供两种分层面板:JlayeredPane和JDesktopPane。 JDesktopPane是JLayeredPane的子类,专门为容纳内部框架(JInternalFrame)而设置。

  向一个分层面板种添加组件,需要说明将其加入哪一层,指明组件在该层中的位置:add(Component c, Integer Layer, int position)。

2.5:面板(JPanel)
面板(JPanel)是一个轻量容器组件,用法与Panel相同,用于容纳界面元素,以便在布局管理器的设置下可容纳更多的组件,实现容器的嵌套。Jpanel, JscrollPane, JsplitPane, JinteralFrame都属于常用的中间容器,是轻量组件。Jpanel的缺省布局管理器是FlowLayout。

  java.lang.Object
     |
     +--java.awt.Component
         |
         +--java.awt.Container
             |
             +--javax.swing.JComponent
                  |
                  +--javax.swing.JPanel
2.6:滚动窗口(JScrollPane)
java.lang.Object
  extended byjava.awt.Component
      extended byjava.awt.Container
          extended byjavax.swing.JComponent
              extended byjavax.swing.JScrollPane



   
2.7:分隔板(JSplitPane)

java.lang.Object
     |
     +--java.awt.Component
         |
         +--java.awt.Container
             |
             +--javax.swing.JComponent
                  |
                  +--javax.swing.JSplitPane
   
      

  JSplitPane提供可拆分窗口,支持水平拆分和垂直拆分并带有滑动条。常用方法有:
  addImpl(Component comp,Object constraints,int index) //增加指定的组件
  setTopComponent(Component comp) //设置顶部的组件
  setDividerSize(int newSize) //设置拆分的大小
  setUI(SplitPaneUI ui) //设置外观和感觉

2.8:选项板(JTabbedPane)
 
      

  JTabbedPane提供一组可供用户选择的带有标签或图标的开关键。常用方法:
  add(String title,Component component) //增加一个带特定标签的组件
  addChangeListener(ChangeListener l) //选项板注册一个变化监听器

2.9:工具栏(JToolBar)
  
                工具栏在左上角

    
                工具栏在右侧
      

  JtoolBar是用于显示常用工具控件的容器。用户可以拖拽出一个独立的可显示工具控件的窗口。
  常用方法有:
       JToolBar(String name) //构造方法
       getComponentIndex(Component c) //返回一个组件的序号
       getComponentAtIndex(int i) //得到一个指定序号的组件

2.10:内部框架(JInternalFrame)

      

  内部框架JInternalFrame就如同一个窗口在另一个窗口内部,其特点如下:
  1) 必须把内部框架添加到一个容器中(通常为JDesktopPane),否则不显示;
  2) 不必调用show()或setVisible()方法,内部框架随所在的容器一起显示;
  3) 必须用setSize()或pack()或setBounds方法设置框架尺寸,否则尺寸为零,框架不能显示;
  4) 可以用setLocation()或setBounds( ) 方法设置内部框架在容器中的位置,缺省值为0,0,即容器的左上角;
  5) 象顶层JFrame一样,对内部框架添加组件也要加在它的内容面板上;
  6) 在内部框架中建立对话框,不能使用JDialog作为顶层窗口,必须用JOptionPane或JInternalFrame;
  7) 内部框架不能监听窗口事件,可以通过监听与窗口事件类似的内部框架(JInternalFrameEvent)处理内部框架窗口的操作。

  JFrame frame=new JFrame("InternalFrameDemo"); //实例化窗口
  JDesktopPane desktop=new JDesktopPane(); //实例化容器JDesktopPane
  MyInternalFrame myframe=new MyInternalFrame(); //实例化内部窗口
  desktop.add(myframe); //把内部窗口添加到容器中
  myframe.setSelected(true); //内部面板是可选择的
  frame.setContentPane(desktop); //把desktop设为frame的内容面板

2.11:按钮(JButton)

按钮是一个常用组件,按钮可以带标签或图象。     

  java.lang.Object
     |
     +--java.awt.Component
         |
         +--java.awt.Container
             |
             +--javax.swing.JComponent
                   |
                   +--javax.swing.AbstractButton
                        |
                        +--javax.swing.JButton

  常用的构造方法有:
  JButton(Icon icon)
//按钮上显示图标
  JButton(String text) //按钮上显示字符
  JButton(String text, Icon icon) //按钮上既显示图标又显示字符

2.11:
表格(JTable)
表格是Swing新增加的组件,主要功能是把数据以二维表格的形式显示出来。使用表格,依据M-V-C的思想,最好先生成一个MyTableModel类型的对象来表示数据,这个类是从AbstractTableModel类中继承来的,其中有几个方法是一定要重写,例如getColumnCount,getRowCount,getColumnName,getValueAt。因为Jtable会从这个对象中自动获取表格显示所必需的数据,AbstractTableModel类的对象负责表格大小的确定(行、列)、内容的填写、赋值、表格单元更新的检测等等一切跟表格内容有关的属性及其操作。JTable类生成的对象以该TableModel为参数,并负责将TableModel对象中的数据以表格的形式显示出来。

  JTable类常用的方法有:
  getModel() //获得表格的数据来源对象
  JTable(TableModel dm) //dm对象中包含了表格要显示的数据
  //下列两个构造方法,第一个参数是数据,第二个参数是表格第一行中显示的内容
  JTable(object[][]rowData,object[]columnNams);
  JTable(Vector[][]rowData,Vector[]columnNams);

import javax.swing.JTable;
  import javax.swing.table.AbstractTableModel;
  import javax.swing.JScrollPane;
  import javax.swing.JFrame;
  import javax.swing.SwingUtilities;
  import javax.swing.JOptionPane;
  import java.awt.*;
  import java.awt.event.*;

  public class TableDemo extends JFrame {
    private boolean DEBUG = true;
    public TableDemo() { //实现构造方法
      super("RecorderOfWorkers"); //首先调用父类JFrame的构造方法生成一个窗口
      MyTableModel myModel = new MyTableModel();//myModel存放表格的数据
      JTable table = new JTable(myModel);//表格对象table的数据来源是myModel对象
      table.setPreferredScrollableViewportSize(new Dimension(500, 70));//表格的显示尺寸

      //产生一个带滚动条的面板
      JScrollPane scrollPane = new JScrollPane(table);

      //将带滚动条的面板添加入窗口中
      getContentPane().add(scrollPane, BorderLayout.CENTER);

      addWindowListener(new WindowAdapter() {//注册窗口监听器
        public void windowClosing(WindowEvent e) {
          System.exit(0);
        }
      });
  }
        //把要显示在表格中的数据存入字符串数组和Object数组中
  class MyTableModel extends AbstractTableModel {
     //表格中第一行所要显示的内容存放在字符串数组columnNames中
      final String[] columnNames = {"First Name",
                  "Position",
                  "Telephone",
                  "MonthlyPay",
                  "Married"};
     //表格中各行的内容保存在二维数组data中
      final Object[][] data = {
        {"Wangdong", "Executive",
        "01068790231", new Integer(5000), new Boolean(false)},
        {"LiHong", "Secretary",
        "01069785321", new Integer(3500), new Boolean(true)},
        {"LiRui", "Manager",
        "01065498732", new Integer(4500), new Boolean(false)},
        {"ZhaoXin", "Safeguard",
        "01062796879", new Integer(2000), new Boolean(true)},
        {"ChenLei", "Salesman",
        "01063541298", new Integer(4000), new Boolean(false)}
      };

      //下述方法是重写AbstractTableModel中的方法,其主要用途是被JTable对象调用,以便在表格中正确的显示出来。程序员必须根据采用的数据类型加以恰当实现。
 
      //获得列的数目

      public int getColumnCount() {
         return columnNames.length;
      }

      //获得行的数目
      public int getRowCount() {
         return data.length;
      }

      //获得某列的名字,而目前各列的名字保存在字符串数组columnNames中
      public String getColumnName(int col) {
         return columnNames[col];
      }

      //获得某行某列的数据,而数据保存在对象数组data中
      public Object getValueAt(int row, int col) {
         return data[row][col];
      }

      //判断每个单元格的类型
      public Class getColumnClass(int c) {
         return getValueAt(0, c).getClass();
      }

      //将表格声明为可编辑的
      public boolean isCellEditable(int row, int col) {

         if (col < 2) {
           return false;
         } else {
           return true;
         }
      }

      //改变某个数据的值
      public void setValueAt(Object value, int row, int col) {
         if (DEBUG) {
           System.out.println("Setting value at " + row + ",
                 " + col
                  + " to " + value
                  + " (an instance of "
                  + value.getClass() + ")");
         }

         if (data[0][col] instanceof Integer
             && !(value instanceof Integer)) {
          try {
             data[row][col] = new Integer(value.toString());
             fireTableCellUpdated(row, col);
          } catch (NumberFormatException e) {
             JOptionPane.showMessageDialog(TableDemo.this,
              "The /"" + getColumnName(col)
              + "/" column accepts only integer values.");
          }
      } else {
          data[row][col] = value;
          fireTableCellUpdated(row, col);
      }

      if (DEBUG) {
          System.out.println("New value of data:");
          printDebugData();
      }
   }

   private void printDebugData() {
     int numRows = getRowCount();
      int numCols = getColumnCount();

      for (int i=0; i < numRows; i++) {
        System.out.print(" row " + i + ":");
        for (int j=0; j < numCols; j++) {
          System.out.print(" " + data[i][j]);
        }
        System.out.println();
      }
      System.out.println("--------------------------");
   }
  }

  public static void main(String[] args) {
   TableDemo frame = new TableDemo();
   frame.pack();
   frame.setVisible(true);
  }
 }

2.12:
树(JTree)

如果要显示一个层次关系分明的一组数据,用树状图表示能给用户一个直观而易用的感觉,JTree类如同Windows的资源管理器的左半部,通过点击可以"打开"、"关闭"文件夹,展开树状结构的图表数据。JTree也是依据M-V-C的思想来设计的,Jtree的主要功能是把数据按照树状进行显示,其数据来源于其它对象,其显示效果通常如下图所示:

              

  下面是一棵包含六个分枝点的树的例子,来演示JTree的实现过程。

  import java.awt.*;
  import java.awt.event.*;
  import javax.swing.*;
  import javax.swing.tree.*;
  class Branch{
     DefaultMutableTreeNode r;
//DefaultMutableTreeNode是树的数据结构中的通用节点,节点也可以有多个子节点。
    public Branch(String[] data){
       r=new DefaultMutableTreeNode(data[0]);
       for(int i=1;i<data.length;i++)
       r.add(new DefaultMutableTreeNode(data[i]));
        //给节点r添加多个子节点

    }
    public DefaultMutableTreeNode node(){//返回节点
       return r;
    }
  }
  public class Trees extends JPanel{
    String [][]data={
            {"Colors","Red","Blue","Green"},
            {"Flavors","Tart","Sweet","Bland"},
            {"Length","Short","Medium","Long"},
            {"Volume","High","Medium","Low"},
            {"Temperature","High","Medium","Low"},
            {"Intensity","High","Medium","Low"}
            };
    static int i=0; //I用于统计按钮点击的次数
    DefaultMutableTreeNode root,child,chosen;
    JTree tree;
    DefaultTreeModel model;
    public Trees(){
       setLayout(new BorderLayout());
       root=new DefaultMutableTreeNode("root");
       //根节点进行初始化

       tree=new JTree(root);
       //树进行初始化,其数据来源是root对象

       add(new JScrollPane(tree));
       //把滚动面板添加到Trees中

       model=(DefaultTreeModel)tree.getModel();
       //获得数据对象DefaultTreeModel
       JButton test=new JButton("Press me");
       //按钮test进行初始化
       test.addActionListener(new ActionListener(){
       //按钮test注册监听器

          public void actionPerformed(ActionEvent e){
          if (i<data.length){
          //按钮test点击的次数小于data的长度

              child=new Branch(data[i++]).node();
              //生成子节点

              chosen=(DefaultMutableTreeNode)
              //选择child的父节点

                  tree.getLastSelectedPathComponent();
                  if(chosen==null) chosen=root;
                  model.insertNodeInto(child,chosen,0);
                  //把child添加到chosen
          }
       }
    });
    test.setBackground(Color.blue);
    //按钮test设置背景色为蓝色

    test.setForeground(Color.white);
    //按钮test设置前景色为白色

    JPanel p=new JPanel();
    //面板p初始化

    p.add(test);
    //把按钮添加到面板p中

    add(p,BorderLayout.SOUTH);
    //把面板p添加到Trees中

  }
  public static void main(String args[]){
    JFrame jf=new JFrame("JTree demo");

    jf.getContentPane().add(new Trees(), BorderLayout.CENTER);
           //把Trees对象添加到JFrame对象的中央
    jf.setSize(200,500);
    jf.setVisible(true);
  }
 }

  运行结果是多种多样的,与用户点击按钮的次序有关,其中一种结果如下
       


三.布局管理器

 

 和AWT相同,为了容器中的组件能实现平台无关的自动合理排列,Swing也采用了布局管理器来管理组件的排放、位置、大小等布置任务,在此基础上将显示风格做了改进。

  另外一个不同点在于Swing虽然有顶层容器,但是我们不能把组件直接加到顶层容器中,Swing窗体中含有一个称为内容面板的容器(ContentPane),在顶层容器上放内容面板,然后把组件加入到内容面板中,前面已讲过如何得到和设置内容面板。

  所以,在Swing中,设置布局管理器是针对于内容面板的,另外Swing新增加了一个BoxLayout布局管理器。显示上与AWT略有不同,如下图所示:

          
 
    





  现在简单介绍一下BoxLayout布局管理器

  BoxLayout布局管理器按照自上而下(y轴)或者从左到右(x轴)的顺序布局依次加入组件。建立一个BoxLayout对象,必须指明两个参数:被布局的容器和BoxLayout的主轴。缺省情况下,组件在纵轴方向上居中对齐。

  设置布局管理器的方法如下:
  pane.setLayout(new BoxLayout(pane,BoxLayout.Y-AXIS));

        

  JScrollPane listScroller=new JScrollPane(list);
  listScroller.setPreferredSize(new Demension(250,80));
  listScroller.setMinimumSize(new Dimension(250,80));
  listScroller.setAlignmentX(LEFT_ALIGNMENT);
  ……
  //从上到下设置标签和滚动板.
  JPanel listPane=new JPanel();
  listPane.setLayout(new BoxLayout(listPanae,BoxLayout,Y_AXIS));
  JLabel label=new JLabel(labelText);
  listPane.add(label);
  listPane.add(Box.createRigidArea(new Demension(0,5)));
  listPane.add(listScroller);
  listPane.setBorder(BorderFactory.creatEmptyBorder(10,10,10,10);
  //从左到右设置按钮
  JPanel buttonPane=new JPanel();
  buttonPane.setLayout(new BoxLayout(buttonPane,Boxlayout.X_AXIS));
  buttonPane.setBoder(BorderFactory.createEmptyBorder(0,10,10,10));
  buttonPane.add(Box.createHorizontalGlue());
  buttonPane.add(cancelButton);
  buttonPane.add(Box.createRigiArea(new Dimension(10,0)));
  buttonPane.add(setButton);
  Container contentPane=getContentPane();
  contentPane.add(listPane,BorderLayout.CENTER);
  contentPane.add(buttonPane,BorderLayout.SOUTH);



Java-GUI 编程之 Swing 🚀 优质资源分享 🚀 学习路线指引(点击解锁) 知识定位 人群定位 🧡 Python实战微信订餐小程序 🧡 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 💛Python量化交易实战💛 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 Swing概述 实际使用 Java 开发图形界面程序时 ,很少使用 AWT 组件,绝大部分时候都是用 Swing 组件开发的 。 Swing是由100%纯 Java实现 阅读详情

相关推荐

Java Swing 图形用户界面(GUI)开发简介

Java是一种广泛使用的编程语言,而Swing是Java提供的一套用于创建图形用户界面(GUI)的工具包。通过Java Swing,开发人员可以轻松地创建各种各样的界面元素,如窗口、按钮、菜单等,并且可以与用户进行交互。来设置窗口的布局管理器。在上面的代码中,我们创建了一个名为MyWindow的类,继承自JFrame。这些仅仅是Java Swing提供的一小部分组件,开发人员可以根据需要使用更多的组件来构建自己的界面。通过使用类似的方法,我们还可以对其他组件的事件进行处理,以实现更复杂的用户交互。

DevRevolt的博客 791

Gui-Swing简介

1、Gui核心技术: Swing AWT 1.因为界面不美观。 2.需要 jre 环境! 学习目的: 1. 可以写出自己心目中想要的一些小工具 2. 工作时候,也可能需要维护到swing界面,概率极小! 3. 了解MVC框架,了解监听! 2.1、什么是AWT 1. 包含了很多类和接口! GUI! 2. 元素: 窗口,按钮,文本框 3. java.awt 2.2、 组件和容器 1、Frame package com.wzj.guidemo; import java...

m0_59115000的博客 675

深入探索SWT插件在Java GUI开发中的应用

本文还有配套的精品资源,点击获取 简介:SWT(Standard Widget Toolkit)是Java编程环境中用于构建用户界面的开源库,由IBM为Eclipse项目开发。SWT插件通过直接调用操作系统API,实现与原生界面的紧密集成,提升了跨平台一致性及性能。本文深入探讨SWT插件及其在Java GUI开发中的应用,包括关键控件如按钮、文本框、列表、表格、树形视图和滚...

weixin_42575109的博客 1743

【Java基础之Swing】万字详谈GUI,一篇文章搞懂Swing

Swing:编程 🌈博客主页:强子的博客 📅 发文时间:2022.3.30 📕上篇文章-》awt实现弹球小游戏 🎈 一定存在只有你才能做成的事 🌹 博主水平有限,如有错误,欢迎指正 欢迎给位👍收藏💎评论✉ GUI之SwingSwing:编程📖📖3.1 Swing概述🍧🍧Swing的特征:🍩🍩3.2 Swing基本组件的用法🍭🍭3.3 Swing中的特殊容器🍱🍱3.4JProgressBar、ProgressMonitor、BoundedRangeModel实现进度条🍥🍥3.5 JList、JCombo

屠一乐的博客 2480

Swing GUI开发框架深入剖析

本文还有配套的精品资源,点击获取 简介:Swing作为Java中构建GUI的强大工具包,提供了丰富组件和布局管理器,使得开发者能够创建出跨平台兼容的界面。本框架深入讨论了如何利用Swing的可定制性进行功能扩展和自定义,包括封装组件、统一事件处理、布局管理、国际化支持、可扩展性、主题与外观定制、数据绑定、错误处理、工具栏和菜单系统以及对话框和通知机制。通过这些关键点,开发者...

weixin_33239721的博客 1346

LAMMPS ReaxFF模拟后处理:如何用Python精准追踪C-N键的断裂与形成?

本文详细介绍了如何利用Python对LAMMPS ReaxFF模拟结果进行后处理,精准追踪C-N键的断裂与形成过程。通过解析键级输出文件、构建原子类型映射字典,并实现C-N键的统计与可视化,为材料科学和催化反应研究提供了高效的数据分析解决方案。文章特别强调了ReaxFF力场在断键分析中的关键作用,并提供了完整的Python代码实现。

weixin_28706923的博客 355

java swing(GUI图形化界面)基础教程1

此文章适合刚开始学习java图形化界面者(swing) 相信经过一段时间的学习,你也可以做出封面一样的卡关游戏

mym666mym的博客 3170

5分钟搞定!Unity中Matcap玻璃材质快速实现(含免费贴图资源)

本文详细介绍了在Unity中快速实现Matcap玻璃材质的方法,从技术原理到实战操作,包括Shader编写、参数调节和性能优化。通过Matcap技术,开发者可以高效创建逼真玻璃效果,特别适合移动端和快速迭代项目。文章还提供了免费贴图资源和进阶优化技巧,帮助提升视觉效果和运行效率。

a1b2c的博客 219

GUI 编程(Swing 基础)

GUI 编程的实现,是由一系列图形化组件来完成的,这些 GUI 的构件被称为控件;在 Java 的早期版本中,GUI 控件由名为 AWT 的标准库来ᨀ供的。除了 GUI 组件外,AWT 还包括其它功能来支持图像绘画、处理剪切/复制类型的数据传 送,以及其它相关操作。便于用户输入的一组丰富的界面组件。将组件放置在适当位置的几中布局管理器事件处理模型。.图形和图像工具等等。要使用到该包中的类,则必须显式地声明如下语句:import java.awt.*;

m0_48205251的博客 1152

MATLAB创建GUI面板实现二维码生成与识别

利用matlab设计gui界面实现二维码的生成与内容识别

infinitystardust的博客 3148

腾讯开源CubeSandbox:为Agent打造可随时丢弃的安全沙箱环境

在人工智能与自动化技术快速发展的今天,智能体(Agent)在执行复杂任务时往往需要独立、完整的计算环境,但环境失控带来的安全风险一直是落地瓶颈。为解决这一痛点,可丢弃式沙箱技术应运而生。它通过轻量虚拟化原理实现环境秒级重建,并严格隔离宿主资源,即使Agent执行了恶意或误操作,也不会波及其他系统。这种技术价值在于平衡了灵活性与安全性,使开发者敢于赋予Agent更多自主操作权限。目前,这类技术已广泛应用于AI编程、自动化测试、数字员工、恶意代码分析等真实场景,成为Agent可靠运行的基石。腾讯开源的CubeS

weixin_42539414的博客 250

用Swing开发GUI程序(一)

以前编写的程序基本上只在控制台上运行,即文本用户界面,或字符用户界面,用户操作很不方便。而GUI,图形用户界面(Graphics User Interface)可以让用户看到什么就操作什么。相比之下,GUI更为直观,能提供更丰富的功能。 要注意,和控制台程序相比,GUI需要消耗更多的资源。What is Swing?在JAVA里GUI操作的API一般使用java.awt和javax.swing两个

csu_vc的博客 850

在WebView中对第三方H5页面的文本密码框添加自定义随机键盘

前言: 首先介绍一下这个需求的背景,由于公司是涉及到金融行业的需要与银行对接资金存管。出于保密性这里不直接列出公司名字和银行名字。从2018年国家对金融行业大整改以来,为了能够顺利通过备案,我们也跟着政府的脚步一步一步走向合规。 好了,大致就是因为要通过备案,必须把这个需求实现,否则将不会通过。 需求内容就是,当客户端有关资金交易的时候,会通过加密数据以及秘钥的方式把第三方银行的页面(充值、...

比较喜欢、笑的博客专栏 1586

java swing开发窗体程序开发(一)GUI编程

Java SWing就是java提供的一个类库专门用于开发窗体程序的,相对于C#的winform,java swing的开发要比C#更加麻烦,他不像C#拥有可视化的界面编辑工具 而是需要像QT一样纯代码式GUI编程。java的好处就是通用性强,跨平台,这个java窗体程序做好之后,哪都可以用。然而C#的winform只能运行在有.net框架上 的平台,然而.net支持最好的,也就只有windows...

(˶˚ ᗨ ˚˶)来康康我 4万+

Ceph入门到精通-更换osd、扩容osd

【代码】Ceph入门到精通-更换osd、扩容osd。

隔壁老瓦的专栏 1547

YOLO与ORB-SLAM3的结合:实现动态环境下的目标检测与视觉SLAM

摘要: 本文介绍如何将YOLOv5目标检测与ORB-SLAM3视觉SLAM系统结合,实现动态环境下的机器人感知与定位。内容包括:源码下载(集成项目YOLO_ORB_SLAM3)、libtorch安装(PyTorch C++支持)、编译配置(解决路径依赖问题)、ROS环境下的部署(Noetic适配),以及使用TUM数据集的测试流程(RGB-D数据关联与运行)。重点解决编译时Torch路径错误、ROS与Anaconda冲突等问题,并展示系统运行效果。该整合方案为动态场景SLAM提供目标检测能力,未来可优化检测模

FJN110的博客 960

Best GUI Builders for Java Swing Applications

【代码】Best GUI Builders for Java Swing Applications。

allway2的博客 853

MTK Android 12 Clone Project 克隆项目

本文介绍了如何使用MTK Android 12 Clone Project 克隆一个新的项目。通过使用绝对路径执行Perl脚本,并根据需要选择升级或降级位数,可以成功地生成一个新的项目并进行编译。希望本文对xdm有所帮助。

我其实什么都不会 942

JavaSE:GUI编程入门到游戏实战

JavaSE:GUI编程入门到游戏实战

qq_59463944的博客 936

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

WindowBuilder Pro Install For Java GUI

http://www.eclipse.org/windowbuilder/download.php 转载于:https://www.cnblogs.com/kevinkim/archive/2012/11/09/2762264.html

weixin_34268610的博客 278

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Swing Design Goals

The overall goal for the Swing project was:To build a set of extensible GUI components to enable developers to more rapidly develop powerful Java front ends for commercial applications. To this end, t...

Ken's Blog 157

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

14.1-全栈Java笔记: Java语言中GUI到底是神马鬼?| AWT | Swing

到目前为止,我们在Java中编写的基本都是基于控制台的程序;而Java编程语言之所以如此流行的一个主要原因之一,就是因为它支持图形用户界面功能,即GUI(Graphical User Interface)。GUI(Graphical User Interface)即图形用户界面,就是应用程序提供给我们用户操作的图形界面,包括窗口、菜单、工具栏及其它多种图形界面元素,如文本框、按钮、列表框、对话框等。

全栈Java笔记 676

用Java开发桌面应用程序(Swing开发GUI程序)

前面学过了面向对象基本概念、面向对象基本特征、Java基本包和API:异常、多线程、IO等。 基本概念 Swing:java中的一个包,负责开发GUI程序 GUI:图形用户界面,一般指可视化桌面系统中的应用程序 Windows:将应用程序从字符界面拓展到图形界面 常见图形用户界面的基本结构 使用的包:javax.swing包 界面(容器、窗口),提供整个界面的空间 例:在桌面出现一个界面,标题是:HelloWorld 显示:setVisible函数 Shows or hides this Window d

m0_53244895的博客 1万+

JAVA Swing 与 GUI Form

java常用于后端开发,用于UI的Swing API较少有人用,但是在做一些窗口程序还是不得不用到,比如做idea插件的时候。

这里的分享,都是干货 3708

Java GUI 开发之旅:Swing 组件与布局管理的实战探索

在编程的世界里,图形用户界面(GUI)设计一直是提升用户体验的关键环节。Java 的 Swing 库为我们提供了强大的工具来构建跨平台的 GUI 应用。今天,我将通过一次实验,分享如何使用 Java Swing 开发一个功能丰富的 GUI 应用。这不仅是一次技术实践,更是一场探索 GUI 设计奥秘的奇幻之旅!

wwzzh24的博客 944

在NetBeans IDE设计一个Swing GUI

要完成本教程,您需要具备以下软件和资源。 软件或资源 要求的版本 NetBeans IDE中 版本6.9,7.0,7.1,或7.2 Java开发工具包(JDK) 6或7版本 入门 IDE的GUI Builder使得它可以创建具有专业外观的图形用户界面的布局管理器没有深入了解。你可以把你的形式,通过简单地把您想要的组件。

imucaoyue的专栏 7810
上一篇: AWT GUI 设计笔记(二)
下一篇: LINUX下J2SDK安装配置指南
ybugchen
博客等级 码龄22年 1粉丝 44原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值