zoukankan      html  css  js  c++  java
  • 基于事件的网关 Event­based Gateway

    基于事件的网关 Event­based Gateway

    作者:Jesai

    时间:2018年4月21日 21:19:30

    什么是事件网关?

    基于事件的网关,允许基于事件做选择。

    事件网关的执行原理?

    网关的每一条出口顺序流,都需要连接至一个捕获中间事件。当流程执行到达基于事件的网关时,网关类似等待状态地动作:执行被暂停。并且,为每一条出口顺序流,创建一个事件订阅。流程的走向完全是由于中间事件的选择。而由哪一个事件来决定流程的走向则是由最先触发的事件来决定的。

    事件网关和其他网关的区别

    请注意基于事件的网关,其出口顺序流与一般的顺序流不同。这些顺序流从不实际被执行。相反,它们允许流程引擎决定,当执行到达一个基于事件的网关时,需要订阅什么事件。

    约束:

    1)一个基于事件的网关,必须有两条或更多的出口顺序流。
    2)基于事件的网关,只能连接至 intermediateCatchEvent(捕获中间事件) 类型的元素(Activiti不支持基于事件的网关后,连接接收任务,Receive Task)。
    3)连接至基于事件的网关的 intermediateCatchEvent ,必须只有一个入口顺序流。

     

    图标:

    基于事件的网关,用内部带有特殊图标的网关(菱形)表示。

    定义:

    用于定义基于事件的网关的XML元素为

    1 eventBasedGateway 。

    流程设计

    我们设计一个有三个走向(分支)的事件网关。后面紧接着定时器事件、信号事件和消息事件。然后在分别跟着三个task任务。三个task任务可以告知我们流程是怎么走的。Task任务上面的监听器可以更加详细的让我们知道整个流程的执行过程

     

    流程配置

    时间事件的CRON表达式配置

    R4/2018-05-27T14:42/PT1M

    这个表达式的意思是从2018-05-27日的14点42分开始,每分钟执行一次,一共执行4次。

    设计流程表达式的时候设置CRON表达式。

     

    在流程里面定义新增一个信号引用,并在信号事件里面引用。

     

    在流程定义里面定义一个消息事件,并在消息事件里面去引用。

     

    给时间事件增加一个执行监听器和任务监听器

     

     

    给信号事件增加一个执行监听器和任务监听器

     

     

    给消息事件增加一个执行监听器和任务监听器

     

     

    在上面所示,每一个任务我们都配置了执行监听器和任务执行器。你会发现,我配置的类都是同一个类。你就往下看,你会发现,我这三个任务里面的执行监听器和任务监听器执行的代码都是一样的。唯一不同的是任务监听器实现的是TaskListener,执行监听器实现的是ExecutionListener。细心的就会发现,监听器实现的事件也不一样。任务监听器的事件是Create···,执行监听器的事件是:start···。后面我将会有一个环节专门介绍这两者的区别。

    流程定义:

      1 <?xml version='1.0' encoding='UTF-8'?>
      2 
      3 <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://activiti.org/test">
      4 
      5   <signal id="Singal" name="Singal" />
      6 
      7   <message id="Message" name="Message" />
      8 
      9   <process id="EventGateWay" name="事件网关" isExecutable="true">
     10 
     11     <startEvent id="sid-23B0551D-A771-4EE7-84D5-2FDE120C597F" />
     12 
     13     <endEvent id="sid-CFDD8A12-89F8-4114-8781-5506EC5F74D6" />
     14 
     15     <exclusiveGateway id="sid-5474F8B6-BDE6-4BCD-9792-9B06B283519C" />
     16 
     17     <intermediateCatchEvent id="sid-4F686F4E-C053-47EC-8FBF-028C8561B63B" name="定时器事件">
     18 
     19       <timerEventDefinition>
     20 
     21         <timeCycle>R4/2018-05-28T15:13/PT1M</timeCycle>
     22 
     23       </timerEventDefinition>
     24 
     25     </intermediateCatchEvent>
     26 
     27     <eventBasedGateway id="sid-3C4E8072-F03C-45B0-BF54-0842204B5984" />
     28 
     29     <intermediateCatchEvent id="Singals" name="信号事件">
     30 
     31       <signalEventDefinition signalRef="Singal" />
     32 
     33     </intermediateCatchEvent>
     34 
     35     <sequenceFlow id="sid-ADE687E7-F6C2-491D-A9DD-3A4274C2E67F" sourceRef="sid-3C4E8072-F03C-45B0-BF54-0842204B5984" targetRef="Singals" />
     36 
     37     <sequenceFlow id="sid-398D02FE-4E17-4683-A2AD-DFC2B834A674" sourceRef="sid-23B0551D-A771-4EE7-84D5-2FDE120C597F" targetRef="sid-3C4E8072-F03C-45B0-BF54-0842204B5984" />
     38 
     39     <intermediateCatchEvent id="Messages" name="消息事件">
     40 
     41       <messageEventDefinition messageRef="Message" />
     42 
     43     </intermediateCatchEvent>
     44 
     45     <userTask id="sid-C3D1F9C5-C11D-4A09-9EEC-F28FA2759449" name="定时器事件触发了" activiti:assignee="admin">
     46 
     47       <extensionElements>
     48 
     49         <activiti:executionListener event="start" class="light.mvc.workflow.taskListener.TimerListenerImpl" />
     50 
     51         <activiti:taskListener event="create" class="light.mvc.workflow.taskListener.TimerListenerImpl" />
     52 
     53       </extensionElements>
     54 
     55     </userTask>
     56 
     57     <userTask id="sid-88AF77E1-D75B-4085-A244-1A772C42893E" name="信号事件触发了" activiti:assignee="admin">
     58 
     59       <extensionElements>
     60 
     61         <activiti:executionListener event="start" class="light.mvc.workflow.taskListener.SingalListenerImpl" />
     62 
     63         <activiti:taskListener event="create" class="light.mvc.workflow.taskListener.SingalListenerImpl" />
     64 
     65       </extensionElements>
     66 
     67     </userTask>
     68 
     69     <userTask id="sid-881FDB4C-571D-4330-A753-7C1BC87C3130" name="消息事件触发了" activiti:assignee="admin">
     70 
     71       <extensionElements>
     72 
     73         <activiti:executionListener event="start" class="light.mvc.workflow.taskListener.MessageListenerImpl" />
     74 
     75         <activiti:taskListener event="create" class="light.mvc.workflow.taskListener.MessageListenerImpl" />
     76 
     77       </extensionElements>
     78 
     79     </userTask>
     80 
     81     <sequenceFlow id="sid-A96EE6F9-F2E8-4B0B-8128-0808651C69AC" sourceRef="sid-5474F8B6-BDE6-4BCD-9792-9B06B283519C" targetRef="sid-CFDD8A12-89F8-4114-8781-5506EC5F74D6" />
     82 
     83     <sequenceFlow id="sid-C4CD2E72-679C-4AB4-87EA-F364B033A8B6" sourceRef="sid-4F686F4E-C053-47EC-8FBF-028C8561B63B" targetRef="sid-C3D1F9C5-C11D-4A09-9EEC-F28FA2759449" />
     84 
     85     <sequenceFlow id="sid-F4CA6F5B-B634-4D59-9824-B4F98634C6A1" sourceRef="Singals" targetRef="sid-88AF77E1-D75B-4085-A244-1A772C42893E" />
     86 
     87     <sequenceFlow id="sid-2B33C971-D5F7-4CF9-85FF-F8264BA62600" sourceRef="sid-88AF77E1-D75B-4085-A244-1A772C42893E" targetRef="sid-5474F8B6-BDE6-4BCD-9792-9B06B283519C" />
     88 
     89     <sequenceFlow id="sid-6B3C1D12-6792-476E-ABFA-2EC780C20B5F" sourceRef="Messages" targetRef="sid-881FDB4C-571D-4330-A753-7C1BC87C3130" />
     90 
     91     <sequenceFlow id="sid-DDCEBFC5-7E85-4738-94D7-7D0E6A678C8C" sourceRef="sid-3C4E8072-F03C-45B0-BF54-0842204B5984" targetRef="sid-4F686F4E-C053-47EC-8FBF-028C8561B63B" />
     92 
     93     <sequenceFlow id="sid-ED0B6AA2-8677-4791-AD6B-637553A690F1" sourceRef="sid-3C4E8072-F03C-45B0-BF54-0842204B5984" targetRef="Messages" />
     94 
     95     <sequenceFlow id="sid-308B7959-1F2B-43A9-8237-893103EB7B7D" sourceRef="sid-C3D1F9C5-C11D-4A09-9EEC-F28FA2759449" targetRef="sid-5474F8B6-BDE6-4BCD-9792-9B06B283519C" />
     96 
     97     <sequenceFlow id="sid-E9416900-EBFC-4DB2-8A49-495BBE0C5B96" sourceRef="sid-881FDB4C-571D-4330-A753-7C1BC87C3130" targetRef="sid-5474F8B6-BDE6-4BCD-9792-9B06B283519C" />
     98 
     99   </process>
    100 
    101   <bpmndi:BPMNDiagram id="BPMNDiagram_EventGateWay">
    102 
    103     <bpmndi:BPMNPlane bpmnElement="EventGateWay" id="BPMNPlane_EventGateWay">
    104 
    105       <bpmndi:BPMNShape bpmnElement="sid-23B0551D-A771-4EE7-84D5-2FDE120C597F" id="BPMNShape_sid-23B0551D-A771-4EE7-84D5-2FDE120C597F">
    106 
    107         <omgdc:Bounds height="30.0" width="30.0" x="135.0" y="195.0" />
    108 
    109       </bpmndi:BPMNShape>
    110 
    111       <bpmndi:BPMNShape bpmnElement="sid-CFDD8A12-89F8-4114-8781-5506EC5F74D6" id="BPMNShape_sid-CFDD8A12-89F8-4114-8781-5506EC5F74D6">
    112 
    113         <omgdc:Bounds height="28.0" width="28.0" x="870.0" y="196.0" />
    114 
    115       </bpmndi:BPMNShape>
    116 
    117       <bpmndi:BPMNShape bpmnElement="sid-5474F8B6-BDE6-4BCD-9792-9B06B283519C" id="BPMNShape_sid-5474F8B6-BDE6-4BCD-9792-9B06B283519C">
    118 
    119         <omgdc:Bounds height="40.0" width="40.0" x="750.0" y="190.00000487674356" />
    120 
    121       </bpmndi:BPMNShape>
    122 
    123       <bpmndi:BPMNShape bpmnElement="sid-4F686F4E-C053-47EC-8FBF-028C8561B63B" id="BPMNShape_sid-4F686F4E-C053-47EC-8FBF-028C8561B63B">
    124 
    125         <omgdc:Bounds height="31.0" width="31.0" x="390.0" y="90.0" />
    126 
    127       </bpmndi:BPMNShape>
    128 
    129       <bpmndi:BPMNShape bpmnElement="sid-3C4E8072-F03C-45B0-BF54-0842204B5984" id="BPMNShape_sid-3C4E8072-F03C-45B0-BF54-0842204B5984">
    130 
    131         <omgdc:Bounds height="40.0" width="40.0" x="240.0" y="190.0" />
    132 
    133       </bpmndi:BPMNShape>
    134 
    135       <bpmndi:BPMNShape bpmnElement="Singals" id="BPMNShape_Singals">
    136 
    137         <omgdc:Bounds height="30.0" width="30.0" x="390.0" y="195.0" />
    138 
    139       </bpmndi:BPMNShape>
    140 
    141       <bpmndi:BPMNShape bpmnElement="Messages" id="BPMNShape_Messages">
    142 
    143         <omgdc:Bounds height="30.0" width="30.0" x="390.5" y="295.0" />
    144 
    145       </bpmndi:BPMNShape>
    146 
    147       <bpmndi:BPMNShape bpmnElement="sid-C3D1F9C5-C11D-4A09-9EEC-F28FA2759449" id="BPMNShape_sid-C3D1F9C5-C11D-4A09-9EEC-F28FA2759449">
    148 
    149         <omgdc:Bounds height="80.0" width="100.0" x="555.0" y="65.5" />
    150 
    151       </bpmndi:BPMNShape>
    152 
    153       <bpmndi:BPMNShape bpmnElement="sid-88AF77E1-D75B-4085-A244-1A772C42893E" id="BPMNShape_sid-88AF77E1-D75B-4085-A244-1A772C42893E">
    154 
    155         <omgdc:Bounds height="80.0" width="100.0" x="555.0" y="170.0" />
    156 
    157       </bpmndi:BPMNShape>
    158 
    159       <bpmndi:BPMNShape bpmnElement="sid-881FDB4C-571D-4330-A753-7C1BC87C3130" id="BPMNShape_sid-881FDB4C-571D-4330-A753-7C1BC87C3130">
    160 
    161         <omgdc:Bounds height="80.0" width="100.0" x="555.0" y="270.0" />
    162 
    163       </bpmndi:BPMNShape>
    164 
    165       <bpmndi:BPMNEdge bpmnElement="sid-398D02FE-4E17-4683-A2AD-DFC2B834A674" id="BPMNEdge_sid-398D02FE-4E17-4683-A2AD-DFC2B834A674">
    166 
    167         <omgdi:waypoint x="165.0" y="210.0000003694503" />
    168 
    169         <omgdi:waypoint x="240.0000022167019" y="210.0000022167019" />
    170 
    171       </bpmndi:BPMNEdge>
    172 
    173       <bpmndi:BPMNEdge bpmnElement="sid-2B33C971-D5F7-4CF9-85FF-F8264BA62600" id="BPMNEdge_sid-2B33C971-D5F7-4CF9-85FF-F8264BA62600">
    174 
    175         <omgdi:waypoint x="655.0" y="210.00000147780108" />
    176 
    177         <omgdi:waypoint x="750.0000005911204" y="210.00000428562313" />
    178 
    179       </bpmndi:BPMNEdge>
    180 
    181       <bpmndi:BPMNEdge bpmnElement="sid-A96EE6F9-F2E8-4B0B-8128-0808651C69AC" id="BPMNEdge_sid-A96EE6F9-F2E8-4B0B-8128-0808651C69AC">
    182 
    183         <omgdi:waypoint x="789.5840716200719" y="210.41593325667168" />
    184 
    185         <omgdi:waypoint x="870.0001358465071" y="210.06167401189862" />
    186 
    187       </bpmndi:BPMNEdge>
    188 
    189       <bpmndi:BPMNEdge bpmnElement="sid-F4CA6F5B-B634-4D59-9824-B4F98634C6A1" id="BPMNEdge_sid-F4CA6F5B-B634-4D59-9824-B4F98634C6A1">
    190 
    191         <omgdi:waypoint x="420.0" y="210.0" />
    192 
    193         <omgdi:waypoint x="555.0" y="210.0" />
    194 
    195       </bpmndi:BPMNEdge>
    196 
    197       <bpmndi:BPMNEdge bpmnElement="sid-ED0B6AA2-8677-4791-AD6B-637553A690F1" id="BPMNEdge_sid-ED0B6AA2-8677-4791-AD6B-637553A690F1">
    198 
    199         <omgdi:waypoint x="260.5" y="229.5" />
    200 
    201         <omgdi:waypoint x="260.5" y="310.0" />
    202 
    203         <omgdi:waypoint x="390.5" y="310.0" />
    204 
    205       </bpmndi:BPMNEdge>
    206 
    207       <bpmndi:BPMNEdge bpmnElement="sid-308B7959-1F2B-43A9-8237-893103EB7B7D" id="BPMNEdge_sid-308B7959-1F2B-43A9-8237-893103EB7B7D">
    208 
    209         <omgdi:waypoint x="655.0" y="105.5" />
    210 
    211         <omgdi:waypoint x="770.0" y="105.5" />
    212 
    213         <omgdi:waypoint x="770.0" y="190.00000487674356" />
    214 
    215       </bpmndi:BPMNEdge>
    216 
    217       <bpmndi:BPMNEdge bpmnElement="sid-ADE687E7-F6C2-491D-A9DD-3A4274C2E67F" id="BPMNEdge_sid-ADE687E7-F6C2-491D-A9DD-3A4274C2E67F">
    218 
    219         <omgdi:waypoint x="279.56597222222223" y="210.43402777777777" />
    220 
    221         <omgdi:waypoint x="390.00008979696906" y="210.0519028034707" />
    222 
    223       </bpmndi:BPMNEdge>
    224 
    225       <bpmndi:BPMNEdge bpmnElement="sid-DDCEBFC5-7E85-4738-94D7-7D0E6A678C8C" id="BPMNEdge_sid-DDCEBFC5-7E85-4738-94D7-7D0E6A678C8C">
    226 
    227         <omgdi:waypoint x="260.5" y="190.5" />
    228 
    229         <omgdi:waypoint x="260.5" y="106.0" />
    230 
    231         <omgdi:waypoint x="390.0" y="106.0" />
    232 
    233       </bpmndi:BPMNEdge>
    234 
    235       <bpmndi:BPMNEdge bpmnElement="sid-C4CD2E72-679C-4AB4-87EA-F364B033A8B6" id="BPMNEdge_sid-C4CD2E72-679C-4AB4-87EA-F364B033A8B6">
    236 
    237         <omgdi:waypoint x="421.99994949646396" y="105.95979912186817" />
    238 
    239         <omgdi:waypoint x="555.0" y="105.62562814070353" />
    240 
    241       </bpmndi:BPMNEdge>
    242 
    243       <bpmndi:BPMNEdge bpmnElement="sid-E9416900-EBFC-4DB2-8A49-495BBE0C5B96" id="BPMNEdge_sid-E9416900-EBFC-4DB2-8A49-495BBE0C5B96">
    244 
    245         <omgdi:waypoint x="655.0" y="310.0" />
    246 
    247         <omgdi:waypoint x="770.0" y="310.0" />
    248 
    249         <omgdi:waypoint x="770.0" y="230.00000487674356" />
    250 
    251       </bpmndi:BPMNEdge>
    252 
    253       <bpmndi:BPMNEdge bpmnElement="sid-6B3C1D12-6792-476E-ABFA-2EC780C20B5F" id="BPMNEdge_sid-6B3C1D12-6792-476E-ABFA-2EC780C20B5F">
    254 
    255         <omgdi:waypoint x="420.5" y="310.0" />
    256 
    257         <omgdi:waypoint x="555.0" y="310.0" />
    258 
    259       </bpmndi:BPMNEdge>
    260 
    261     </bpmndi:BPMNPlane>
    262 
    263   </bpmndi:BPMNDiagram>
    264 
    265 </definitions>

    流程监听类

    1.  MessageListenerImpl

     1 package light.mvc.workflow.taskListener;
     2 
     3  
     4 
     5 import org.activiti.engine.delegate.DelegateExecution;
     6 
     7 import org.activiti.engine.delegate.DelegateTask;
     8 
     9 import org.activiti.engine.delegate.ExecutionListener;
    10 
    11 import org.activiti.engine.delegate.JavaDelegate;
    12 
    13 import org.activiti.engine.delegate.TaskListener;
    14 
    15  
    16 
    17 public class MessageListenerImpl implements TaskListener,ExecutionListener {
    18 
    19  
    20 
    21 @Override
    22 
    23 public void notify(DelegateTask arg0) {
    24 
    25      System.out.println("Message Event Task Is Running");
    26 
    27  
    28 
    29 }
    30 
    31  
    32 
    33 @Override
    34 
    35 public void notify(DelegateExecution arg0) throws Exception {
    36 
    37      // TODO Auto-generated method stub
    38 
    39      System.out.println("Message Event Execution Is Running");
    40 
    41 }
    42 
    43  
    44 
    45 }

     

    2.  SingalListenerImpl

     

     1 package light.mvc.workflow.taskListener;
     2 
     3  
     4 
     5 import org.activiti.engine.delegate.DelegateExecution;
     6 
     7 import org.activiti.engine.delegate.DelegateTask;
     8 
     9 import org.activiti.engine.delegate.ExecutionListener;
    10 
    11 import org.activiti.engine.delegate.JavaDelegate;
    12 
    13 import org.activiti.engine.delegate.TaskListener;
    14 
    15  
    16 
    17 public class SingalListenerImpl implements  TaskListener,ExecutionListener  {
    18 
    19  
    20 
    21     @Override
    22 
    23     public void notify(DelegateTask arg0) {
    24 
    25         System.out.println("Singal Event Task Is Running");
    26 
    27  
    28 
    29     }
    30 
    31  
    32 
    33     @Override
    34 
    35     public void notify(DelegateExecution arg0) throws Exception {
    36 
    37         // TODO Auto-generated method stub
    38 
    39         System.out.println("Singal Event Execution Is Running");
    40 
    41     }
    42 
    43  
    44 
    45  
    46 
    47  
    48 
    49 }

     

    3.  TimerListenerImpl

     1 package light.mvc.workflow.taskListener;
     2 
     3  
     4 
     5 import org.activiti.engine.delegate.DelegateExecution;
     6 
     7 import org.activiti.engine.delegate.DelegateTask;
     8 
     9 import org.activiti.engine.delegate.ExecutionListener;
    10 
    11 import org.activiti.engine.delegate.JavaDelegate;
    12 
    13 import org.activiti.engine.delegate.TaskListener;
    14 
    15  
    16 
    17 public class TimerListenerImpl implements TaskListener,ExecutionListener {
    18 
    19  
    20 
    21 @Override
    22 
    23 public void notify(DelegateTask arg0) {
    24 
    25      System.out.println("Timer Event Task Is Running");
    26 
    27  
    28 
    29 }
    30 
    31  
    32 
    33  
    34 
    35 @Override
    36 
    37 public void notify(DelegateExecution arg0) throws Exception {
    38 
    39      // TODO Auto-generated method stub
    40 
    41      System.out.println("Timer Event Execution Is Running");
    42 
    43 }
    44 
    45  
    46 
    47 }

     

     

    通过以上代码,我们会发现,其实代码都很简单,只是往控制台打印一句话,告诉我们,这个网关事件是怎么走的。

    我们启动流程,稍微等待时间,就会发现流程自动往下执行了。此时,定时事件已经触发。

    通过执行的顺序,你会发现是先执行Execution ,再执行Task。由此可见。执行监听器比任务监听器更早触发。

     

    执行结果:

     

    1.定时器(时间)事件触发

     

    待办任务告诉我们,定时器事件触发了。

     

    流程跟踪图也告诉我们定时器事件触发。

     

    这时,完成定时器事件触发了的任务,该流程实例就全部结束。

    2信号事件触发(需要重新启动流程,因为上一个流程已经结束)

    我们通过一个单元测试模拟信号,让信号事件触发。

     1 /**触发信号事件*/
     2 
     3     @Test
     4 
     5     public void completeSingal(){
     6 
     7         ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
     8 
     9         List<Execution> executions =  processEngine.getRuntimeService().createExecutionQuery()
    10 
    11            .signalEventSubscriptionName("Singal")
    12 
    13            .list();
    14 
    15         for(Execution e:executions){
    16 
    17             processEngine.getRuntimeService().signalEventReceived("Singal", e.getId());
    18 
    19         }
    20 
    21     }

    通过控制台打印消息,告诉我们信号事件已经触发。

     

    待办任务告诉我们信号事件触发了。

     

    流程跟踪图告诉我们信号事件触发了。

     

    3.  消息事件触发

    单元测试模拟消息事件触发。

      

     1   /**触发消息事件*/
     2 
     3     @Test
     4 
     5     public void completeMessage(){
     6 
     7         ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
     8 
     9         List<Execution> executions =  processEngine.getRuntimeService().createExecutionQuery()
    10 
    11            .messageEventSubscriptionName("Message")
    12 
    13            .list();
    14 
    15         for(Execution e:executions){
    16 
    17             processEngine.getRuntimeService().messageEventReceived("Message", e.getId());
    18 
    19         }
    20 
    21 }

    控制台打印的消息告诉我们消息事件已经触发了。

     

    待办任务告诉我们消息事件已经触发

     

    流程跟踪图告诉我们消息事件已经触发

     

      Activiti交流QQ群:634320089

  • 相关阅读:
    String类的常用成员方法
    String类和StringBuffer类
    记事本
    GridLayout 可使容器中的各个组件呈网格状布局
    在使用add()方法添加组件到容器时,必须指定将其放置在哪个区域中
    每个容器都有一个布局管理器
    框架一般用作Java应用程序的窗口,而Applet是Java小程序的窗口
    面板是一种透明的容器,没有标题和边框
    要生成一个窗口,通常使用Window的子类Frame类进行实例化
    分布式系统 (大规模分布式系统原理解析和架构实践)
  • 原文地址:https://www.cnblogs.com/dengjiahai/p/9147404.html
Copyright © 2011-2022 走看看