2013-03-05 5 views
13

サイズ変更可能な列を使用してJScrollPane内にJTableを作成する必要があります。 これは私が使用しているtable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);です。 また、ビューポートの幅がテーブル全体を含むのに十分な場合、ビューポートの幅を埋めるために列を引き伸ばす必要があります。一つのことを除いて、JTableの自動サイズ変更を、ビューポートに適合する場合にのみ有効にします。

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

このアプローチは、良い作品: は、私は次のようにJTableのクラスのgetScrollableTracksViewportWidth()メソッドをオーバーライドする必要があり、これを達成するために、私が初めてそれがポジションを開始するための独自の幅を返す列のサイズを変更しようとします。私はすぐに列のサイズを変更し、マウスの表をリリースすると、良い仕事を続けます。 そのような動作の理由は何ですか? getScrollableTracksViewportWidth()がfalseを返してもテーブルがサイズを変更しようとしているのはなぜですか?または、おそらく、あなたはそのようなサイズ変更モードを実装するためのより良い解決策を提案できますか?

ベローは、上記の問題の簡単な作業例です:あなたは、列のサイズを大きくしようとしたときに水平スクロールバーが表示されていないたときには、デフォルトdoLayout()ロジックが働いていなかったように思えた

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); 
      } 
     }); 
    } 
} 

答えて

17

ので、私はデフォルトのロジックを取り除き、ちょうどそれを調整しようとせずに列の幅を受け入れました。

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を使用するように編集しました。

+0

優れています。 – user2137020

+1

他の実装については、http://stackoverflow.com/questions/15499255/jtable-with-autoresize-horizo​​ntal-scrolling-and-shrinkable-first-columnも参照してください。 – camickr

+0

魅力的な作品です!私は完全に動作することがわかった唯一の解決策です。 –

関連する問題