상세 컨텐츠

본문 제목

자바 - swing JTable, JList 관련

JAVA/JAVA UI

by AlrepondTech 2011. 9. 6. 14:11

본문

반응형

 

 

 

 

 

=================================

=================================

=================================

 

 

 

 

jtable 자바 예제 링크

http://download.oracle.com/javase/tutorial/uiswing/components/table.html#combobox

 

 

=================================

=================================

=================================

 

 



JList, JTable 컨드롤 문서자료

RadCH08.pdf
다운로드

 

 

 

=================================

=================================

=================================

 

 



출처: http://javafreak.tistory.com/234

[Swing JTable] JTable 다루기 1

http 연결을 통해서 웹페이지 정보를 테이블에 출력하는 예제를 통해서 JTable의 다양한 요소들의 사용 방법을 확인해본다.

[그림1]구현할테이블

1. Bean 클래스 작성

웹페이지에 대한 http 요청을 보내서 서버 정보, 응답메세지, 웹페이지의 크기 등을 보여주는 bean 클래스를 아래와 같이 정의한다.

public class PageInfo {
    private String response;
    private String url;
    private String server;
    private long contentLength = 0L;
   
    private PageInfo(){}
    // getter, setter, hashCode, equals, toString() 생략....
}

HTTP 응답으로부터 읽어들일 수 있는 수많은 정보 중에 간략하게 위의 네가지 property만 지정해본다.

2. TableModel 작성

bean 클래스를 관리할 TableModel을 작성해야 하는데, 여기서는 javax.swing.table.AbstractTableModel 상속해서 구현하는 것만으로 충분하다.

public class PageTableModel extends AbstractTableModel{
   
    /**
     * 
     */

    private static final long serialVersionUID = 7932826462497464190L;
    private ArrayList<PageInfo> pages;

    public PageTableModel(){
        pages = new ArrayList<PageInfo>();
    }
    @Override
    public int getColumnCount() {
        return 4;
    }

    @Override
    public int getRowCount() {
        return pages.size();
    }
   
    public void addPageInfo(PageInfo page){
        int idx = pages.size();
        pages.add(page);
        fireTableRowsInserted(idx, idx); // 반드시 호출해야한다.
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        PageInfo info = pages.get(rowIndex);
        switch (columnIndex) {
        case 0 :
            return info.getServer();
        case 1 :
            return info.getResponse();
        case 2 :
            return info.getContentLength() ;
        case 3 :
            return info.getUrl();
        default :
                return "invalid";
        }
    }
}

bean 클래스인 PageInfo 타입의 인스턴스를 관리해야하므로

        private ArrayList<PageInfo> pages;

와 같이 array list 를 선언해준다.

그리고 addPageInfo(..) 를 호출했을 때 아래와 같이 리스너에 통보해주는 메소드를 같이 호출해주고 있다.

        fireTableRowsInserted(idx, idx);

idx 위치에 새로운 row가 추가되었음을 등록된 리스너들에게 알려준다. 이 메소드를 호출해주어야 view 레이어에서 통보를 받고 다시 table model로부터 색인값으로 데이터를 얻어내서 화면에 그려주게 된다. (AbstractTableModel을 상속한 것도, 만일 TableModel 인터페이스를 직접 구현한다면 리스너를 등록하거나 뷰 레이어에 직접 접근해야하는 등 할 일이 몇 배로 늘어난다. 가능하면 AbstractTableModel을 상속하는게 좋다.)

위에서는 getValueAt(int, int); 부분이 핵심적인 역할을 한다.

뷰 레이어에서 각각의 테이블 셀을 그릴때 getValueAt(int, int); 를 호출해서 모델 데이터를 가져간다. 뷰와 모델이 메세지를 주고받는 통로이기 때문에 각각의 column에 맞는 프로퍼티 값을 반환하도록 해준다.

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        PageInfo info = pages.get(rowIndex);
        switch (columnIndex) {
        case 0 :    return info.getServer();
        case 1 :    return info.getResponse();
        case 2 :    return info.getContentLength() ;
        case 3 :    return info.getUrl();
        default :    return "invalid";
        }
    }

row 는 array list 에서 쉽게 얻어낼 수 있고 리스트에서 얻어낸 PageInfo 인스턴스에서 column에 맞게 적절한 getter 메소드를 호출해주면 (row, column) 좌표에 맞는 값을 반환할 수 있다.

그리고 PageInfo 에는 네 개의 property가 정의되어 있으므로 테이블에도 출력할 column의 개수가 네 개로 서로 일치하는게 이치에 맞을 듯하나, 여기서는 TableColumn 정보를 완전하게 제공하므로 이 메소드가 호출될 일이 없다.

TableModel.getColumnCount() 는 사용자가 TableColumn 정보를 제공하지 않았을때 호출된다.

모델의 데이터를 출력하려면 당연히 column 정보를 알야하는데 사용자가 제공하지 않았으니 JTable이 어떻게든 TableColumn 을 만들려고 시도하고, column의 개수를 알아내기 위해서 TableModel.getColumnCount()를 호출한다.column의 개수를 얻어낸 후 그만큼 TableColumn 인스턴스를 만든 후 이 column들을 TableColumnModel에 등록한다.

그러니까 JTable과 TableModel, 그리고 TableColumnModel 모두 getColumnCount() 메소드가 있는데 이 중에서 TableModel.getColumnCount()만이 column을 초기화할때 사용된다.(위에서 말했듯이 사용자가 제대로된 TableColumn을 제공해주면 TableModel.getColumnCount() 는 호출될 일이 없다.)

[그림2]TableColumnModel은 View, TableModel은 Model에 해당

JTable 자체가 워낙에 복잡하다보니까 사용자가 혹시 api 에 익숙치 않아서 TableColumn 을 제대로 제공하지 못할 경우 JTable이 임시 방편으로 일단 출력이나 제대로 되게 해놓자... 뭐 이런 뜻이 담겨 있는 것이다.

JTable을 만들때 table model과 table column model(TableColumn을 관리하는 역할)을 제대로 제공해주면 신경쓰지 않아도 되는 메소드 구현이 바로 TableModel.getColumnCount()이다.(하지만 프로퍼티 개수와 맞추줘서 나쁠건 없으니 네 개로 지정해준 것 뿐..)

http 프로토콜로 페이지를 요청하면 응답이 올때마다 PageInfo 인스턴스를 생성하고 이것을 아래와 같이 table model에 추가해주면 자동으로 테이블에 페이지 정보가 출력된다.(MVC모델의 메커니즘)

    PageInfo page = createPageInfo("http://javafreak.tistory.com/222");
    pageTableModel.add(page);

MVC에서 모델 부분에 대한 첫번째 구현은 이걸로 끝이다. 일단은 화면에 보여주는 기능만을 구현하고 있어서 나중에 테이블에서 직접 데이터를 수정하려고 할 때에 별도로 구현해야할 메소드가 몇 개 있을 뿐이다.

3. TableColumn 작성

TableColumn의 역할은 View 레이어에서 각각의 테이블 셀을 그릴때 "붓" 역할을 할 renderer와 editor 를 제공해준다. 또한 현재 column의 너비값과 테이블 헤더에 출력된 헤더 정보도 제공한다.

PageInfo에 정의된 네 개의 프로퍼티를 보여줄 것이므로 TableColumn도 네 개를 작성할 것이다. 그런데 PageInfo의 프로퍼티 타입이 String과 long 이어서 별도의 renderer를 지정할 필요는 없다.(JTable 내에서 기본적으로 제공되고 있어서 딱히 손댈게 없음).

그래도 Money라든가 다른 동적인 renderer를 제공해주어야 할 때 다음과 같이 TableColumn을 작성하고 setCellRenderer, setCellEditor 로 등록해주면 사용자가 할 일은 끝이다.

    TableModel model = new PageTableModel();
    TableColumnModel columnModel = new DefaultTableColumnModel();
    TableCellRenderer renderer = new DefaultTableCellRenderer() ; // 기본구현

    TableColumn column = new TableColumn(0);
    column.setCellRenderer(renderer); // 이렇게 하지 않아도 알아서 제공된다.
    column.setHeaderValue("SERVER");
    columnModel.addColumn(column);
   
    column = new TableColumn(1);
    column.setHeaderValue("RESPONSE");
    columnModel.addColumn(column);
   
    column = new TableColumn(2);
    column.setCellRenderer(renderer);
    column.setHeaderValue("LENGTH");
    columnModel.addColumn(column);
   
    column = new TableColumn(3);
    column.setCellRenderer(renderer);
    column.setHeaderValue("URL");
   
    columnModel.addColumn(column);
   
    table = new JTable(model, columnModel);

위와같이 각 TableColumn에 column index 를 지정해주고 헤더 메세지를 지정해주면 현재 구현에서 더 할 일은 없다.

4. Page 정보 읽어오기

특정 웹페이지 주소를 통해서 응답 헤더 정보를 얻어내서 PageInfo 인스턴스를 생성하는 코드는 아래와 같다.

    public void addPageInfo(String httpUrl){
        // ex) "http://javafreak.tistory.com/215" 와 같은 값
        try {
            URL url = new URL(httpUrl);
            HttpURLConnection.setFollowRedirects(false);//300대 메세지를 보기 위해 설정
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("HEAD"); // 헤더 정보만 읽어온다
            Map < String, List < String >> fields = conn.getHeaderFields();
            Map < String, List < String >> clone = new HashMap<String, List<String>>();
            Iterator<String> it = fields.keySet().iterator();
            System.out.println(it.getClass().getName());
            while ( it.hasNext()){
                String key = it.next();
                clone.put((key == null ? key : key.toLowerCase()), fields.get(key));
            }
            List<String> host = Arrays.asList(httpUrl);
            clone.put("host", host);
            System.out.println("PROP: " + clone);
           
            PageInfo info = PageInfo.createPageInfo(clone);
            System.out.println("page info : " + info);
            model.addPageInfo(info);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
public class PageInfo {
    public static PageInfo createPageInfo(Map<String, List<String>> httpResponse){
        PageInfo info = new PageInfo();
        List<String> values = null;
        values = httpResponse.get(null);
        if ( values != null ) info.response = values.get(0); // base
       
        values = httpResponse.get("content-length");
        if ( values != null )
            info.contentLength = Long.parseLong(values.get(0));
       
        values = httpResponse.get("host");
        if ( values != null){
            info.url = values.get(0);
        }
        values = httpResponse.get("server");
        if ( values != null)
            info.server = values.get(0);
        return info;
    }
    ...

여기서 중요한 부분은 아니니 자세한 설명은 생략한다.

5. TableCellRenderer 설정

위의 코드를 조합하면 아래 그림과 같은데 응답 코드가 밋밋해서 눈에 잘 들어오질 않는다.

[그림3]404, 302같은 응답 코드가 눈에 잘 보였으면 좋을

위에서 TableColumn에 기본 renderer 를 전달해줬기 때문인데, renderer를 약간만 변형해서 200이 아닌 코드의 글자 색을 바꿔주는 게 좋을 듯 하다.

public class StatusCodeRenderer implements TableCellRenderer {

    private JLabel label ;
    /**
     * 4XX대 코드에서 보여줄 글자색
     */

    private ColorUIResource rs400 = new ColorUIResource(0xff, 0x0, 0x0);
    /**
     * 3XX대 코드에서 보여줄 글자색
     */

    private ColorUIResource rs300 = new ColorUIResource(0xaa, 0x5a, 0xff);
   
    public StatusCodeRenderer(){
        this.label = new JLabel();
        this.label.setOpaque(true);
        this.label.setBorder(new EmptyBorder(new Insets(5, 5, 5, 5)));
        System.out.println("created StatusCodeRenderer");
    }
   
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
        Color fg = UIManager.getColor("Table.foreground");
        Color bg = UIManager.getColor("Table.background");
       
        if ( isSelected ){
            fg = UIManager.getColor("Table.selectionForeground");
            bg = UIManager.getColor("Table.selectionBackground");
        }
        // "HTTP1.1/ XXX [RS MESSAGE] 에서 응답 코드 XXX만 추출
        int rsCode = Integer.parseInt(value.toString().substring(9, 12));
        if ( rsCode >= 400 ){
            fg = rs400;
        }
        else if ( rsCode >= 300){
            fg = rs300;
        }
       
        label.setBackground(bg);
        label.setForeground(fg);
        label.setText(value.toString());
        label.setFont(table.getFont());
        return label;
    }

}

그리고 위의 renderer를 response 메세지를 보여주는 TableColumn에 등록해준다.

    TableColumn column = new TableColumn(1);
    column.setCellRenderer(new StatusCodeRenderer());
    column.setHeaderValue("RESPONSE");
    columnModel.addColumn(column);

이제 [그림1]과 같이 응답 코드에 따라서 글자색이 다르게 나온다. 이것을 활용하면 전체 행의 색깔도 다르게 지정해줄 수가 있다.


 

=================================

=================================

=================================

 

 

[JAVA/Swing] JTable에서 DefaultTableModel을 사용한 경우, 원하는 Column에 이미지 넣기

AbstractTableModel을 상속받아 사용하는 경우는 Object 배열에 ImageIcon 형식으로 바로 지정하면,
이미지가 출력되는데,
DefaultTableModel을 상속받아 사용하는 경우는 아래와 같이 getColumnClass를 override해야 제대로 이미지가 보여짐.

 public class MyTableModel extends DefaultTableModel
{
     // ~ 중략

    @Override
    public Class getColumnClass(int columnIndex)
    {
        final int imageIndex = 0;  // 원하는 컬럼 인덱스
        return columnIndex == imageIndex ? ImageIcon.class: Object.class;
    }
}

기타, Renderer를 적용하는 방법 등도 다양한데, 위 방법이 제일 간단...^^

 

 

=================================

=================================

=================================

 

 

import javax.swing.table.AbstractTableModel;
import javax.swing.event.*;
import java.util.*;

public class RoomListModel extends AbstractTableModel{
 
 private Object data[][]={};
 
 //Column의 Header 를 정의.
 private String header[] = {};
 
 public RoomListModel() {
  // TODO: Add your code here
 }
 
 public RoomListModel(Object [][] data) {
  this.data = data;
 }
 
 public RoomListModel(String [] header) {
  
  this.header = header;
  
 }
 
 public String getColumnName(int col){
  return header[col];
 }
 
 public int getRowCount(){
  return data.length; 
 }
 
 public int getColumnCount(){
  return header.length;
 }
 
 public void setValue(Object data[][]){
  this.data = data;
  
 }
 
 public void setHeaderName(String [] header){
  this.header = header;
 }
 
 public boolean isCellEditable(int rowIndex,int columnIndex){
  return false; 
 }
 
 public Object getValueAt(int row, int col){
  return data[row][col]; 
 }

  
 public void setValueAt(Object aValue,int row,int col){
  data[row][col] = aValue; 
 }
 /**
  * 반드시 정의해줘야 하는 메소드
  * ImageIcon을 뿌려줄려면 반드시 오버라이딩 한다.
  */
 public Class getColumnClass(int c){ return getValueAt(0,c).getClass();}
 
}

여기 보시면. AbstractTableModel 를 상속 받아 몇가지를 오버라이딩 했는데요..

 

위에서 보시면 아시다시피..배열의 값을 변경할수 있더록 생성자를 만들었고..

 

나머지는 그냥 보시면 아시겠죠..??? Object타입의 데이타를 받아서..그에맞는..

 

랜더링을 하기위해... public Class getColumnClass(int c) 메소드는 반드시..

 

오버라이딩..해주세요...아셨죠...그리고 또 꼭 해야하는 메소드는...public int getRowCount()public int getColumnCount()public void setValue(Object data[][])public void setHeaderName(String [] header)public Object getValueAt(int row, int col) 들은 반드시..오버라이딩을 해주셔야 합니다...

 

첨부파일로 자바파일 올리니까..함 보세요..^^

 

 

 

 

반응형

 

728x90

 

 

=================================

=================================

=================================

 

 



[JTable] RowHeader 예제

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;


/**
 * @version 1.0 11/09/98
 */
 
class RowHeaderRenderer extends JLabel implements ListCellRenderer {
 
  RowHeaderRenderer(JTable table) {
    JTableHeader header = table.getTableHeader();
    setOpaque(true);
    setBorder(UIManager.getBorder("TableHeader.cellBorder"));
    setHorizontalAlignment(CENTER);
    setForeground(header.getForeground());
    setBackground(header.getBackground());
    setFont(header.getFont());
  }
 
  public Component getListCellRendererComponent( JList list,
         Object value, int index, boolean isSelected, boolean cellHasFocus) {
    setText((value == null) ? "" : value.toString());
    return this;
  }
}

public class RowHeaderExample extends JFrame {

  public RowHeaderExample() {
    super( "Row Header Example" );
    setSize( 300, 150 );
       
    ListModel lm = new AbstractListModel() {
      String headers[] = {"a", "b", "c", "d", "e", "f", "g", "h", "i"};
      public int getSize() { return headers.length; }
      public Object getElementAt(int index) {
        return headers[index];
      }
    };

    DefaultTableModel dm = new DefaultTableModel(lm.getSize(),10);
    JTable table = new JTable( dm );
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
   
    JList rowHeader = new JList(lm);   
    rowHeader.setFixedCellWidth(50);
   
    rowHeader.setFixedCellHeight(table.getRowHeight()
                               + table.getRowMargin());
//                             + table.getIntercellSpacing().height);
    rowHeader.setCellRenderer(new RowHeaderRenderer(table));

    JScrollPane scroll = new JScrollPane( table );
    scroll.setRowHeaderView(rowHeader);
    getContentPane().add(scroll, BorderLayout.CENTER);
  }

  public static void main(String[] args) {
    RowHeaderExample frame = new RowHeaderExample();
    frame.addWindowListener( new WindowAdapter() {
      public void windowClosing( WindowEvent e ) {
 System.exit(0);
      }
    });
    frame.setVisible(true);
  }
}



 

=================================

=================================

=================================

 

 

Setting Grid Line Properties in a JTable Component

JTable table = new JTable();  // Add data here  // Show both horizontal and vertical grid lines (the default) table.setShowGrid(true);  // Don't show any grid lines table.setShowGrid(false);  // Show only vertical grid lines table.setShowGrid(false); table.setShowVerticalLines(true);  // Show only horizontal grid lines table.setShowGrid(false); table.setShowHorizontalLines(true);  // Set the grid color table.setGridColor(Color.red);
 //-------------------------
 
 출처 : http://blog.naver.com/PostView.nhn?blogId=nakbc&logNo=10005410679&redirect=Dlog&widgetTypeCall=true

◆ 행, 열 및 셀 선택 모드

    a. 행 선택 (Row Selection Mode)

        - 특정 셀이 선택되었을 때, 동일한 행에 있는 나머지 셀들이 전부 선택

        - JTable의 기본 동작

        - table.getRowSelectionAllowed(), table.setRowSelectionAllowed()

 

    b. 열 선택 (Column Selection Mode)

        - 특정 셀이 선택되었을 때, 동일한 열에 있는 나머지 셀들이 전부 선택

        - table.getColumnSelectionAllowed(), table.setRowSelectionAllowed()

 

   c. 셀 선택 (Cell Selection Mode)

        - 오직 선택한 셀만 선택

        - table.getCellSelectionAllowed(), table.setCellSelectionAllowed()

 

행, 열 및 셀 선택모드는 조합해서 사용할 수 있으나,

셀 선택 모드는 다른 두 개의 모두를 false로써 간주한다.

 

따라서 이들 조합에 대한 경우의 수는 5개가 된다.

 

1. 행 선택 모드만 사용

2. 열 선택 모드만 사용

3. 행 과 열 선택 모드 사용

4. 셀 선택 모드 사용

5. 모든 선택 모드 미사용

 

◆ 리스트 선택 모드

    a. 다중 구간 선택 모드 (Multiple Interval Selection Mode)

    b. 단일 구간 선택 모드 (Single Interval Selection Mode)

    c. 단일 선택 모드 (Single Selection Mode)

 

 

정리하면, 셀을 선택했을 경우 테이블에서 반응하는 선택모드는 모두 15가지가 된다.


 
 //------------------------
 
 
 
 
 jtable  체크박스 넣기 
 
 //출처:  http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040201&docId=72371839&qb=anRhYmxlIOq4gOyekCBjZW50ZXI=&enc=utf8&section=kin&rank=1&search_sort=0&spq=0&pid=gFEMoF5Y7vwsstgVcXlssc--182114&sid=TnmOohyAeU4AABTsCNk

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

public class JTableTesterII extends JFrame {
 private final Object [] colNames = {"ChkBox","이름","나이","성별"};
 private Object [][] datas = {{false,"홍길동","20","남"},{true,"김말자","18","여"}};

 public JTableTesterII(){
  super("JTable Tester");  
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  JPanel panel = new JPanel(new BorderLayout());
   DefaultTableModel dtm = new DefaultTableModel(datas, colNames);
   JTable table = new JTable(dtm);
  

 table.getColumn("ChkBox").setCellRenderer(dcr);
   JCheckBox box = new JCheckBox();
   box.setHorizontalAlignment(JLabel.CENTER);
   table.getColumn("ChkBox").setCellEditor(new DefaultCellEditor(box));

   JScrollPane jsp = new JScrollPane(table);
   panel.add(jsp,"Center");
  setContentPane(panel);
  pack();
  setVisible(true);
 }
 
 public static void main(String[] args) {  
  new JTableTesterII();
 }
 DefaultTableCellRenderer dcr = new DefaultTableCellRenderer()
 {
  public Component getTableCellRendererComponent  // 셀렌더러
   (JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
  {
   JCheckBox box= new JCheckBox();
   box.setSelected(((Boolean)value).booleanValue());   
   box.setHorizontalAlignment(JLabel.CENTER);
   return box;
  }
 };
}

출처: http://happy2ni.egloos.com/2838179
 

JTable 칼럼사이즈 조절

/*
* TableRenderDemo.java requires no other files.
*/
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridLayout;
/**
* TableRenderDemo is just like TableDemo, except that it
* explicitly initializes column sizes and it uses a combo box
* as an editor for the Sport column.
*/
public class TableRenderDemo extends JPanel {
private boolean DEBUG = false;
public TableRenderDemo() {
super(new GridLayout(1,0));
JTable table = new JTable(new MyTableModel());
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
//Create the scroll pane and add the table to it.
JScrollPane scrollPane = new JScrollPane(table);
//Set up column sizes.
initColumnSizes(table);
//Fiddle with the Sport column's cell editors/renderers.
setUpSportColumn(table, table.getColumnModel().getColumn(2));
//Add the scroll pane to this panel.
add(scrollPane);
}
/*
* This method picks good column sizes.
* If all column heads are wider than the column's cells'
* contents, then you can just use column.sizeWidthToFit().
*/
private void initColumnSizes(JTable table) {
MyTableModel model = (MyTableModel)table.getModel();
TableColumn column = null;
Component comp = null;
int headerWidth = 0;
int cellWidth = 0;
Object[] longValues = model.longValues;
TableCellRenderer headerRenderer =
table.getTableHeader().getDefaultRenderer();
for (int i = 0; i < 5; i++) {
column = table.getColumnModel().getColumn(i);
comp = headerRenderer.getTableCellRendererComponent(
null, column.getHeaderValue(),
false, false, 0, 0);
headerWidth = comp.getPreferredSize().width;
comp = table.getDefaultRenderer(model.getColumnClass(i)).
getTableCellRendererComponent(
table, longValues[i],
false, false, 0, i);
cellWidth = comp.getPreferredSize().width;
if (DEBUG) {
System.out.println("Initializing width of column "
+ i + ". "
+ "headerWidth = " + headerWidth
+ "; cellWidth = " + cellWidth);
}
//XXX: Before Swing 1.1 Beta 2, use setMinWidth instead.
column.setPreferredWidth(Math.max(headerWidth, cellWidth));
}
}
public void setUpSportColumn(JTable table,
TableColumn sportColumn) {
//Set up the editor for the sport cells.
JComboBox comboBox = new JComboBox();
comboBox.addItem("Snowboarding");
comboBox.addItem("Rowing");
comboBox.addItem("Knitting");
comboBox.addItem("Speed reading");
comboBox.addItem("Pool");
comboBox.addItem("None of the above");
sportColumn.setCellEditor(new DefaultCellEditor(comboBox));
//Set up tool tips for the sport cells.
DefaultTableCellRenderer renderer =
new DefaultTableCellRenderer();
renderer.setToolTipText("Click for combo box");
sportColumn.setCellRenderer(renderer);
}
class MyTableModel extends AbstractTableModel {
private String[] columnNames = {"First Name",
"Last Name",
"Sport",
"# of Years",
"Vegetarian"};
private Object[][] data = {
{"Mary", "Campione",
"Snowboarding", new Integer(5), new Boolean(false)},
{"Alison", "Huml",
"Rowing", new Integer(3), new Boolean(true)},
{"Kathy", "Walrath",
"Knitting", new Integer(2), new Boolean(false)},
{"Sharon", "Zakhour",
"Speed reading", new Integer(20), new Boolean(true)},
{"Philip", "Milne",
"Pool", new Integer(10), new Boolean(false)}
};
public final Object[] longValues = {"Sharon", "Campione",
"None of the above",
new Integer(20), Boolean.TRUE};
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.length;
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
return data[row][col];
}
/*
* JTable uses this method to determine the default renderer/
* editor for each cell. If we didn't implement this method,
* then the last column would contain text ("true"/"false"),
* rather than a check box.
*/
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
/*
* Don't need to implement this method unless your table's
* editable.
*/
public boolean isCellEditable(int row, int col) {
//Note that the data/cell address is constant,
//no matter where the cell appears onscreen.
if (col < 2) {
return false;
} else {
return true;
}
}
/*
* Don't need to implement this method unless your table's
* data can change.
*/
public void setValueAt(Object value, int row, int col) {
if (DEBUG) {
System.out.println("Setting value at " + row + "," + col
+ " to " + value
+ " (an instance of "
+ value.getClass() + ")");
}
data[row][col] = value;
fireTableCellUpdated(row, col);
if (DEBUG) {
System.out.println("New value of data:");
printDebugData();
}
}
private void printDebugData() {
int numRows = getRowCount();
int numCols = getColumnCount();
for (int i=0; i < numRows; i++) {
System.out.print(" row " + i + ":");
for (int j=0; j < numCols; j++) {
System.out.print(" " + data[i][j]);
}
System.out.println();
}
System.out.println("--------------------------");
}
}
/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.
*/
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("TableRenderDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Create and set up the content pane.
TableRenderDemo newContentPane = new TableRenderDemo();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
 
 

 

=================================

=================================

=================================

 

 

반응형


관련글 더보기

댓글 영역