본문 바로가기

JavaScript/ ExtJS

ExtJS : Buttons

ExtJS : Buttons

기본 버튼들과 크기조절, 버튼에 아이콘 삽입 등에 대해 알아본다.

Preview

레이아웃과 버튼을 조합해서 아래와 같이 eclipse UI를 비슷하게 만들어보자.

layout

border를 이용해 레이아웃을 잡고, 위에 메뉴역할을 할 버튼 몇 개를 넣었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
Ext.onReady(function(){
  Ext.create('Ext.container.Viewport',{
    layout:'border',
    renderTo: Ext.getBody(),
    items:[{
      xtype: 'panel',
      height:100,
      region:'north',
      header:false,
      items:[{
        xtype: 'toolbar',
        items:[{
          xtype:'button',
          text: 'File'
        },{
          xtype:'button',
          text: 'Edit'
        },{
          xtype:'button',
          text: 'Source'
        }]
      },{
        xtype: 'toolbar',
        items:[{
          xtype:'button'
        },{
          xtype:'button'
        },{
          xtype:'button'
        }]
      }]
    },{
      xtype: 'panel',
      width:150,
      region:'west',
      split: true,
      title: 'Project Explorer'
    },{
      xtype: 'panel',
      flex:1,
      title:'',
      header:false,
      region:'center',
      layout:'border',
      items:[{
        xtype:'panel',
        flex:2,
        title:'app.js',
        region:'center'
      },{
        xtype:'panel',
        flex:1,
        title:'Servers',
        region:'south'
      }]
    }]
  });
});
cs

결과

icon

링크에 들어가서 원하는 모양의 아이콘을 찾고 해당 아이콘의 별칭을 복사한다.

iconCls 속성에 붙여넣기하는데, 복사한 별칭 앞에 x-fa 를 붙여줘야 제대로 출력된다.


1
2
3
4
5
6
7
8
9
10
        items:[{
          xtype:'button',
          iconCls: 'x-fa fa-plus'
        },{
          xtype:'button',
          iconCls: 'x-fa fa-floppy-o'
        },{
          xtype:'button',
          iconCls: 'x-fa fa-desktop'
        }]
cs

Scale

크기는 scale로 제어한다. 왼쪽부터 차례대로 small, medium, large 크기다.

1
2
3
4
5
6
7
8
9
10
11
12
13
        {
          xtype: 'button',
          iconCls: 'x-fa fa-play',
          scale: 'small'
        },{
          xtype: 'button',
          iconCls: 'x-fa fa-pause',
          scale: 'medium'
        },{
          xtype: 'button',
          iconCls: 'x-fa fa-stop',
          scale: 'large'
        }
cs

Toggle

한번 버튼을 클릭하면 누른 상태로 고정되고, 다시 한 번 클릭하면 해제되는 것이 토글이다.
일반 버튼이 누르고 떼면 원상복구되는 것과 차이가 있다.
위처럼 클릭하고 마우스를 떼도 눌러진 상태로 보인다.

1
2
3
4
5
6
{
    xtype: 'button',
    iconCls: 'x-fa fa-stop',
    scale: 'large',
    enableToggle: true
}
cs

Menu

위 File 버튼처럼 눌렀을 때 하위메뉴가 나오게 하려면 menu 속성을 주면 된다.
menu는 jsonArray 값을 갖는다. 

Edit버튼처럼 메뉴버튼 부분이 분리되게 하려면 splitbutton이라고 선언한다.
왼쪽 Edit을 누르는 것과 오른쪽 menu 부분을 누르는 것이 분리되어 Edit 텍스트는 클릭이 되지 않게 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
items:[{
        xtype: 'toolbar',
        items:[{
          xtype:'button',
          text: 'File',
          menu: [{
            text: 'New'
          },{
            text: 'Open File'
          },{
            text: 'Close'
          }]
        },{
          xtype:'splitbutton',
          text: 'Edit',
          menu: [{
            text: 'Undo typing'
          },{
            text: 'Redo'
          },{
            text: 'Cut'
          }]
        },{
          xtype:'button',
          text: 'Source'
        }]
cs

icon in menu

하위메뉴 왼쪽에 공백칸이 있는데 이 곳에 아이콘을 삽입할 수 있다.

위에서 버튼에 아이콘을 삽입한 것과 같은 방법을 사용하면 된다.


1
2
3
4
5
        menu: [{
            text: 'New',
            iconCls: 'x-fa fa-file'
          },{
....
cs

Segmented button

버튼들이 그룹화되어 하위 버튼아이템들 중 하나만 선택된다.

radiobutton을 생각하면 쉽다.

그러나 allowMultiple: boolean (defalut false) 속성으로 다중선택이 가능하게 할 수도 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
{
          xtype: 'segmentedbutton',
          items:[{
            xtype:'button',
            text: 'Refactor'
          },{
            xtype:'button',
            text: 'Navigate'
          },{
            xtype:'button',
            text: 'Search'
          }]
        }
cs

결과


app.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
Ext.onReady(function(){
  Ext.create('Ext.container.Viewport',{
    layout:'border',
    renderTo: Ext.getBody(),
    items:[{
      xtype: 'panel',
      height:100,
      region:'north',
      header:false,
      items:[{
        xtype: 'toolbar',
        items:[{
          xtype:'button',
          text: 'File',
          menu: [{
            text: 'New',
            iconCls: 'x-fa fa-file'
          },{
            text: 'Open File'
          },{
            text: 'Close'
          }]
        },{
          xtype:'splitbutton',
          text: 'Edit',
          menu: [{
            text: 'Undo typing'
          },{
            text: 'Redo'
          },{
            text: 'Cut'
          }]
        },{
          xtype:'button',
          text: 'Source'
        },{
          xtype: 'segmentedbutton',
          allowMultiple: true,
          items:[{
            xtype:'button',
            text: 'Refactor'
          },{
            xtype:'button',
            text: 'Navigate'
          },{
            xtype:'button',
            text: 'Search'
          }]
        }]
      },{
        xtype: 'toolbar',
        items:[{
          xtype:'button',
          iconCls: 'x-fa fa-plus'
        },{
          xtype:'button',
          iconCls: 'x-fa fa-floppy-o'
        },{
          xtype:'button',
          iconCls: 'x-fa fa-desktop'
        },{
          xtype: 'button',
          iconCls: 'x-fa fa-play',
          scale: 'small'
        },{
          xtype: 'button',
          iconCls: 'x-fa fa-pause',
          scale: 'medium'
        },{
          xtype: 'button',
          iconCls: 'x-fa fa-stop',
          scale: 'large',
          enableToggle: true
        }]
      }]
    },{
      xtype: 'panel',
      width:150,
      region:'west',
      split: true,
      title: 'Project Explorer'
    },{
      xtype: 'panel',
      flex:1,
      title:'',
      header:false,
      region:'center',
      layout:'border',
      items:[{
        xtype:'panel',
        flex:2,
        title:'app.js',
        region:'center'
      },{
        xtype:'panel',
        flex:1,
        title:'Servers',
        region:'south'
      }]
    }]
  });
});
cs