2012-03-05 12 views
2

私はJTableのを拡張し、私のクラスのメソッド次ていますJTableの変更のマウスカーソル

protected void setTableCursor(Cursor cursor) { 
// data gathering 
cursor = (cursor != null) ? cursor : Cursor.getDefaultCursor(); 
JTableHeader header = getTableHeader(); 

// set 
header.setCursor(cursor); 
setCursor(cursor); 
} 

このメソッドは、テーブルはDBから更新されたときに待機カーソルを表示するために随時呼ばれています。

問題は、私が列のサイズを変更しようとすると、デフォルトのSPLITカーソルが見えなくなることです。どのようにこれを修正することができますか?だから私はマウスカーソルが常に列の端に近いときに分割カーソルを表示するためにいくつかのコードを追加する必要があります。

下記の例もご確認ください。問題を再現するだけで、正確に列分圧器にテーブルヘッダをダブルクリックします。

必要はWAITカーソルを表示しないようにする場合、デフォルトのカーソルがnullに(ヘッダとテーブルの)両方のカーソルを設定する代わりに
import javax.swing.*; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.JTableHeader; 
import javax.swing.table.TableCellRenderer; 
import javax.swing.table.TableColumn; 
import javax.swing.table.TableColumnModel; 
import java.awt.*; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.util.HashMap; 
import java.util.Map; 
abstract public class DemoTable extends JTable 
{ 
protected DemoTable() { 
    super(); 
    compose(false); 
} 
private void compose(boolean allowMultipleSelection) { 
    setModel(new DefaultTableModel(getColumnNames(), 0)); 
    setColumnSelectionAllowed(false); 
    getSelectionModel().setSelectionMode(allowMultipleSelection ? ListSelectionModel.MULTIPLE_INTERVAL_SELECTION : ListSelectionModel.SINGLE_SELECTION); 
    getTableHeader().setReorderingAllowed(false); 
    getTableHeader().addMouseListener(new ColumnResizeListener(this)); 
} 

protected void setTableCursor(Cursor cursor) { 
    // data gathering 
    cursor = (cursor != null) ? cursor : null; 
    JTableHeader header = getTableHeader(); 
    // set 
    header.setCursor(cursor); 
    setCursor(cursor); 
} 

public void adjustColumnWidth(int column) { 
    setPreferredColumnWidth(column, getPreferredSizeForColumn(column)); 
} 

private int getPreferredSizeForColumn(int columnIndex) { 
    // base setup 
    int preferredWidth = 0; 
    int rowCount = getRowCount(); 
    TableColumnModel columnModel = getColumnModel(); 
    TableColumn column = columnModel.getColumn(columnIndex); 

    TableCellRenderer renderer; 
    Component rendererComponent = null; 

    // header 
    renderer = column.getHeaderRenderer(); 
    if (renderer != null) { 
     rendererComponent = renderer.getTableCellRendererComponent(this, column.getHeaderValue(), false, false, 0, 0); 
     if (rendererComponent != null) { 
      preferredWidth = rendererComponent.getPreferredSize().width; 
     } 
    } 

    // rendered values 
    Object value; 
    for (int row = 0; row < rowCount; row++) { 
     // base setup 
     value = getValueAt(row, columnIndex); 

     // renderer lookup 
     renderer = getCellRenderer(row, columnIndex); 
     if (renderer != null) 
      rendererComponent = renderer.getTableCellRendererComponent(this, value, false, false, row, columnIndex); 
     rendererComponent = (rendererComponent == null) ? new JLabel((value == null) ? "" : value.toString()) : rendererComponent; 

     // calculate the preferred size 
     preferredWidth = Math.max(preferredWidth, rendererComponent.getPreferredSize().width); 
    } 

    // exit 
    return (preferredWidth <= 0) ? 25 : (preferredWidth + 15); 
} 

public void adjustColumnWidths() { 

    Thread updateThread = new Thread() 
    { 
     public void run() { 
      try { 
       SwingUtilities.invokeAndWait(new Runnable() 
       { 
        public void run() { 
         int columns = getModel().getColumnCount(); 
         Map<Integer, Integer> preferredWidths = new HashMap<Integer, Integer>(); 
         for (int column = 0; column < columns; column++) 
          preferredWidths.put(column, getPreferredSizeForColumn(column)); 

         // run the sets 
         for (Map.Entry<Integer, Integer> column : preferredWidths.entrySet()) 
          setPreferredColumnWidth(column.getKey(), column.getValue()); 
        } 
       }); 

       // pause momentarily to let the cursor update take place 
       sleep(75); 
      } 
      catch (Exception e) { 
       // ignore 
      } 
      finally { 
       setTableCursor(null); 
      } 
     } 
    }; 

    // execute the thread 
    updateThread.start(); 
    if (updateThread.isAlive()) 
     setTableCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); 
} 

private void setPreferredColumnWidth(int column, int preferredWidth) { 
    getColumnModel().getColumn(column).setPreferredWidth(preferredWidth); 
} 

abstract protected String[] getColumnNames(); 

@Override 
public boolean isCellEditable(int row, int column) { 
    return false; 
} 

private static class ColumnResizeListener extends MouseAdapter 
{ 
    DemoTable table; 
    public ColumnResizeListener(DemoTable table) { 
     super(); 

     // attribute initialization 
     this.table = table; 
    } 
    @Override 
    public void mouseClicked(MouseEvent e) { 
     if (e.getSource() instanceof JTableHeader) { 
      // data gathering 
      int clicks = e.getClickCount(); 

      // single click 
      if (clicks == 1) { 
       int column = table.getColumnModel().getColumnIndexAtX(e.getX()); 
       table.adjustColumnWidth(column); 
      } 

      // double-click 
      else if (clicks == 2) 
       table.adjustColumnWidths(); 
     } 
    } 
} 

public static void main(String args[]) { 
    final DemoTable table = new DemoTable() { 
     @Override 
     protected String[] getColumnNames() { 
      return new String[]{"one","two"}; 
     } 
    }; 
    JFrame frame = new JFrame("Demo"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    ((DefaultTableModel)table.getModel()).addRow(new String[]{"1", "2"}); 
    ((DefaultTableModel)table.getModel()).addRow(new String[]{"1","2"}); 
    JPanel panel = new JPanel(); 
    panel.setLayout(new BorderLayout()); 
    panel.add(table.getTableHeader(), BorderLayout.NORTH); 
    panel.add(table, BorderLayout.CENTER); 
    frame.add(panel); 
    frame.pack(); 
    panel.setSize(new Dimension(200, 100)); 
    frame.setVisible(true); 
} 
} 
+1

もっと役立つ助けになることができる理由は2つか3つあります。[SSCCE](http://sscce.org/) – mKorbel

+0

であなたの投稿を編集してください。@ mKorbel:SSCCEが追加されました。 – GrayR

+1

カーソルリセットロジックが間違っています - マウスの位置に応じて、2つの "デフォルト"カーソルがあります(サイズ変更領域の内側と外側の2つ)。サイズ変更の列を確認することで、2つを区別することができます。 – kleopatra

答えて

2

+0

ありがとう!残念なことに私のコードではうまくいきませんでしたが、あなたが示唆しているものが初期コードより優れていることに同意します。 – GrayR

+0

問題が判明したのは、setEnabled(false):(テーブルを含むPanelを設定していたことです)を修正した後、このトピックのコメントと回答を使って解決できました。 – GrayR

関連する問題