【问题标题】:How to scroll with wheel while dragging in JTable and JScrollPane在 JTable 和 JScrollPane 中拖动时如何使用滚轮滚动
【发布时间】:2013-07-18 14:21:54
【问题描述】:

我正在使用 scala.swing,但 Java Swing 的解决方案也适用于 scala.swing。 因此,我将此问题作为 Java Swing 问题打开。

我在 JScrollPane 中有带 TransferHandler 的 JTable。 通常,表格可以通过鼠标滚轮移动来滚动。 但是,在拖动时,滚动窗格不会随着鼠标滚轮移动。

用户可以通过将光标移动到窗格的顶部或底部来滚动(自动滚动), 但是自动滚动很慢,所以我想提供常用的鼠标功能。

我试图在 JTable 中捕获鼠标滚轮事件。 不拖动时,它接收到 MouseWheelMove 事件,但在拖动时,它什么也不接收。 我的猜测是鼠标滚轮事件被传递给与 TransferHandler 相关的东西,而不是 JTable。

如何在拖动时检测鼠标滚轮的运动? 只要达到我的目的,任何其他方法都是受欢迎的。

【问题讨论】:

  • 我认为在任何程序中都不可能同时拖动和滚动。
  • 任何程序是否意味着任何 Java 程序?在一些用 JS 编写的 Web UI 中是可能的。
  • 我猜这是特定于操作系统的:在我尝试过的任何应用程序中,我的 win box 滚轮都没有效果(Explorer f.i. 作为 the 本机参考程序)
  • 我同意上面的 cmets 并说如果您的用户需要这样做,那么您应该重新设计您的 UI。
  • 我无法在 Windows XP 资源管理器中使用 kleopatra 报告的此类操作,但我可以在 Mac 上的 Chrome、Windows 和 Mac 上的 Finder 中使用。它不是特定于操作系统的,只是资源管理器(和其他应用程序)不支持这种行为。为了确保,我的意图是在表格上拖动一行,向上或向下移动,然后放下。在这个动作中,自动滚动反应不够灵敏,我想提供鼠标滚轮支持。我不确定我的 UI 设计中有什么奇怪的地方。这种动作在具有大量列表的应用程序(例如任务管理工具)中很常见。让我知道更多。

标签: java swing scala


【解决方案1】:

似乎(至少在 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 中完成的。我找到了this example

【讨论】:

  • 谢谢。在我的环境中(ubuntu 12.04 + Open JDK 7),拖动时的滚轮事件似乎被丢弃了。调整自动滚动行为是个好主意,但我担心习惯了默认速度的用户会感到困惑。
猜你喜欢
  • 1970-01-01
  • 2012-03-31
  • 2011-12-21
  • 2013-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
  • 1970-01-01
相关资源
最近更新 更多