0

我正在尝试使用 Java Swing 组件编写基于 GUI 的游戏应用程序。基本框架如下: AJFrame包含 aJScrollPane和 a JPanelJScrollPane进一步包含一个JPanel包含一个两层,JLayeredPane它本身包含两个JPanels。(出于好奇,这两个JPanels对应于最上面的非透明面板的单位窗格和最下面的不透明面板的地形窗格。)

自动窗口滚动是该程序的一项功能。为了澄清,编写的代码自动指定一个适当的单元作为窗口目标,然后继续滚动可见窗口,以便在给定窗口显示的情况下尽可能靠近屏幕中心位置显示该单元约束。这个程序是我进退两难的根源。在任何给定的方法执行中,除了在重新调整窗口大小之前对方法的调用之外,该方法完全按照它应该的方式工作。该方法仅在应用程序的初始启动中无法正常运行。

我认为我的代码太长了,无法在本文的上下文中完整发布,因此我将首先仅提供处理窗口滚动的代码,然后将其他代码发布到公共 DropBox 帐户所需的代码。

private void scrollWindowToUnit(int targetUnit) {
    System.out.println(((GenericUnit) unitsPane.getComponent(targetUnit))
            .getUnitName());
    int upLeftX = unitsPane.getLocation().x;
    int upLeftY = unitsPane.getLocation().y;
    Point scrollDest = new Point(unitsPane.getComponent(targetUnit)
            .getLocation().x - (screenSize.width / 2), unitsPane
            .getComponent(targetUnit).getLocation().y
            - ((screenSize.height - infoPane.getHeight()) / 2) + 24);

    if (scrollDest.x < upLeftX) {
        scrollDest.x = upLeftX + 24;
    }

    if (scrollDest.y < upLeftY) {
        scrollDest.y = upLeftY + 24;
    }

    jScrollPane.getViewport().setViewPosition(scrollDest);

    repaint();
    revalidate();
}

我已经完成了对该方法的相当稳健的测试,我的结果如下,当应用程序最初启动时,保存在upLeftX和中的值upLeftY都设置为 -24。这在整个程序执行过程中是一致的。(每个都设置为负值是相当奇怪的,但它似乎足够易于管理。)但是,其中的值在scrollDest程序的初始启动和后续运行之间会有所不同。本质上,发生的事情是代码获得了 scrollDest.x 和 scrollDest.y 的值,它们是小于 -24 的负整数。

在包含打印语句的简短示例运行之后,打印了以下结果。

scrollDest.x 和 y:-800 -336

scrollDest.x 和 y:0 0

scrollDest.x 和 y:1051 2145

scrollDest.x 和 y:1051 2145

scrollDest.x 和 y:610 -312

scrollDest.x 和 y:610 0

该行位于上述方法System.out.println("scrollDest.x and y: " + scrollDest.x + " " + scrollDest.y); 的两个语句之前和之后。if这些值反映了程序对单元的第一次方法调用,为方便起见称为 ONE,其次是程序对板上其他单元的第二次调用,TWO,最后是方法的第三次调用一次再一次。

这种不一致是我问题的根源或反映,我还没有设计出一种可靠的方法来解决这个问题。

我很乐意回答有关澄清或详细说明的任何问题。提前感谢大家的帮助!

4

1 回答 1

2

不确定是否要在 中居中JComponentsJViewport可以通过计算两个Rectangles (rect所需返回JComponentrect2是矩形来自JViewport

JScrollPane.scrollRectToVisible(new Rectangle(rect.x, rect.y, 
    (int) rect2.getWidth(), (int) rect2.getHeight()));

但最简单的是

JScrollPane.scrollRectToVisible(myDesiredComponents.getBounds());

注意JScrollPane的所有事件都必须在Event Dispatch Thread上完成

于 2013-02-20T07:01:41.507 回答