자바 이클립스 관련 질문입니다
새우깡
import java.io.File; //파일을 다루기 위한 자바클래스
import java.io.FilenameFilter; // 파일을 다룰때, 추가로 필요한 클래스
import org.eclipse.swt.SWT; //java의 기본패키지 (swt형식)
import org.eclipse.swt.SWTException; //컴파일이나 기타 에러시에 발생하는 에러를 관리하기 위한 패키지
import org.eclipse.swt.events.SelectionAdapter; //키보드, 마우스등의 컨트롤을 하기 위한 이벤트 클래스
import org.eclipse.swt.events.SelectionEvent; //키보드, 마우스등의 컨트롤을 하기위한 이벤트 클래스
import org.eclipse.swt.graphics.Image; //이미지를 다루기 위한 패키지
import org.eclipse.swt.graphics.ImageData; //이미지 파일을 다룰때 추가적으로 필요한 패키지
import org.eclipse.swt.layout.GridData; //실행 창에서 버튼이나 이미지들의 자리를 잡아주기위한 클래스
import org.eclipse.swt.layout.GridLayout; //실행 창에서 버튼이나 이미지들의 자리를 잡아주기위한 클래스
import org.eclipse.swt.widgets.Button; //버튼 관련 클래스
import org.eclipse.swt.widgets.Display; //실행 창을 띄우기 위한 클래스
import org.eclipse.swt.widgets.FileDialog; //파일 불러오기 대화상자를 사용하기 위한 클래스
import org.eclipse.swt.widgets.Label; //레이블 클래스
import org.eclipse.swt.widgets.Shell; //프로그램 인스턴스를 위한 클래스
public class Image_Viewer {
Display display; //디스플레이(창) 클래스의 인스턴스
Shell shell; //쉘(프로그램) 클래스의 인스턴스
GridLayout layoutShell; //레이아웃을 잡아주기 위한 클래스의 인스턴스
Label lblImage; //레이블 클레스를 이용해 이미지를 보여주기 위해 인스턴스 선언
GridData gridlblImage; //위의 레이블 인스턴스의 레이아웃(위치) 속성을 지정하기 위한 클래스 인스턴스
ImageData imageData; //이미지 데이터를 저장하기 위한 클래스의 인스턴스
Image image; //이미지를 저장하기 위한 클래스의 다른역할의 인스턴스
String currentFile; //현재 열려 있는 파일명과 PATH명을 저장하기 위한 문자열 클래스 인스턴스
String[] fileFilter; //이미지 파일만을 표시하기 위해서 사용되는 파일 확장자 필터를 위한 문자열 클래스 인스턴스
public Image_Viewer() { //클래스의 생성자 메소드
fileFilter = new String[] {*.bmp; *.gif; *.jpg}; //이미지파일을 불러들일때 파일 형식 설정
display = new Display(); // 디스플레이 인스턴스 생성
shell = new Shell(display); //쉘 인스턴스 생성, 디스플레이 인스턴스를 여기에 저장
layoutShell = new GridLayout(); //레이아웃 인스턴스 생성
shell.setText(연상이의 이미지 뷰어 1탄); // 디스플레이의 이름 설정
shell.setLayout(layoutShell);
//버튼에 관련된 명령어
layoutShell.numColumns = 6; //그림폭 변경
layoutShell.marginWidth = 50; // 좌우 여백 폭 변경
layoutShell.marginHeight = 30; //상하 여백 폭 변경
layoutShell.horizontalSpacing = 20; //버튼 사이의 폭 변경
layoutShell.verticalSpacing =10; //버튼아래 폭 변경
Button btnPrev1 = new Button(shell, SWT.PUSH); //새로운 버튼을 생성 push 버튼
GridData gridBtnPrev1 = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL); //수평선상에 버튼을 생성
gridBtnPrev1.grabExcessHorizontalSpace = false; //창의크기가 바뀔때 마다 버튼을 바꿀것인가? - No
btnPrev1.setLayoutData(gridBtnPrev1); //설정된 레이아웃에 새롭게 버튼을 등록
btnPrev1.setText( ==좀더 뒤로!! ); //버튼의 명칭 설정
btnPrev1.addSelectionListener( new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) { // 이버튼이 눌러졌을때 어떻게 될것인지 설정
loadFolderImage(-2); //이전 이미지 불러오기(보기)
}
}
);
Button btnPrev = new Button(shell, SWT.PUSH); //새로운 버튼을 생성 push 버튼
GridData gridBtnPrev = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL); //수평선상에 버튼을 생성
gridBtnPrev.grabExcessHorizontalSpace = false; //창의크기가 바뀔때 마다 버튼을 바꿀것인가? - No
btnPrev.setLayoutData(gridBtnPrev); //설정된 레이아웃에 새롭게 버튼을 등록
btnPrev.setText( == 뒤에껄 보여줘! ); //버튼의 명칭 설정
btnPrev.addSelectionListener( new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) { // 이버튼이 눌러졌을때 어떻게 될것인지 설정
loadFolderImage(-1); //이전 이미지 불러오기(보기)
}
}
);
Button btnFileOpen = new Button(shell, SWT.PUSH); //버튼을 생성 push버튼
GridData gridBtnFileOpen = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL);// 수평선 상에 버튼을 생성
gridBtnFileOpen.grabExcessHorizontalSpace = false; //창의 크기가 바뀔때 마다 버튼의 크기를 바꿀것인가? - No
btnFileOpen.setLayoutData(gridBtnFileOpen); //설정된 레이아웃에 새롭게 버튼을 등록
btnFileOpen.setText( 열여라 참깨 ! ! ); //버튼의 명칭 설정
btnFileOpen.addSelectionListener( new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) { //이 버튼이 눌러졌을때 어떻게 될것인지 설정
loadImageFile(); //이미지 불러오기(이미지 열기)
}
}
);
Button btnNext = new Button(shell, SWT.PUSH); //새로운 버튼을 생성 push버튼
GridData gridBtnNext = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL); //수평선상에 버튼을 생셕걋?생성
gridBtnNext.grabExcessHorizontalSpace = false; //창의 크기가 바뀔때 마다 버튼의 크기를 바꿀것인가? - No
btnNext.setLayoutData(gridBtnNext);// 설정된 레이아웃에 새롭게 버튼을 등록
btnNext.setText( 앞에껄 보여줘! == ); //버튼의 명칭 설정
btnNext.addSelectionListener( new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) { //이버튼이 눌러졌을때 어떻게 될것인지 설정
loadFolderImage(1); //다음 이미지 불러오기(보기)
}
}
);
Button btnNext1 = new Button(shell, SWT.PUSH); //새로운 버튼을 생성 push버튼
GridData gridBtnNext1 = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL); //수평선상에 버튼을 생성
gridBtnNext1.grabExcessHorizontalSpace = false; //창의 크기가 바뀔때 마다 버튼의 크기를 바꿀것인가? - No
btnNext1.setLayoutData(gridBtnNext1);// 설정된 레이아웃에 새롭게 버튼을 등록
btnNext1.setText(좀더 앞으로!! == ); //버튼의 명칭 설정
btnNext1.addSelectionListener( new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) { //이버튼이 눌러졌을때 어떻게 될것인지 설정
loadFolderImage(2); //다음 이미지 불러오기(보기)
}
}
);
lblImage = new Label(shell, SWT.NONE); //새로운 레이블 인스턴스 설정
gridlblImage = new GridData(GridData.HORIZONTAL_ALIGN_CENTER); //가운대 정렬
gridlblImage.horizontalSpan = 4; //4칼럼을 설정
gridlblImage.widthHint = 1024;//해상도의 가로크기
gridlblImage.heightHint = 768; //해상도의 새로크기
gridlblImage.grabExcessHorizontalSpace = true; //창의 크기가 바뀔때마다 버튼의 크기를 바꿀것인가? - Yes
lblImage.setLayoutData(gridlblImage); //설정된 레이아웃에 레이블 레이아웃을 등록
} //class 종료
public void Run() { //run class 시작
shell.open(); //프로그램을 시작
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep(); //이벤트 처리
}
image.dispose(); //이미지의 인스턴스를 삭제
lblImage.dispose(); //레이블의 인스턴스를 삭제
display.dispose(); //디스플레이의 인스턴스를 삭제
}
public void loadImageFile() { //loadImageFile class시작
FileDialog dialog = new FileDialog(shell, SWT.OPEN); //파일 대화창 인스턴스 생성
dialog.setFilterExtensions(fileFilter); //파일 대화창에 필터 적용
currentFile = dialog.open(); //파일 대화창 띄우기
if (currentFile != null) { //파일이 선택되었는지 체크
try {
imageData = new ImageData(currentFile); //선택된 이미지파일에서 데이터를 읽어오기
image = new Image(display, imageData); //위에서 읽어온 이미지파일 데이터를 인스턴스에 등록
lblImage.setImage(image); //등록된 이미지 데이터를 레이블에 적용
gridlblImage.widthHint = imageData.width; //레이블의 가로크기에 맞춰서 조정
gridlblImage.heightHint = imageData.height; //레이블의 세로크기에 맞춰서 조정
} catch (SWTException ex) { //여기서 잘 알수는 없지만 움직이는 gif파일은 실패할수도 있음
lblImage.setText(GIF파일을 여는데 문제가 생겼는걸...); //gif파일을 열다가 에러가 발생했을경우 메시지
}
} else { //파일이 선택 안된경우
lblImage.setText(그림을 보고 열란 말이야!); //출력될 메시지
}
lblImage.pack(); //설정된 값을 이용하여 레이블 다시 그려주기
shell.pack(); //변경된 값을 적용하기 위해 프로그램 전체를 다시 그려주기
}
public void loadFolderImage(int prev_next) {
if(currentFile == null) return;
String fileName = getFileName(prev_next); //파일이름을 불러오기 위한 메소드 호출
if (fileName != null) { //파일이 있나 없나 검사 (없을경우 변화X)
try {
imageData = new ImageData(fileName); //파일에서부터 이미지데이터를 불러오기
image = new Image(display, imageData); //위에서 불러들인 이미지데이터를 레이블에 등록
lblImage.setImage(image); //이미지를 레이블에 적용
gridlblImage.widthHint = imageData.width; //이미지의 크기에 맞춰 레이블의 가로크기 조정
gridlblImage.heightHint = imageData.height; //이미지의 크기에 맞춰 레이블의 세로크기 조정
lblImage.pack(); //설정된 값에 적용하여 레이블에 다시 그리기
shell.pack(); //변경된 상황을 적용하기 위해 프로그램에 다시 그리기
} catch (SWTException ex) {
lblImage.setText(There was an error loading the GIF);
}
}
}
public String getFileName(int prev_next) {
int currentFileNum = 0;
File src = new File(currentFile.substring(0,currentFile.lastIndexOf(\\)));
File[] fileList = src.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name){
return (name.endsWith(.gif) || name.endsWith(.jpg) ); //순서대로 이미지를 출력 (bmp파일은 제외 용량이 크므로)
}
}
);// 현재 열린 파일을 같은 폴더에 있는 이미지 파일들을 모두 이름 순으로 정렬한다
if(fileList == null) return null; //만약에 이미지 파일이 없다면 그냥 되돌아간다
else if(fileList.length == 1) return currentFile; //현재 폴더에 이미지 파일이 하나라면, 원래 파일을 다시 열어주고 돌아간다 for (int i = 0; i fileList.length; i++) { // 현재 폴더에 이미지 파일이 다수이면, 번호를 체크하면서 넘어간다
if(fileList[i].getAbsolutePath().compareToIgnoreCase(currentFile) == 0) {
currentFileNum = i;
}
}
if(currentFileNum + prev_next 0) {// 현재 열린 파일의 번호를 기준으로, 앞 뒤에 있는 파일의 번호를 계산후에, 파일명을 돌려준다
currentFile = fileList[fileList.length-1].getAbsolutePath();
} else if(currentFileNum + prev_next = fileList.length) {
currentFile = fileList[0].getAbsolutePath();
} else {
currentFile = fileList[currentFileNum + prev_next].getAbsolutePath();
}
return currentFile;
}
public static void main(String[] args) { //메인 메소드 시작
Image_Viewer viewer = new Image_Viewer();// 이미지 뷰어를 위해 만들어진 클래스의 인스턴스를 생성한다.
viewer.loadImageFile();// 생성된 인스턴스 viewer의 loadImageFile()메소드를 호출,(loadImageFile()메소드는 파일 불러오기 기능을 위해서 만들어진 메소드_
viewer.Run();// 생성된 인스턴스 viewer의 Run()메소드를 호출, (이미지 파일을 보여주고, 앞 또는 뒤에 있는 파일을 보여주는 역할을 하는 메소드)
}
}여기서 버튼 순서 바꾸기랑 크기 바꾸기를 질문 했었는습니다. 친절한 답변으로 인해서 순서 바꾸기는 해결하였는데요
버튼 크기緻?크기 바꾸는것은 griddata때문에 설정을 할수 없다고 하셔서 설정을 없애고 setsize()를 이용해서 바꾸려고 시도를 해봤는데
제가 자바를 처음 배우는 과정에서 맞은 과제인지라 어떻게 해야 할지 모르겠더라구요. 그래서 다시한번 도움을 받고자 이곳에
글을 올립니다. 저에겐 너무 어려워서 시도를 했다가 다시 복구만 시키는것도 너무 벅차네요 차근차근 알려주시면 감사하겠습니다.
-
아빠몬
먼저 SWT를 떠나 자바 GUI부터 살펴보시기를 권해드리고 싶습니다. 또한 API를 보는 것에 대해서도 익숙해져야 합니다. 자세히 API를 살펴보질 않아 모르겠지만, GridData 설정에서 widthHint와 heightHint에 상수값을 설정해주면 버튼의 크기가 달라져보입니다.
예를 들면, gridBtnFileOpen.heightHint = 50;라고 설정하면, 버튼의 높이가 50px로 설정되는군요...
번호 | 제 목 | 글쓴이 | 날짜 |
---|---|---|---|
2696504 | 플래시 위에 div 올리기 (5) | 큰꽃늘 | 2025-05-30 |
2696458 | 제가 만든 소스 한번 봐주시고 수정 할 꺼 있으면 말해주세요. (실행은 되지만 깜빡거리네요) | 이플 | 2025-05-29 |
2696434 | 퍼센트 레이아웃 질문인데요.. | 나츠 | 2025-05-29 |
2696372 | %=open_main%, %=open_sub% 가 뭘까요? (9) | 행복녀 | 2025-05-29 |
2696347 | 콘솔 프로그램 질문 | 상큼한캔디 | 2025-05-28 |
2696320 | c언어 scanf 함수를 이요해 문자열 입력 받을 시 질문 있습니다. | 슬아라 | 2025-05-28 |
2696292 | 익스플로러9이상에서만 이상한 보더가 보이는데 삭제할수 있나요? | 망고 | 2025-05-28 |
2696263 | 프로그래밍 공부시작 질문 (6) | 진이 | 2025-05-28 |
2696206 | SK2의 플래시를 밴치마킹하려고하는데요.. (1) | 비내리던날 | 2025-05-27 |
2696179 | ie7에서 사라지지가 않네요. (2) | 빛길 | 2025-05-27 |
2696150 | div에 스크롤 생기게 하려면... (2) | 에드가 | 2025-05-27 |
2696123 | 자료구조론 공부중인데 | 김자영 | 2025-05-26 |
2696094 | exe 파일 | 제철 | 2025-05-26 |
2696043 | 제이쿼리 .scroll() 관련 질문드립니다 | 이거이름임 | 2025-05-26 |
2695984 | 마크업상으로 하단에 있으나 우선적으로 이미지파일을 다운로드받는 방법 (1) | 들꿈 | 2025-05-25 |
2695934 | tr 속성값 (9) | 새 | 2025-05-25 |
2695905 | ASP로 개발됐을 때 css가 달라져요 ㅠㅠ (4) | 슬아라 | 2025-05-24 |
2695878 | form을 이용한 다른 페이지로 넘기는 방법을 알려주세요 (1) | 핫파랑 | 2025-05-24 |
2695844 | 저기 암호화 및 복호화 프로그램.. 만들어볼려는대 (2) | 한빛 | 2025-05-24 |
2695814 | [질문] PDA에서 애플릿이 가능한가요? (1) | 봄시내 | 2025-05-24 |