[Java] JTable, JscrollPane을 사용한 스크롤 바 활성화

2023. 1. 16. 19:32프로그래밍

728x90

#자바를 사용해서, 특히 스윙을 사용해서 사용자 UI를 작성하다 보면 데이터베이스에서 가져온 데이터를 보여 주기 위해서 테이블 형태를 사용할 때가 많은 데, 우리가 보통 알고 있는 #JTable 클래스를 사용해서 다음의 순서대로 코드를 작성하곤 합니다.

1. JScrollPane 클래스와 JTable 클래스를 생성

보통 테이블 상의 내용이 많으니 스크롤을 사용하기 위해서 #JScrollPane 클래스를 함께 다음과 같이 사용하게 됩니다.

InfoScrollPane = new JScrollPane();
SearchResultTable = new JTable();
 

그런 다음, 다음과 같이 빈 테이블 모델을 정의하여 생성한 테이블에 붙이는 데요 형태는 다음과 비슷하게 되겠죠.

우선 빈 테이블 모델을 다음과 같이 만든다는 것이죠.

SearchResultTable.setModel(
   new DefaultTableModel(new Object[][] { {}, {}, {}, {} }, new String[] {})
);
 

그런 다음 해당 테이블을 JScrollPane의 setViewportView 메서드를 사용해서 테이블을 다음과 붙이면 작업이 우선 정리가 됩니다.

InfoScrollPane.setViewportView(SearchResultTable);
 

아마도 결과는 다음과 같은 UI 형태가 될 것입니다.

 

2. 테이블 데이터 생성 - 컬럼 명 정하기

우선, 컬럼 명이 정해 졌다면 해당 컬럼을 다음과 같이 테이블에 붙이게 됩니다.

MemberInfoModel getter/setter 클래스 내에다 문자 배열로 columnCount 만큼 정의한 COLUMN_NAMES_KOR 를 TableModel 객체에 addColumn 메서드를 사용해서 붙입니다.

DefaultTableModel tm = (DefaultTableModel) SearchResultTable.getModel();
tm.setRowCount(0);
 
// clear existing columns 
tm.setColumnCount(0);
 
// add specified columns to table
for (int i = 0; i < columnCount; i++ ) {
     tm.addColumn(MemberInfoModel.COLUMN_NAMES_KOR[i]);
}
 

그런 다음, 다음과 같이 가정을 해봅니다. 데이터베이스에 있는 MemberInfo 테이블에서 리스트 형태로 받아온 데이터를 MemberInfoModel로 저장 한다음 다음과 같이 해당 컬럼에 매칭이 되도록 합쳐 주면 됩니다.

뭐 이때는 위에서 정의한 컬럼 수와 addRow로 저장되는 개수가 정확히 일치 해야 될 것입니다.

for(List<MemberInfoModel> sModelList: sList)
{
   for(MemberInfoModel sModel: sModelList)
   {
      tm.addRow(sModel.COLUMNS());
   }
}
tm.fireTableDataChanged();
 

테이블에 결과 값이 들어온 경우에 결과 화면은 위와 같이 코딩하였을 경우, 아래 그림과 비슷할 것입니다.

분명한 사실은, 내가 원했던 형태와는 좀 달라 보인 다는 것이죠...

제대로 나와야 하는 데 ... 이 붙어버린 형태이니 말이죠.

 

 

사실, 위의 경우를 피하기 위해서 스크롤 클래스를 붙이는 건 데, 좀 아닌 듯한 느낌을 받은 UI가 되어 버린 듯한 느낌입니다.

 

3. 데이블 컬럼 길이 변경하기

아래와 같이 #setAutoResizeMode를 꺼 주기만 하면 된다고 합니다.

SearchResultTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 

참고 사이트:

ScrollPane 크기에 맞춰져서 위와 같은 경우가 나오기 때문에 setAutoResizeMode 메서드를 사용해서 해당 기능을 꺼주면 된다는 얘기 입니다.

 

결과물은 위의 모습보다 훨씬 잘 나온다는 것을 아래와 같이 확인 할 수 있었습니다.

 

그것과는 약간 별 개로 각 컬럼의 길이를 조정 할 수 있도록 JTable에서 제공 해 주는 메서드는 #setMinWidth 도 있습니다. 다음과 같은 코드를 넣어 주면 되는 데 일정하게 너비를 맞추는 것이라서 그냥 JTable 클래스에서 제공하는 기능에 갖다 맡겨 보는 것이 더 좋을 것 같다는 느낌이 있긴 하네요

for (int i = 0; i < columnCount; i++ ) {
   SearchResultTable.getColumnModel().getColumn(i).setMinWidth(70);
}
 

이상.

 

728x90