Java JTable ayarı Sütun Genişliği


95

Sütun boyutunu aşağıdaki gibi ayarladığım bir JTable'ım var:

table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.getColumnModel().getColumn(0).setPreferredWidth(27);
table.getColumnModel().getColumn(1).setPreferredWidth(120);
table.getColumnModel().getColumn(2).setPreferredWidth(100);
table.getColumnModel().getColumn(3).setPreferredWidth(90);
table.getColumnModel().getColumn(4).setPreferredWidth(90);
table.getColumnModel().getColumn(6).setPreferredWidth(120);
table.getColumnModel().getColumn(7).setPreferredWidth(100);
table.getColumnModel().getColumn(8).setPreferredWidth(95);
table.getColumnModel().getColumn(9).setPreferredWidth(40);
table.getColumnModel().getColumn(10).setPreferredWidth(400);

Bu iyi çalışıyor, ancak tablo büyütüldüğünde, son sütunun sağında boş alan alıyorum. Yeniden boyutlandırıldığında son sütunun pencerenin sonuna kadar yeniden boyutlandırılması mümkün müdür?

AUTO_RESIZE_LAST_COLUMNBelgelerde mülk buldum ama çalışmıyor.

Düzenleme: JTableBir içindedir JScrollPaneonun tercih boyutu ayarlanır.

Yanıtlar:


45

Aradığınızda ne olur setMinWidth(400)son kolonunda yerine ait setPreferredWidth(400)?

JavaDoc'ta JTablebelgeleri doLayout()çok dikkatli bir şekilde okuyun . İşte bazı seçim bitleri:

Yöntem, çevreleyen bir pencerenin yeniden boyutlandırılmasının bir sonucu olarak çağrıldığında, resizingColumn null olur. Bu, yeniden boyutlandırmanın JTable'ın "dışında" gerçekleştiği ve değişikliğin - veya "delta" nın bu JTable'ın otomatik yeniden boyutlandırma modundan bağımsız olarak tüm sütunlara dağıtılması gerektiği anlamına gelir.

Bu yüzden AUTO_RESIZE_LAST_COLUMNsana yardım etmemiş olabilir .

Not: Bir JTable sütunların genişliklerinde ayarlamalar yaptığında, minimum ve maksimum değerlerine kesinlikle saygı gösterir.

Bu, son sütunlar dışında tümü için Min == Max'i ayarlamak isteyebileceğinizi, ardından son sütunda Min = Tercihli'yi ayarlayıp Max'i ayarlamayacağınızı veya Maks için çok büyük bir değer ayarlayabileceğinizi söylüyor.


1
setMinWidth (400) hala masanın sağının boş kalmasına neden oluyor
Hamza Yerlikaya

2
Bunun bir fark yaratıp yaratmadığını görmek için setMaxWidth (10000) eklemeyi deneyin.
Eddie

1
Line table.setAutoResizeMode (JTable.AUTO_RESIZE_OFF) satırını kaldırın; Bu, istediğiniz yeniden boyutlandırmayı engelleyebilir.
Eddie

Henüz yapmadıysanız, muhtemelen JTable'ın kendisinde de minimum ve maksimum boyutu ayarlamak istersiniz
Eddie

4
Tablo modelini uyguladıktan sonra setMinWidth çağrısını yaptığınızdan emin olun ... Bu beni bir süre tetikledi.
Brian Knoblauch

23

İle JTable.AUTO_RESIZE_OFF, tablo sizin için sütunlardan hiçbirinin boyutunu değiştirmeyeceği için tercih ettiğiniz ayarı alacaktır. Son sütunun bölmenin geri kalanını doldurması dışında, sütunların varsayılan olarak tercih ettiğiniz boyuta sahip olması JTable.AUTO_RESIZE_LAST_COLUMNhedefinizse, autoResizeMode'u kullanma seçeneğiniz vardır, ancak TableColumn TableColumn.setMaxWidth()yerine birlikte kullanıldığında en etkili olabilir . son sütun hariç tümü için setPreferredWidth ().

Bunun AUTO_RESIZE_LAST_COLUMNgerçekten işe yaradığından emin olduğunuzda, bir kombinasyonla deneyebilirsiniz TableColumn.setMaxWidth()veTableColumn.setMinWidth()


1
AUTO_RESIZE_LAST_COLUMN kullanıldığında tablo kaydırma bölmesine sığacak şekilde yeniden boyutlandırıldığında amacım tablonun belirli bir minimum boyutta olmasını sağlamak, ancak minimum boyutumdan büyükse onu büyütmektir.
Hamza Yerlikaya

TableColumn.setMaxWidth () yerine TableColumn.setMinWidth () kullanırsanız bu davranışa sahip olabilirsiniz.
akf

son yorumuma eklemek için: son sütun dahil olmak üzere tablonuzdaki her sütun için TableColumn.setMinWidth () kullanın.
akf

hem minimum hem de maksimum genişliği ayarlamak sorunu çözdü, ancak şimdi kaydırma çubukları eksik.
Hamza Yerlikaya

16

JTable.AUTO_RESIZE_LAST_COLUMN"Tüm yeniden boyutlandırma işlemleri sırasında, ayarlamaları yalnızca son sütuna uygulayın" olarak tanımlanır; bu , otomatik modu kodunuzun sonunda ayarlamanız gerektiği anlamına gelir , aksi takdirde setPreferredWidth () hiçbir şeyi etkilemez!

Yani sizin durumunuzda bu doğru yol olacaktır:

table.getColumnModel().getColumn(0).setPreferredWidth(27);
table.getColumnModel().getColumn(1).setPreferredWidth(120);
table.getColumnModel().getColumn(2).setPreferredWidth(100);
table.getColumnModel().getColumn(3).setPreferredWidth(90);
table.getColumnModel().getColumn(4).setPreferredWidth(90);
table.getColumnModel().getColumn(6).setPreferredWidth(120);
table.getColumnModel().getColumn(7).setPreferredWidth(100);
table.getColumnModel().getColumn(8).setPreferredWidth(95);
table.getColumnModel().getColumn(9).setPreferredWidth(40);
table.getColumnModel().getColumn(10).setPreferredWidth(400);
table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);

5

Bu yöntemi kullanın

public static void setColumnWidths(JTable table, int... widths) {
    TableColumnModel columnModel = table.getColumnModel();
    for (int i = 0; i < widths.length; i++) {
        if (i < columnModel.getColumnCount()) {
            columnModel.getColumn(i).setMaxWidth(widths[i]);
        }
        else break;
    }
}

Veya JTablesınıfı genişletin :

public class Table extends JTable {
    public void setColumnWidths(int... widths) {
        for (int i = 0; i < widths.length; i++) {
            if (i < columnModel.getColumnCount()) {
                columnModel.getColumn(i).setMaxWidth(widths[i]);
            }
            else break;
        }
    }
}

Ve sonra

table.setColumnWidths(30, 150, 100, 100);

4

Kleopatra'nın sözünü okurken (2. kez javax.swing.JXTable'a bir göz atmayı önerdi ve şimdi üzgünüm, ilk kez bakamadım :)) Bağlantıyı takip etmenizi öneririm

Aynı sorun için bu çözümü buldum: (ancak yukarıdaki bağlantıyı izlemenizi öneririm) Tabloyu yeniden boyutlandırırken, tablo sütun genişliklerini geçerli tablo toplam genişliğine ölçekleyin. bunu yapmak için (göreli) sütun genişlikleri için global bir tamsayı dizisi kullanıyorum):

private int[] columnWidths=null;

Tablo sütun genişliklerini ayarlamak için bu işlevi kullanıyorum:

public void setColumnWidths(int[] widths){
    int nrCols=table.getModel().getColumnCount();
    if(nrCols==0||widths==null){
        return;
    }
    this.columnWidths=widths.clone();

    //current width of the table:
    int totalWidth=table.getWidth();

    int totalWidthRequested=0;
    int nrRequestedWidths=columnWidths.length;
    int defaultWidth=(int)Math.floor((double)totalWidth/(double)nrCols);

    for(int col=0;col<nrCols;col++){
        int width = 0;
        if(columnWidths.length>col){
            width=columnWidths[col];
        }
        totalWidthRequested+=width;
    }
    //Note: for the not defined columns: use the defaultWidth
    if(nrRequestedWidths<nrCols){
        log.fine("Setting column widths: nr of columns do not match column widths requested");
        totalWidthRequested+=((nrCols-nrRequestedWidths)*defaultWidth);
    }
    //calculate the scale for the column width
    double factor=(double)totalWidth/(double)totalWidthRequested;

    for(int col=0;col<nrCols;col++){
        int width = defaultWidth;
        if(columnWidths.length>col){
            //scale the requested width to the current table width
            width=(int)Math.floor(factor*(double)columnWidths[col]);
        }
        table.getColumnModel().getColumn(col).setPreferredWidth(width);
        table.getColumnModel().getColumn(col).setWidth(width);
    }

}

Aradığım verileri ayarlarken:

    setColumnWidths(this.columnWidths);

ve değiştirildiğinde, ComponentListener setini tablonun ebeveynine çağırıyorum (benim durumumda, tablomun kapsayıcısı olan JScrollPane):

public void componentResized(ComponentEvent componentEvent) {
    this.setColumnWidths(this.columnWidths);
}

JTable tablosunun da global olduğunu unutmayın:

private JTable table;

Ve burada dinleyiciyi ayarlıyorum:

    scrollPane=new JScrollPane(table);
    scrollPane.addComponentListener(this);

1
Görebildiğim kadarıyla, bu (çok kırılgan) bir hack: kullanıcının sütun genişliğini değiştirmesi üzerine güncelleme yapmıyor. Yine, JXTable'ın kaynak koduna bakmanızı öneririm - sütun tercihlerinin toplamı mevcut genişlikten küçükse ve aksi takdirde yatay bir kaydırma çubuğu gösteriyorsa mevcut genişliği doldurmayı tetikleyen ek bir horizontalScroll özelliğine sahiptir
kleopatra

Kullanıcının masa genişliklerini manuel olarak değiştirmesine tepki vermediğini biliyorum, bu şekilde bir hack ... ama yine: yukarıda önerilenden daha iyi. Ama beni JXTable'a meraklandırdın .... Oraya bir bakacağım! (ve bir masa konusunda size tekrar yürümek güzel :))
michel.iamit

Haklıydın, cevabımın üstündeki sözüme bakın, sözünüze olumlu oy verdim!
michel.iamit

En azından bu benim için faydalı oldu, bu yaklaşımı durumum için sütun ağırlığı prensibi ile kullandım.
Solostaran 14

2
fireTableStructureChanged();

yeniden boyutlandırma davranışını varsayılan olarak değiştirir ! Bu yöntem, kodunuzda bir yerde, sütunu yeniden boyutlandırma özelliklerini ayarladıktan SONRA çağrılırsa, tüm ayarlarınız sıfırlanacaktır. Bu yan etki dolaylı olarak ortaya çıkabilir. Bağlantılı veri modelinin bir şekilde değiştirilmesinin bir sonucu olarak Fe, özellikler ayarlandıktan sonra bu yönteme denir.


1

Seçeneğe gerek yok, sadece son sütunun tercih edilen genişliğini maksimum yapın ve tüm ekstra alanı kaplayacaktır.

table.getColumnModel().getColumn(0).setPreferredWidth(27);
table.getColumnModel().getColumn(1).setPreferredWidth(120);
table.getColumnModel().getColumn(2).setPreferredWidth(100);
table.getColumnModel().getColumn(3).setPreferredWidth(90);
table.getColumnModel().getColumn(4).setPreferredWidth(90);
table.getColumnModel().getColumn(6).setPreferredWidth(120);
table.getColumnModel().getColumn(7).setPreferredWidth(100);
table.getColumnModel().getColumn(8).setPreferredWidth(95);
table.getColumnModel().getColumn(9).setPreferredWidth(40);
table.getColumnModel().getColumn(10).setPreferredWidth(Integer.MAX_INT);

0

Bu kod benim için setAutoResizeModes olmadan çalıştı.

        TableColumnModel columnModel = jTable1.getColumnModel();
        columnModel.getColumn(1).setPreferredWidth(170);
        columnModel.getColumn(1).setMaxWidth(170);
        columnModel.getColumn(2).setPreferredWidth(150);
        columnModel.getColumn(2).setMaxWidth(150);
        columnModel.getColumn(3).setPreferredWidth(40);
        columnModel.getColumn(3).setMaxWidth(40);

-2

Bu kodu kullanın. Benim için çalıştı. 3 sütun için düşündüm. Kodunuz için döngü değerini değiştirin.

TableColumn column = null;
for (int i = 0; i < 3; i++) {
    column = table.getColumnModel().getColumn(i);
    if (i == 0) 
        column.setMaxWidth(10);
    if (i == 2)
        column.setMaxWidth(50);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.