2015.02.14 16:57


TestCustomDialogActivity.Java 


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
package arabiannight.tistory.com;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import arabiannight.tistory.com.popup.CustomDialog;
 
public class TestCustomDialogActivity extends Activity {
 
    private CustomDialog mCustomDialog;
     
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
 
    public void onClickView(View v){
        switch (v.getId()) {
        case R.id.bt_main:
            mCustomDialog = new CustomDialog(this,
                    "8월의 크리스마스!!",
                    "영화보러가자~!!!",
                    leftClickListener,
                    rightClickListener);
            mCustomDialog.show();
            break;
        }
    }
 
    private View.OnClickListener leftClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(getApplicationContext(), "왼쪽버튼 Click!!",
                    Toast.LENGTH_SHORT).show();
        }
    };
 
    private View.OnClickListener rightClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(getApplicationContext(), "오른쪽버튼 Click!!",
                    Toast.LENGTH_SHORT).show();
        }
    };
}



CustomDialog.Java

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
package arabiannight.tistory.com.popup;
 
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.TextView;
import arabiannight.tistory.com.R;
 
public class CustomDialog extends Dialog{
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
         
        WindowManager.LayoutParams lpWindow = new WindowManager.LayoutParams();   
        lpWindow.flags = WindowManager.LayoutParams.FLAG_DIM_BEHIND;
        lpWindow.dimAmount = 0.8f;
        getWindow().setAttributes(lpWindow);
         
        setContentView(R.layout.custom_dialog);
         
        setLayout();
        setTitle(mTitle);
        setContent(mContent);
        setClickListener(mLeftClickListener , mRightClickListener);
    }
     
    public CustomDialog(Context context) {
        // Dialog 배경을 투명 처리 해준다.
        super(context , android.R.style.Theme_Translucent_NoTitleBar);
    }
     
    public CustomDialog(Context context , String title ,
            View.OnClickListener singleListener) {
        super(context , android.R.style.Theme_Translucent_NoTitleBar);
        this.mTitle = title;
        this.mLeftClickListener = singleListener;
    }
     
    public CustomDialog(Context context , String title , String content ,
            View.OnClickListener leftListener , View.OnClickListener rightListener) {
        super(context , android.R.style.Theme_Translucent_NoTitleBar);
        this.mTitle = title;
        this.mContent = content;
        this.mLeftClickListener = leftListener;
        this.mRightClickListener = rightListener;
    }
     
    private void setTitle(String title){
        mTitleView.setText(title);
    }
     
    private void setContent(String content){
        mContentView.setText(content);
    }
     
    private void setClickListener(View.OnClickListener left , View.OnClickListener right){
        if(left!=null && right!=null){
            mLeftButton.setOnClickListener(left);
            mRightButton.setOnClickListener(right);
        }else if(left!=null && right==null){
            mLeftButton.setOnClickListener(left);
        }else {
             
        }
    }
     
    private TextView mTitleView;
    private TextView mContentView;
    private Button mLeftButton;
    private Button mRightButton;
    private String mTitle;
    private String mContent;
     
    private View.OnClickListener mLeftClickListener;
    private View.OnClickListener mRightClickListener;
     
    /*
     * Layout
     */
    private void setLayout(){
        mTitleView = (TextView) findViewById(R.id.tv_title);
        mContentView = (TextView) findViewById(R.id.tv_content);
        mLeftButton = (Button) findViewById(R.id.bt_left);
        mRightButton = (Button) findViewById(R.id.bt_right);
    }
     
}



 TestCustomDialog.zip









Posted by injunech
2015.02.12 11:25


비주얼 스튜디오 2013에서는 컴파일러가 강화되었는지, 예전 2010버전에서는 Warning 정도로 처리했던 unsafe 함수들에 대해 에러로 처리하여 컴파일이 되지 않습니다.


예를 들면 scanf, strcpy 같은 함수들을 사용하면 아래와 같은 오류창을 띄우며 컴파일에 실패합니다.


"error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."


scanf 는 안전하지 않으니, scanf_s를 사용하거나 _CRT_SECURE_NO_WARNINGS을 사용하라는 내용인데, 저 혼자 테스트 하는 프로젝트라서 _CRT_SECURE_NO_WARNINGS을 추가했습니다.



추가하는 방법은 [프로젝트] 메뉴에 제일 밑에 있는 메뉴를 보면 [(프로젝트명) 속성] 이라는 메뉴가 있습니다.



속성을 클릭한 다음에 아래와 같이 C/C++ 전처리기 탭에 들어갑니다.

뜨는 항목중, 전처리기 정의에 오른쪽에 보이는 화살표를 클릭하면 나타나는 <편집...> 을 눌러줍니다.



정의 내용안에 

_CRT_SECURE_NO_WARNINGS

를 입력하고 확인 눌러줍니다.



전처리기 정의가 끝난 이후에는 scanf나 strcpy를 자유롭게 쓰셔도 에러처리 안하고 컴파일이 잘 됩니다.


위와 같은 방법도 있고, 소스코드의 제일 위에 

1
#define _CRT_SECURE_NO_WARNINGS

을 선언해 주어도 됩니다. 제일 윗 줄에 선언하셔야합니다. (적어도 해당 함수를 담고 있는 헤더 윗줄에)


하지만 소스코드 자체에 이런 "임시 에러 우회방법"을 사용하는것이 마음에 안들어 저는 프로젝트에 추가시키는 편입니다. 사실은 버퍼오버플로우 등의 프로그램 취약성때문에 사용하면 안 되는 함수이기 때문이죠. 하지말라는건 하지 않는게 좋은겁니다 :)



Posted by injunech
2015.02.07 20:43


1.Introduction                                                                                                              

 

 

많이들 보신 화면입니다. 그런데, 이것은 자바로 만들어졌습니다.

기존의 스윙 Look & Feel 을 아시던 분이라면 아마도 놀라실듯 합니다.

 

JGoodies 는 제품개발, 소프트웨어 컨설팅 그리고 디자인 회사입니다.

http://www.jgoodies.com/

 

자바 데스크탑 애플리케이션을 제작중이시거나 공부하시는 분들은 아마  

http://java.sun.com/products/jfc/tsc/sightings/index.html 에서 많은

자바 애플리케이션들을 보셨을겁니다.

이중에서 UI 가 좀 이쁘다 싶으면 거의 모두 JGoodies 를 쓴거라고 보셔도 무방합니다.

 

JGoodies 에서 내놓은  Free Libraries 는 전세계 자바 유저들에게

엄청난 인지도를 가진  "Advanced Java Look & Feel API"  입니다.

http://www.jgoodies.com/freeware/index.html

 

이 라이브러리는 모두 BSD 라이센스 입니다.

이것은 GNU 라이센스인 GPL 보다 더 자유로운 라이센스로 , 쉽게 말하자면

공개된 소스가지고 지지고 볶든 , 뭐 다른걸 만들던 상관하지 않는다 라는 겁니다.

더 쉽게 말하면.  진짜 완전 꽁짜라는 소립니다. ㅡ.ㅡ;

 

2. JGoodies Free Libraries                                                                     

 

공개된 라이브러리는 다음과 같습니다.

JGoodies Animation

-> Time-based real-time animations in Java

http://www.jgoodies.com/freeware/animation/index.html


JGoodies Forms

-> Build better screens faster
http://www.jgoodies.com/freeware/forms/index.html

 

JGoodies Looks

 -> Free high-fidelity Windows and multi-platform appearance
http://www.jgoodies.com/freeware/looks/index.html

 

자바 데스크탑 애플리케이션을 만들때 아주 유용하게 쓰이는 것들입니다.

프로젝트에 JGoodies 를 적용할것이냐 말것이냐하는 판단은 개발자 각자의 몫이지만,

이것을 사용함으로서 얻는 이점은 이루 말 할수 없습니다.

 

3. JGoodies Looks                                                                                 

 

다운받아 보겠습니다.

먼저 라이브러리를 다운받기 위해

http://www.jgoodies.com/downloads/libraries.html 로 가서

JGoodies Looks 을 다운받습니다.

 

샘플 데모프로그램도 하나 다운 받아 봅시다.

http://www.jgoodies.com/downloads/index.html 로 가서

Looks Demo 를 다운 받습니다.

 

적당한 폴더에 풀고 데모를 실행시켜 보겠습니다.

>> java -jar looksdemo-1.2.2.jar

 

여기서 Look & Feel 과 Theme 를 선택하고 Launch Demo 를 누르면,

 

그냥 GUI 일 뿐이며, 액션은 없습니다. 이 윈도우를 종료하면 다시 Luncher 화면으로 돌아갑니다.


4. How to Use Look anf Feel                                                                     

 

Java Swing 을 사용한 GUI 프로그램을 제작할때 ,

우리는 스윙의 look&feel 을 변경하고 싶을때..다음과 같이 합니다.

 

.

.

.

 String macLAF       =  "com.sun.java.swing.plaf.mac.MacLookAndFeel";
 String metalLAF      =  "javax.swing.plaf.metal.MetalLookAndFeel";
 String motifLAF       =  "com.sun.java.swing.plaf.motif.MotifLookAndFeel";
 String windowsLAF = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
 String GTKLAF        =  "com.sun.java.swing.plaf.gtk.GTKLookAndFeel";

 String lafName= windowsLAF ;//-> 원하는 룩앤필 이름을 지정합니다.
  try {
   UIManager.setLookAndFeel(lafName);
  } catch (UnsupportedLookAndFeelException e) {
   e.printStackTrace();
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  } catch (InstantiationException e) {
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   e.printStackTrace();
  }

.

.

 

 















 마찬가지 방법으로 JGoodies Look & Feel 을 적용한다면,

 

.

.

 String exWinLAF ="com.jgoodies.plaf.windows.ExtWindowsLookAndFeel";
 String plasticLAF ="com.jgoodies.plaf.plastic.PlasticLookAndFeel";
 String plastic3DLAF ="com.jgoodies.plaf.plastic.Plastic3DLookAndFeel"; 
 String plasticXPLAF ="com.jgoodies.plaf.plastic.PlasticXPLookAndFeel"; 

 String lafName= exWinLAF ;//-> 원하는 룩앤필 이름을 지정합니다.
  try {
   UIManager.setLookAndFeel(lafName);
  } catch (UnsupportedLookAndFeelException e) {
   e.printStackTrace();
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  } catch (InstantiationException e) {
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   e.printStackTrace();
  }

 













여러분이 만들어논 데스크탑 애플리케이션이 있다면,

JGoodies Looks jar 파일을 클래스 패싱하시고

위 코드를 main 에 추가해 보시면 아마 더 예쁜 GUI 가 보여질것입니다.

 

4. How to Use Theme                                                                              

 

JGoodies 가 제공하는 Plastic 시리즈 룩앤필에는 원하는 테마를 설정할수 있습니다.

제공하고 있는 테마는 JGoodies API 를 참조합니다.

다음과 같이 Plastic 룩앤필에 테마를 설정합니다.

 

.

PlasticLookAndFeel.setMyCurrentTheme(new DesertBlue());
   try {
      UIManager.setLookAndFeel(new Plastic3DLookAndFeel());
   } catch (Exception e) {}
 .

.

 




JGoodies 의 FAQ 에도 나와 있지만  

Plastic 룩앤필은 중국어 일본어 및 기타 언어를 지원하지 않습니다.

따라서 한국어를 지원하기 위해 약간의 꼼수가 필요합니다.

 

이 꼼수는 바로 Theme 를 이용하는 것인데,

PlasticTheme 클래스의 getFont0() 메소드를 오버라이드하여

내가 원하는 한글 폰트를 지정하는 것입니다.

 

.

  PlasticLookAndFeel.setMyCurrentTheme(new DesertBlue(){
   protected Font getFont0(int size) {
    return new Font("굴림", Font.PLAIN, 12);
   }
  });

 

  try {
      UIManager.setLookAndFeel(new Plastic3DLookAndFeel());
   } catch (Exception e) {}
.

 









5. 마치며...                                                                                            

 

Plastic 룩앤필은 특정한 몇몇개의 자바 컴퍼넌트의 UI 에 옵션을 설정할수 있습니다.

이것은 User's Guide 에 자세히 나와 있으므로 쉽게 참조 할수 있습니다.


JGoodies API는 아주 훌륭한 자바 룩앤필 이며

멋진 GUI 를 원하는 자바 데스크탑개발자라면 한번쯤 눈여겨 볼만한 API 입니다





'Computer > JAVA' 카테고리의 다른 글

JNA (Java Native Access)  (0) 2015.03.14
[JAVA] 자바 실행파일 만들기  (0) 2015.03.01
JGoodies JAVA Swing API  (0) 2015.02.07
클래스 java.io.File  (0) 2013.05.29
평년/윤년 구하기  (0) 2013.03.02
날짜  (0) 2013.03.02


Posted by injunech