2013-03-05 20 views
13

Görüntü birimine sığdırılırsa, yeniden boyutlandırılabilir sütunlara sahip bir JTable JScrollPane oluşturmam gerekir (kullanıcı sütun genişliğini artırdığında - yatay kaydırma çubuğu görünür). Bunun için table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); kullanıyorum. Ayrıca, viewport tüm tabloyu kapsayacak kadar geniş olduğunda - sütunlar görünüm genişliğini doldurmak için esnemelidir. tek bir şey dışında,Yalnızca JTable'ın otomatik olarak yeniden boyutlandırılmasını etkinleştirme

@Override 
public boolean getScrollableTracksViewportWidth() { 
    return getPreferredSize().width < getParent().getWidth(); 
} 

Bu yaklaşım iyi çalışır: Ben aşağıdaki gibi JTable sınıfının getScrollableTracksViewportWidth() yöntemini geçersiz sahip Bunu gerçekleştirmek için ilk kez pozisyon başlatmak için kendi genişliği dönmek sütunu yeniden boyutlandırmak çalıştığınızda. Sütunu hızlı bir şekilde yeniden boyutlandırır ve fare tablasını serbest bırakırsam iyi çalışmaya devam eder. Peki, bu tür davranışların nedeni nedir? Neden tablo getScrollableTracksViewportWidth() yanlış döndürse bile yeniden boyutlandırmayı dener? Ya da, bu tür yeniden boyutlandırma modunu uygulamak için daha iyi bir çözüm önerebilir misiniz?

Körük yukarıdaki sorunun basit bir çalışma örneğidir: Bir sütunun boyutunu artırmak için çalışırken, yatay kaydırma görünür değilken Varsayılan doLayout() mantık çalışma değildi gibi görünüyordu

import javax.swing.*; 

public class TestTable { 
    private static Object[][] data = new Object[][] { 
      { "a", "b", "c" }, 
      { "d", "e", "f" } 
    }; 
    private static Object[] colNames = new Object[] { "1", "2", "3" }; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JTable table = new JTable(data, colNames) { 
        @Override 
        public boolean getScrollableTracksViewportWidth() { 
         return getPreferredSize().width < getParent().getWidth(); 
        } 
       }; 
       table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 

       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new JScrollPane(table)); 
       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

cevap

17

Bu yüzden varsayılan mantıktan kurtuldum ve bunu düzeltmeye çalışmadan sütunun genişliğini kabul ettim.

import javax.swing.*; 
import javax.swing.table.*; 

public class TestTable { 
    private static Object[][] data = new Object[][] { 
      { "a", "b", "c" }, 
      { "d", "e", "f" } 
    }; 
    private static Object[] colNames = new Object[] { "1", "2", "3" }; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JTable table = new JTable(data, colNames) 
       { 
        @Override 
        public boolean getScrollableTracksViewportWidth() 
        { 
         return getPreferredSize().width < getParent().getWidth(); 
        } 

        @Override 
        public void doLayout() 
        { 
         TableColumn resizingColumn = null; 

         if (tableHeader != null) 
          resizingColumn = tableHeader.getResizingColumn(); 

         // Viewport size changed. May need to increase columns widths 

         if (resizingColumn == null) 
         { 
          setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); 
          super.doLayout(); 
         } 

         // Specific column resized. Reset preferred widths 

         else 
         { 
          TableColumnModel tcm = getColumnModel(); 

          for (int i = 0; i < tcm.getColumnCount(); i++) 
          { 
           TableColumn tc = tcm.getColumn(i); 
           tc.setPreferredWidth(tc.getWidth()); 
          } 

          // Columns don't fill the viewport, invoke default layout 

          if (tcm.getTotalColumnWidth() < getParent().getWidth()) 
           setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); 
           super.doLayout(); 
         } 

         setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
        } 

       }; 
       table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 

       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new JScrollPane(table)); 
       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

AUTO_RESIZE_ALL_COLUMNS kullanıldı.

+0

Mükemmel, iyi çalışıyor. – user2137020

+1

Ayrıca bkz: http://stackoverflow.com/questions/15499255/jtable-with-autoresize-horizontal-scrolling-and-shrinkable-first-column farklı bir uygulama için. – camickr

+0

Bir çekicilik gibi çalışır! Mükemmel çalıştığını bulduğum tek çözüm. –