Tip Java 116: Setel opsi tabel Anda - saat runtime!

Java Foundation Classes (JFC) menawarkan beragam pilihan komponen untuk membangun antarmuka pengguna grafis (GUI) yang cerdas dan interaktif. Anda dapat menampilkan data tabel menggunakan javax.swing.JTablekelas. Dalam tip Java ini, kami akan menyelidiki cara menyelesaikan beberapa JTablemasalah umum .

Pertama, mari kita mendefinisikan awal, dasar kita JTablekelas, MyTable:

import javax.swing.table. *; import javax.swing. *; import java.awt. *; public class MyTable extends JTable {// konstruktor default public MyTable () {super (); } // konstruktor untuk membuat tabel dengan jumlah baris dan kolom tertentu public MyTable (int row, int col) {super (row, col); }}

Cukup mudah! MyTableImplementasi awal kami hanyalah stok JTable.

Di bagian berikut, kita akan bekerja dengan berbagai JTableopsi tampilan - seperti bilah gulir, lebar kolom, pilihan, dan atribut lainnya. Kami akan memperluas MyTabledan menggabungkan berbagai metode yang akan mendukung fitur tampilan yang ingin kami ubah. Setiap bagian menambahkan metode baru ke MyTablekelas, jadi pada akhirnya, kita akan memiliki metode yang benar-benar dapat digunakan kembali JTable.

Gulir tabel Anda

Pertama, mari gunakan kami JTableuntuk menampilkan beberapa data tabel. Saya telah membuat TableColumnTestkelas untuk menunjukkan JTablekemampuan:

import javax.swing.table. *; import javax.swing. *; import java.awt.event. *; import java.awt. *; / ** Penulis Sonal Goyal, [email protected] * / kelas publik TableColumnTest {bingkai JFrame dilindungi; scrollpane JScrollPane dilindungi; tabel MyTable terlindungi; public TableColumnTest () {// (1) Buat model tabel. DefaultTableModel dm = new DefaultTableModel (); // Nama untuk setiap kolom. String [] columnNames = {"Ini akan menjadi tajuk kolom yang sangat panjang", "Kolom B", "Kolom C", "Kolom D", "Kolom E", "Kolom F", "Kolom G", " Kolom H "," Kolom I "," Kolom J "}; // Nilai data aktual. Integer [] [] data = new Integer [8] [10]; // Isi matriks data. untuk (int baris = 0; baris <8; baris ++) {untuk (int col = 0; col <10;++ col) {data [row] [col] = new Integer (1000000); }} // Konfigurasi model dengan data dan judul kolom. dm.setDataVector (data, nama kolom); // (2) Buat tabel. table = new MyTable (); // (3) Hubungkan model ke tabel. table.setModel (dm); // (4) Buat panel gulir untuk tabel. scrollpane = new JScrollPane (tabel); // (5) Buat tabel terlihat. frame = 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 (tabel); // (5) Buat tabel terlihat. frame = 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 (tabel); // (5) Buat tabel terlihat. frame = new JFrame (); frame.getContentPane (). add (scrollpane); frame.setSize (200, 150); frame.setVisible (true); } public static void main (String [] args) {TableColumnTest test = new TableColumnTest (); }

Aplikasi demonstrasi cukup mudah. Kami membangun sederhana JTabledengan melakukan hal berikut:

  • Membuat dan mengonfigurasi TableModel, yang memiliki informasi tentang baris, kolom, tajuk kolom, dan data aktual

  • Buat dan konfigurasikan JTable, yang menampilkan data dari model

  • Hubungkan JTableke model yang dibuat pada langkah pertama

Tapi ada twist dalam daftar kode pertama ini: panel gulir ditambahkan pada langkah 4. Kami menampilkan tabel yang dibangun dan dikonfigurasi di dalam a JFrame; lihat Gambar 1 untuk hasil scroll.

Seperti yang ditunjukkan pada Gambar 1, sulit untuk membedakan header kolom atau data tabel. Meskipun kami telah menambahkan bilah gulir, bilah gulir horizontal tidak muncul. Melihat lebih dekat ke JTablekelas mengungkapkan alasannya. The JTablekelas memiliki atribut untuk mode auto-resize, yang menentukan apakah tabel secara otomatis mengubah ukuran lebar kolom (untuk menutupi seluruh lebar tabel) dan bagaimana melakukannya Resize itu. Ini dapat mengambil salah satu dari nilai berikut:

  • AUTO_RESIZE_OFF: Jangan mengatur lebar kolom secara otomatis; gunakan bilah gulir
  • AUTO_RESIZE_NEXT_COLUMN: Saat kolom disesuaikan di UI, sesuaikan kolom berikutnya dengan cara yang berlawanan
  • AUTO_RESIZE_SUBSEQUENT_COLUMNS: Selama penyesuaian UI, ubah kolom berikutnya untuk mempertahankan lebar total
  • AUTO_RESIZE_LAST_COLUMN: Selama semua operasi pengubahan ukuran, terapkan penyesuaian hanya pada kolom terakhir
  • AUTO_RESIZE_ALL_COLUMNS: Selama semua operasi pengubahan ukuran, mengubah ukuran semua kolom secara proporsional

Secara default, JTablemengubah ukuran kolom lain untuk mempertahankan tampilan keseluruhan, yang menjelaskan Gambar 1. Oleh karena itu, jika kita ingin menampilkan kolom dengan scroll bar horizontal, kita menambahkan metode MyTabledan memanggilnya dari konstruktor:

/ ** Metode ini menampilkan bilah gulir horizontal jika diperlukan. * Ini dipanggil dalam dua konstruktor yang disediakan di sini. * / public void showHorScroll (boolean show) {if (show) {setAutoResizeMode (JTable.AUTO_RESIZE_OFF); } lain {setAutoResizeMode (JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS); }}

Gambar 2 menunjukkan tampilan dengan scroll bar horizontal yang terlihat:

Mengontrol kolom JTable

Anda dapat mengontrol lebar kolom Anda, serta membuatnya tidak dapat diubah. Bagian ini menunjukkan caranya.

Kolom yang lebih lebar

Seringkali Anda menginginkan kolom lebih lebar atau lebih sempit dari yang lain. Untuk mengubah lebar kolom, Anda menggunakan TableColumnModel:

/ ** Metode ini harus dipanggil untuk menyetel kolom * pada indeks pColumn menjadi lebar pWidth. * / public void setColumnWidth (int pColumn, int pWidth) {// Dapatkan model kolom. TableColumnModel colModel = getColumnModel (); // Dapatkan kolom di indeks pColumn, dan atur lebar yang diinginkan. colModel.getColumn (pColumn) .setPreferredWidth (pWidth); }

Anda juga dapat menambahkan tombol dan pendengar aksinya ke JFrame, sehingga mengklik tombol tersebut mengubah lebar tabel:

JButton resizeButton = new JButton ("Ubah Ukuran Kolom Ketiga"); setResizeButton.addActionListener (ini); public void actionPerformed (ActionEvent e) {// Periksa tombol mana yang diklik. if (e.getActionCommand (). sama dengan ("Ubah Ukuran Kolom Ketiga")) {System.out.println ("Ubah ukuran yang dipanggil - ubah ukuran kolom ketiga menjadi 300"); table.setColumnWidth (2, 300); // Paksa pembaruan GUI. table.invalidate (); frame.invalidate (); frame.validate (); frame.repaint (); }

Dalam hal ini, pColumnadalah indeks kolom, dan pWidthmerupakan set lebar baru. Sebelum dan sesudah mengklik tombol Ubah ukuran ditunjukkan pada Gambar 3 dan 4.

Kolom yang tidak dapat diubah ukurannya

Untuk penggunaan umum, Anda dapat mengubah ukuran kolom dengan menyeret header. Kode berikut menghilangkan kemampuan untuk mengubah ukuran berdasarkan pIsResize. Jika pIsResizebenar, kolom dapat diubah ukurannya; jika tidak, itu tidak dapat diubah ukurannya:

public void setResizable (int pColumn, boolean pIsResize) {// Dapatkan model kolom. TableColumnModel colModel = getColumnModel (); // Atur resizable atau tidak. colModel.getColumn (pColumn) .setResizable (pIsResize); }

Dalam hal ini, pColumnadalah indeks dari kolom yang tidak dapat diubah. Mendapatkan kolom ( getColumn(..)) dan menyetel properti sederhana ( setResizable(..)) adalah semua yang perlu Anda lakukan.

Pilihan kolom

Mengapa tidak memilih seluruh kolom dengan mengklik tombol daripada satu sel? The JTablemenampilkan yang dipilih / terpilih sel dengan menelepon sel isCellSelected(int row, int col)metode. Mengganti metode ini memberi Anda hasil yang diinginkan, yang bergantung pada pemilihan boolean, yang diteruskan sebagai parameter ke setSelect()metode. Jika benar, kolom akan dipilih; jika salah, itu tidak akan dipilih. Kuncinya adalah menyimpan kolom sebagai colSelect(), dengan tanda "pilih" yang menunjukkan apakah kolom ini harus dipilih atau batal dipilih:

int colSelect; pilih boolean; / ** Set kolom di kolom indeks untuk dipilih atau batal dipilih * -berdasarkan nilai yang dipilih. * / public void setSelect (int col, boolean select) {colSelect = col; this.select = pilih; } / ** Metode ini mengembalikan apakah sel tertentu dipilih atau tidak. * / public boolean isCellSelected (int row, int column) melempar IllegalArgumentException {// menimpa metode untuk kumpulan kolom di setSelect () if (colSelect == column) {if (select) return true; jika tidak mengembalikan salah; } else {return super.isCellSelected (baris, kolom); }}

Gambar 5 menampilkan hasil pemilihan Kolom D.

Header kontrol

Seperti yang mungkin Anda perhatikan, tajuk kolom di kolom pertama lebih panjang dari lebar kolom tersebut. Kami mengatasi ini dengan mengatur ulang lebar kolom:

/ ** Menetapkan ukuran header dan kolom sesuai dengan Teks header * / public void setHeaderSize (int pColumn) {// Dapatkan nama kolom dari kolom tertentu. Nilai string = getColumnName (pColumn); // Hitung lebar yang dibutuhkan untuk kolom. Metrik FontMetrics = getGraphics (). GetFontMetrics (); int width = metrics.stringWidth (value) + (2 * getColumnModel (). getColumnMargin ()); // Atur lebarnya. setColumnWidth (pColumn, lebar); }

Dengan mengeksekusi kode di atas, Gambar 6 menunjukkan hasil dari header kolom yang diubah ukurannya.

JTable yang kaya fitur

Dalam tip ini, kami telah mencoba berbagai opsi tampilan secara sederhana JTable, dan mengubah opsi tersebut setelah tabel ditampilkan. Dalam prosesnya, kami mengembangkan tabel yang menawarkan kemampuan interaksi pengguna yang lebih kaya. Jelajahi JTablefitur-fitur lainnya dan cari tahu mana yang menarik yang dapat Anda buat!

Sonal Goyal telah bekerja dengan Java selama tiga tahun terakhir. Dia adalah seorang insinyur yang berbasis di India dan telah bekerja secara ekstensif pada desain dan implementasi sistem berorientasi objek menggunakan Java IO, JFC, CORBA, i18n, dan refleksi. John D. Mitchell adalah koordinator Java Tips untuk JavaWorld.

Pelajari lebih lanjut tentang topik ini

  • Kode sumber untuk TableColumnTest yang diselesaikan

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

  • Kode sumber untuk MyTable yang telah selesai

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

  • Lihat dokumentasi JTable API

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

  • Jelajahi tutorial Swing JTable di

    //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

  • Anda akan menemukan banyak artikel terkait TI dari publikasi saudara kita di .net

Kisah ini, "Tip Java 116: Setel opsi tabel Anda - saat runtime!" awalnya diterbitkan oleh JavaWorld.