자바 팁 116 : 테이블 옵션 설정-런타임에!

JFC (Java Foundation Classes)는 스마트 한 대화 형 GUI (그래픽 사용자 인터페이스)를 구축하기위한 다양한 구성 요소를 제공합니다. javax.swing.JTable클래스를 사용하여 테이블 형식 데이터를 표시 할 수 있습니다 . 이 Java 팁에서는 몇 가지 일반적인 JTable문제 를 해결하는 방법을 조사합니다 .

먼저 초기 기본 JTable클래스를 정의하겠습니다 MyTable.

import javax.swing.table. *; import javax.swing. *; import java.awt. *; public class MyTable extends JTable {// default constructor public MyTable () {super (); } // 주어진 수의 행과 열로 테이블을 생성하는 생성자 public MyTable (int row, int col) {super (row, col); }}

아주 간단합니다! 초기 MyTable구현은 주식에 불과합니다 JTable.

다음 섹션에서는 JTable스크롤 막대, 열 너비, 선택 및 기타 속성과 같은 다양한 표시 옵션으로 작업 합니다. MyTable변경하려는 디스플레이 기능을 지원하는 다양한 방법을 확장 하고 통합 할 것입니다. 각 섹션은 MyTable클래스에 새로운 메서드를 추가 하므로 결국에는 완전히 재사용 가능한 JTable.

표 스크롤

먼저 우리 JTable를 사용 하여 표 형식의 데이터를 보여 봅시다 . 의 기능 TableColumnTest을 보여주기 위해 클래스를 만들었습니다 JTable.

import javax.swing.table. *; import javax.swing. *; import java.awt.event. *; import java.awt. *; / ** 저자 Sonal Goyal, [email protected] * / public class TableColumnTest {보호 된 JFrame 프레임; 보호 된 JScrollPane 스크롤 패널; 보호 된 MyTable 테이블; public TableColumnTest () {// (1) 테이블 모델을 생성합니다. DefaultTableModel dm = new DefaultTableModel (); // 각 열의 이름. String [] columnNames = { "이것은 정말 긴 열 머리글이 될 것입니다.", "열 B", "열 C", "열 D", "열 E", "열 F", "열 G", " H 열 ","I 열 ","J 열 "}; // 실제 데이터 값. Integer [] [] data = new Integer [8] [10]; // 데이터 매트릭스를 채 웁니다. for (int row = 0; row <8; row ++) {for (int col = 0; col <10;++ col) {data [row] [col] = new Integer (1000000); }} // 데이터 및 열 헤더로 모델을 구성합니다. dm.setDataVector (데이터, columnNames); // (2) 테이블을 만듭니다. 테이블 = new MyTable (); // (3) 모델을 테이블에 연결합니다. table.setModel (dm); // (4) 테이블의 스크롤 창을 만듭니다. scrollpane = new JScrollPane (테이블); // (5) 테이블을 표시합니다. 프레임 = new JFrame (); frame.getContentPane (). add (scrollpane); frame.setSize (200, 150); frame.setVisible (true); } public static void main (String [] args) {TableColumnTest test = new TableColumnTest (); }scrollpane = new JScrollPane (테이블); // (5) 테이블을 표시합니다. 프레임 = new JFrame (); frame.getContentPane (). add (scrollpane); frame.setSize (200, 150); frame.setVisible (true); } public static void main (String [] args) {TableColumnTest test = new TableColumnTest (); }scrollpane = new JScrollPane (테이블); // (5) 테이블을 표시합니다. 프레임 = new JFrame (); frame.getContentPane (). add (scrollpane); frame.setSize (200, 150); frame.setVisible (true); } public static void main (String [] args) {TableColumnTest test = new TableColumnTest (); }

데모 응용 프로그램은 매우 간단합니다. JTable다음을 수행하여 단순 을 구성합니다 .

  • TableModel행, 열, 열 머리글 및 실제 데이터에 대한 정보가 있는을 만들고 구성합니다 .

  • JTable모델의 데이터를 표시하는을 만들고 구성합니다 .

  • JTable첫 번째 단계에서 만든 모델에 연결

그러나이 첫 번째 코드 목록에는 비틀기가 있습니다. 스크롤 창이 4 단계에서 추가되었습니다. 구성 및 구성된 테이블을 JFrame; 스크롤 결과는 그림 1을 참조하십시오.

그림 1에서 볼 수 있듯이 열 머리글이나 테이블 데이터를 식별하는 것은 어렵습니다. 스크롤바를 추가했지만 가로 스크롤바가 나타나지 않습니다. JTable수업을 자세히 살펴보면 그 이유를 알 수 있습니다. 이 JTable클래스에는 자동 크기 조정 모드에 대한 속성이 있는데, 이는 테이블이 열 너비를 자동으로 조정하는지 (테이블의 전체 폭을 덮기 위해) 크기를 조정하는 방법을 결정합니다. 다음 값 중 하나를 사용할 수 있습니다.

  • AUTO_RESIZE_OFF : 열 너비를 자동으로 조정하지 않습니다. 스크롤바 사용
  • AUTO_RESIZE_NEXT_COLUMN : UI에서 열이 조정되면 다음 열을 반대로 조정합니다.
  • AUTO_RESIZE_SUBSEQUENT_COLUMNS : UI 조정 중에 총 너비를 유지하기 위해 후속 열을 변경합니다.
  • AUTO_RESIZE_LAST_COLUMN : 모든 크기 조정 작업 중에 마지막 열에 만 조정을 적용합니다.
  • AUTO_RESIZE_ALL_COLUMNS : 모든 크기 조정 작업 중에 모든 열의 크기를 비례 적으로 조정합니다.

기본적 JTable으로은 전체 모양을 유지하기 위해 다른 열의 크기를 조정합니다. 이는 그림 1을 설명합니다. 따라서 가로 스크롤 막대로 열을 표시 MyTable하려면 생성자에서 메서드를 추가 하고 호출합니다.

/ **이 방법은 필요할 때 가로 스크롤 막대를 표시합니다. * 여기에 제공된 두 생성자에서 호출됩니다. * / public void showHorScroll (boolean show) {if (show) {setAutoResizeMode (JTable.AUTO_RESIZE_OFF); } else {setAutoResizeMode (JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS); }}

그림 2는 보이는 수평 스크롤 막대가있는 디스플레이를 보여줍니다.

JTable 열 제어

열의 너비를 제어하고 크기를 조정할 수 없도록 만들 수 있습니다. 이 섹션에서는 방법을 보여줍니다.

더 넓은 열

종종 다른 열보다 더 넓거나 더 좁은 열을 원합니다. 열의 너비를 변경하려면 다음을 사용합니다 TableColumnModel.

/ **이 메서드는 pColumn 인덱스에있는 열을 pWidth 너비로 설정하기 위해 호출되어야합니다. * / public void setColumnWidth (int pColumn, int pWidth) {// 열 모델을 가져옵니다. TableColumnModel colModel = getColumnModel (); // 인덱스 pColumn에서 열을 가져 와서 선호하는 너비를 설정합니다. colModel.getColumn (pColumn) .setPreferredWidth (pWidth); }

버튼과 해당 작업 리스너를에 추가하여 버튼 JFrame을 클릭하면 테이블의 너비가 변경됩니다.

JButton resizeButton = new JButton ( "세 번째 열 크기 조정"); setResizeButton.addActionListener (this); public void actionPerformed (ActionEvent e) {// 클릭 된 버튼을 확인합니다. if (e.getActionCommand (). equals ( "세 번째 열 크기 조정")) {System.out.println ( "크기 조정 호출-세 번째 열 크기를 300으로 조정"); table.setColumnWidth (2, 300); // GUI 업데이트를 강제합니다. table.invalidate (); frame.invalidate (); frame.validate (); frame.repaint (); }

이 경우은 pColumn열 인덱스이며 pWidth새 너비 세트입니다. 크기 조정 버튼을 클릭하기 전과 후는 그림 3과 4에 나와 있습니다.

크기를 조정할 수없는 열

일반적으로 헤더를 끌어 열 크기를 조정할 수 있습니다. 다음 코드는 pIsResize. 경우 pIsResize에 해당하는 열은 크기를 조정할 수 있습니다; 그렇지 않으면 크기를 조정할 수 없습니다.

public void setResizable (int pColumn, boolean pIsResize) {// 열 모델을 가져옵니다. TableColumnModel colModel = getColumnModel (); // 크기 조정 가능 여부를 설정합니다. colModel.getColumn (pColumn) .setResizable (pIsResize); }

pColumn경우은 크기를 조정할 수없는 열의 인덱스입니다. 열 ( getColumn(..))을 가져오고 간단한 속성 ( setResizable(..))을 설정하기 만하면됩니다 .

열 선택

단일 셀이 아닌 버튼 클릭으로 전체 열을 선택하지 않는 이유는 무엇입니까? JTable표시 / 셀의 호출하여 세포를 해제 선택된 isCellSelected(int row, int col)방법. 이 메서드를 재정의하면 메서드에 매개 변수로 전달 된 부울 선택에 따라 원하는 결과를 얻을 수 있습니다 setSelect(). 참이면 열이 선택됩니다. 거짓이면 선택되지 않습니다. 핵심은 colSelect()이 열의 선택 여부를 나타내는 "select"플래그와 함께 열을로 저장하는 것입니다 .

int colSelect; 부울 선택; / ** select 값에 따라 index col의 열을 선택 또는 선택 취소 *로 설정합니다. * / public void setSelect (int col, boolean select) {colSelect = col; this.select = 선택; } / **이 메서드는 특정 셀이 선택되었는지 여부를 반환합니다. * / public boolean isCellSelected (int row, int column) throws IllegalArgumentException {// setSelect ()에 설정된 열에 대한 메서드 재정의 if (colSelect == column) {if (select) return true; 그렇지 않으면 거짓을 반환합니다. } else {return super.isCellSelected (row, column); }}

그림 5는 열 D가 선택된 결과를 보여줍니다.

제어 헤더

아시다시피 첫 번째 열의 열 머리글이 해당 열의 너비보다 깁니다. 열 너비를 재설정하여이 문제를 해결합니다.

/**Sets the header and column size as per the Header text */ public void setHeaderSize(int pColumn){ //Get the column name of the given column. String value = getColumnName(pColumn); //Calculate the width required for the column. FontMetrics metrics = getGraphics().getFontMetrics(); int width = metrics.stringWidth(value) + (2*getColumnModel().getColumnMargin()); //Set the width. setColumnWidth(pColumn, width); } 

With the above code executed, Figure 6 shows the result of the resized column header.

A feature-rich JTable

In this tip, we've tried various display options on a simple JTable, and changed those options after the table was displayed. In the process, we developed a table that offers richer user interaction capabilities. Explore the rest of JTable's features and find out which interesting ones you can create!

Sonal Goyal은 지난 3 년 동안 Java와 협력 해 왔습니다. 그녀는 인도에 기반을 둔 엔지니어이며 Java IO, JFC, CORBA, i18n 및 리플렉션을 사용하여 객체 지향 시스템의 설계 및 구현을 광범위하게 수행했습니다. John D. Mitchell은 JavaWorld의 Java Tips 코디네이터입니다.

이 주제에 대해 더 알아보기

  • 완성 된 TableColumnTest의 소스 코드

    //images.techhive.com/downloads/idge/imported/article/jvw/2001/09/tablecolumntest.java

  • 완성 된 MyTable의 소스 코드

    //images.techhive.com/downloads/idge/imported/article/jvw/2001/09/mytable.java

  • JTable API 문서보기

    //java.sun.com/j2se/1.3/docs/api/javax/swing/JTable.html

  • Swing JTable 튜토리얼을 찾아보십시오.

    //www.java.sun.com/docs/books/tutorial/uiswing/components/table.html

  • "Java Tip 102Add Multiple JTable Cell Editors per Column," Tony Colston (JavaWorld)

    //www.javaworld.com/javaworld/javatips/jw-javatip102.html

  • "Java Tip 77Enable Copy and Paste Functionality between Swing's JTables and Excel," Ashok Banerjee and Jignesh Mehta (JavaWorld)

    //www.javaworld.com/javaworld/javatips/jw-javatip77.html

  • For more on AWT/Swing, check out JavaWorld's Topical Index

    //www.javaworld.com/channel_content/jw-awt-index.shtml

  • For more on Foundation Classes, check out JavaWorld's Topical Index

    //www.javaworld.com/channel_content/jw-foundation-index.shtml

  • For more on User Interface Design, check out JavaWorld's Topical Index

    //www.javaworld.com/channel_content/jw-ui-index.shtml

  • View all previous Java Tips and submit your own

    //www.javaworld.com/javatips/jw-javatips.index.html

  • Learn Java from the ground up in JavaWorld's Java 101 column

    //www.javaworld.com/javaworld/topicalindex/jw-ti-java101.html

  • Java experts answer your toughest Java questions in JavaWorld's Java Q&A column

    //www.javaworld.com/javaworld/javaqa/javaqa-index.html

  • Sign up for JavaWorld's free weekly email newsletters

    //www.idg.net/jw-subscribe

  • .net의 자매 간행물에서 다양한 IT 관련 기사를 찾을 수 있습니다.

이 이야기는 "Java Tip 116 : 테이블 옵션 설정-런타임에!" 원래 JavaWorld에 의해 게시되었습니다.