Petua Java 116: Tetapkan pilihan jadual anda - pada waktu runtime!

Java Foundation Classes (JFC) menawarkan banyak pilihan komponen untuk membina antara muka pengguna grafik (GUI) yang pintar dan interaktif. Anda boleh memaparkan data jadual menggunakan javax.swing.JTablekelas. Dalam petua Java ini, kami akan menyiasat bagaimana menyelesaikan beberapa JTablemasalah umum .

Pertama, mari kita menentukan, asas awal kami JTablekelas, MyTable:

import javax.swing.table. *; import javax.swing. *; import java.awt. *; kelas awam MyTable memperluas JTable {// default default public MyTable () {super (); } // konstruktor untuk membuat jadual dengan bilangan baris dan lajur yang diberi MyTable awam (int baris, int col) {super (baris, col); }}

Cukup sederhana! MyTablePelaksanaan awal kami hanyalah stok JTable.

Di bahagian berikut, kami akan bekerja dengan pelbagai JTablepilihan paparan - seperti bar tatal, lebar lajur, pemilihan, dan atribut lain. Kami akan memperluas MyTabledan menggabungkan pelbagai kaedah yang akan menyokong ciri paparan yang ingin kami ubah. Setiap bahagian menambah kaedah baru ke MyTablekelas, jadi pada akhirnya, kita akan dapat menggunakan sepenuhnya JTable.

Tatal jadual anda

Pertama, mari kita gunakan JTableuntuk menunjukkan beberapa data jadual. Saya telah membuat TableColumnTestkelas untuk menunjukkan JTablekemampuan:

import javax.swing.table. *; import javax.swing. *; import java.awt.event. *; import java.awt. *; / ** Pengarang Sonal Goyal, [email protected] * / kelas awam TableColumnTest {bingkai JFrame yang dilindungi; scrollpane JScrollPane yang dilindungi; jadual MyTable yang dilindungi; public TableColumnTest () {// (1) Buat model jadual. DefaultTableModel dm = baru DefaultTableModel (); // Nama untuk setiap lajur. String [] columnNames = {"Ini akan menjadi tajuk lajur yang sangat panjang", "Lajur B", "Lajur C", "Lajur D", "Lajur E", "Lajur F", "Lajur G", " Lajur H "," Lajur I "," Lajur J "}; // Nilai data sebenar. Integer [] [] data = Integer baru [8] [10]; // Isi matriks data. untuk (int baris = 0; baris <8; baris ++) {untuk (int col = 0; col <10;++ col) {data [baris] [col] = Integer baru (1000000); }} // Konfigurasikan model dengan tajuk data dan lajur. dm.setDataVector (data, columnNames); // (2) Buat jadual. jadual = MyTable baru (); // (3) Sambungkan model ke jadual. table.setModel (dm); // (4) Buat panel tatal untuk jadual. scrollpane = JScrollPane baru (jadual); // (5) Jadikan jadual kelihatan. bingkai = JFrame baru (); frame.getContentPane (). tambahkan (scrollpane); frame.setSize (200, 150); frame.setVisible (benar); } public static void main (String [] args) {TableColumnTest test = baru TableColumnTest (); }scrollpane = JScrollPane baru (jadual); // (5) Jadikan jadual kelihatan. bingkai = JFrame baru (); frame.getContentPane (). tambahkan (scrollpane); frame.setSize (200, 150); frame.setVisible (benar); } public static void main (String [] args) {TableColumnTest test = baru TableColumnTest (); }scrollpane = JScrollPane baru (jadual); // (5) Jadikan jadual kelihatan. bingkai = JFrame baru (); frame.getContentPane (). tambahkan (scrollpane); frame.setSize (200, 150); frame.setVisible (benar); } public static void main (String [] args) {TableColumnTest test = baru TableColumnTest (); }

Aplikasi demonstrasi cukup mudah. Kami membina yang mudah JTabledengan melakukan perkara berikut:

  • Buat dan konfigurasikan TableModel, yang mempunyai maklumat tentang baris, lajur, tajuk lajur, dan data sebenarnya

  • Buat dan konfigurasikan JTable, yang memaparkan data dari model

  • Sambungkan JTableke model yang dibuat pada langkah pertama

Tetapi ada kelainan dalam penyenaraian kod pertama ini: panel tatal ditambahkan pada langkah 4. Kami memaparkan jadual yang dibina dan dikonfigurasi di dalam JFrame; lihat Rajah 1 untuk hasil tatal.

Seperti yang ditunjukkan dalam Rajah 1, sukar untuk mengetahui tajuk tajuk atau data jadual. Walaupun kami telah menambah bar tatal, bar tatal mendatar tidak muncul. Tinjauan JTablekelas yang mendalam menunjukkan mengapa. The JTablekelas mempunyai sifat untuk memasuki mod auto-resize, yang menentukan jika jadual secara automatik mengubah saiz lebar lajur (untuk meliputi seluruh lebar jadual) dan bagaimana ia Saiz semula itu. Ini dapat mengambil salah satu nilai berikut:

  • AUTO_RESIZE_OFF: Jangan sesuaikan lebar lajur secara automatik; gunakan bar tatal
  • AUTO_RESIZE_NEXT_COLUMN: Apabila lajur diselaraskan di UI, sesuaikan lajur seterusnya dengan cara sebaliknya
  • AUTO_RESIZE_SUBSEQUENT_COLUMNS: Semasa penyesuaian UI, ubah lajur berikutnya untuk mengekalkan lebar keseluruhan
  • AUTO_RESIZE_LAST_COLUMN: Semasa semua operasi mengubah saiz, gunakan penyesuaian pada lajur terakhir sahaja
  • AUTO_RESIZE_ALL_COLUMNS: Semasa semua operasi mengubah saiz, ubah saiz semua lajur

Secara lalai, JTablepengubah saiz lajur lain untuk mengekalkan penampilan keseluruhan, yang menerangkan Rajah 1. Oleh itu, jika kita mahu memaparkan lajur dengan bar tatal mendatar, kita menambah kaedah MyTabledan memanggilnya dari pembina:

/ ** Kaedah ini menunjukkan bar tatal mendatar apabila diperlukan. * Ini dipanggil dalam dua pembina yang disediakan di sini. * / public void showHorScroll (pertunjukan boolean) {if (tunjukkan) {setAutoResizeMode (JTable.AUTO_RESIZE_OFF); } lain {setAutoResizeMode (JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS); }}

Gambar 2 menunjukkan paparan dengan bar tatal mendatar yang kelihatan:

Mengawal lajur JTable

Anda boleh mengawal lebar lajur anda, dan menjadikannya tidak boleh disusun semula. Bahagian ini menunjukkan kepada anda bagaimana.

Lajur yang lebih luas

Selalunya anda mahu lajur lebih luas atau lebih sempit daripada yang lain. Untuk menukar lebar lajur, anda menggunakan TableColumnModel:

/ ** Kaedah ini harus dipanggil untuk menetapkan lajur * pada pColumn index ke lebar pWidth. * / public void setColumnWidth (int pColumn, int pWidth) {// Dapatkan model lajur. TableColumnModel colModel = getColumnModel (); // Dapatkan lajur di indeks pColumn, dan tetapkan lebar pilihannya. colModel.getColumn (pColumn) .setPreferredWidth (pWidth); }

Anda juga dapat menambahkan butang dan pendengar tindakannya ke JFrame, sehingga mengklik butang mengubah lebar meja:

JButton resizeButton = JButton baru ("Ubah saiz Lajur Ketiga"); setResizeButton.addActionListener (ini); public void actionPerformed (ActionEvent e) {// Periksa butang mana yang diklik. jika (e.getActionCommand (). sama ("Ubah saiz Lajur Ketiga")) {System.out.println ("Ubah saiz dipanggil - ubah saiz lajur ketiga menjadi 300"); table.setColumnWidth (2, 300); // Paksa kemas kini GUI. table.invalidate (); frame.invalidate (); frame.validate (); frame.repaint (); }

Dalam kes ini, pColumnadalah indeks lajur, dan pWidthmerupakan set lebar baru. Sebelum dan selepas mengklik butang Ubah saiz ditunjukkan pada Gambar 3 dan 4.

Lajur yang tidak boleh disusun semula

Untuk kegunaan umum, anda boleh mengubah saiz lajur dengan menyeret tajuk. Kod berikut membuang keupayaan untuk mengubah ukuran berdasarkan pIsResize. Sekiranya pIsResizebenar, lajur boleh diubah saiznya; jika tidak, tidak boleh diubah saiznya:

public void setResizable (int pColumn, boolean pIsResize) {// Dapatkan model lajur. TableColumnModel colModel = getColumnModel (); // Tetapkan ukuran semula atau tidak. colModel.getColumn (pColumn) .setResizable (pIsResize); }

Dalam kes ini, pColumnadalah indeks lajur yang tidak dapat disusun semula. Mendapatkan lajur ( getColumn(..)) dan menetapkan harta sederhana ( setResizable(..)) adalah yang perlu anda lakukan.

Pilihan lajur

Why not select an entire column with the click of a button rather than a single cell? The JTable displays selected/deselected cells by calling a cell's isCellSelected(int row, int col) method. Overriding this method gives you the desired results, which are dependent on the boolean select, passed as a parameter to the setSelect() method. If true, the column will be selected; if false, it will not be selected. The key is to save the column as colSelect(), with a "select" flag indicating whether this column should be selected or deselected:

 int colSelect; boolean select; /** Sets the column at index col to selected or deselected * -based on the value of select. */ public void setSelect(int col, boolean select){ colSelect = col; this.select = select; } /**This method returns whether a particular cell is selected or not. */ public boolean isCellSelected(int row, int column) throws IllegalArgumentException{ //override the method for the column set in setSelect() if (colSelect == column){ if (select) return true; else return false; } else { return super.isCellSelected(row, column); } } 

Figure 5 displays the result where Column D has been selected.

Control headers

As you might have noticed, the column header in the first column is longer than that column's width. We address this by resetting the column width:

/**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 telah bekerja dengan Java selama tiga tahun terakhir. Dia adalah jurutera yang berpangkalan di India dan telah bekerja secara meluas dalam reka bentuk dan pelaksanaan sistem berorientasi objek menggunakan Java IO, JFC, CORBA, i18n, dan refleksi. John D. Mitchell adalah penyelaras Java Tips untuk JavaWorld.

Ketahui lebih lanjut mengenai topik ini

  • Kod sumber untuk TableColumnTest yang telah siap

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

  • Kod sumber untuk MyTable yang lengkap

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

  • Lihat dokumentasi API JTable

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

  • Lihat 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 mendapat banyak artikel berkaitan IT dari penerbitan saudara kami di .net

Cerita ini, "Petua Java 116: Tetapkan pilihan meja anda - pada waktu runtime!" pada asalnya diterbitkan oleh JavaWorld.