1

私は scala.swing を使用していますが、Java Swing のソリューションは scala.swing にも適用できます。したがって、この質問を Java Swing の質問として開きます。

JScrollPane に TransferHandler を持つ JTable があります。通常、テーブルはマウス ホイールの動きでスクロールできます。ただし、ドラッグ中は、スクロール ペインはマウス ホイールで移動しません。

ユーザーは、カーソルをペインの上部または下部に移動してスクロールできますが (自動スクロール)、自動スクロールは遅いので、通常のマウス機能を提供したいと考えています。

JTable でマウス ホイール イベントをキャプチャしようとしました。ドラッグしていないときは MouseWheelMove イベントを受け取りますが、ドラッグしているときは何も受け取りません。私の推測では、マウス ホイール イベントは、JTable ではなく、TransferHandler に関連するものに配信されます。

ドラッグ中にマウスホイールの動きを検出する方法は? 私の目的が達成される限り、他の方法は大歓迎です。

4

1 に答える 1

0

(少なくとも OS X では) ホイール イベントがバッファリングされ、DnD ジェスチャが完了した後にのみディスパッチされるようです。これが私の試みです:

import javax.swing._

val d = Array.fill(1000)(Array[AnyRef]((math.random * 1000).toInt.toString))
val t = new JTable(d, Array[AnyRef]("A")) {
  override def processMouseWheelEvent(e: java.awt.event.MouseWheelEvent): Unit = {
    println(s"Wheel: ${e.getID}")
    super.processMouseWheelEvent(e)
  }
  def enableEventsP(e: Long): Unit = enableEvents(e)
}
t.setDragEnabled(true)
t.enableEventsP(java.awt.AWTEvent.MOUSE_WHEEL_EVENT_MASK)

val f = new JFrame
f.getContentPane.add(new JScrollPane(t), java.awt.BorderLayout.CENTER)
f.pack()
f.setVisible(true)

ドラッグ中にホイールをスクロールしてからマウスを離すと、ホイール イベントが配信されます。


の自動スクロール動作をオーバーライドして、JTable高速化することをお勧めします。これはDropTarget私が見る限りで行われます。この例を見つけました。

于 2013-07-19T15:30:37.873 に答える