1

Silk4J を使用してSapTableおり、Locator Spy でレポートされるテーブルがあります。そのテーブルから、2 番目の列のすべてのテキストを取得しようとしていますが、ハングするか、例外が発生して終了します。以下に、私の試みのコードを示します。最後に、テーブルの最後の行に到達しましたが、再びハングします。

すべての例で、後でさらに条件を挿入したいので、for ループの代わりに while ループを使用しています。

試してみてください 1: まっすぐ進む (と思った)

    SapTable table; // initialized somewhere else
    int maxrows = table.getRowCount();
    int row = 0;
    while (row < maxrows)
    {
        String text = table.getCell(row, COLUMN).getText();
        logger.debug(text);
        row++;
    }

ただし、このコードは表示されているすべての列を出力してからハングします。

試行 2: PageDnSilk 経由でキープレスを追加する

try 1 は表示されているセルのみを印刷したので、すべてのページにキープレスを追加すると役立つと思いました。それが私のコードでした:

SapTable table; // initialized somewhere else
int maxrows = table.getRowCount();
int row = 0;
int visibleRows = table.getVisibleRowCount();
table.setFocus();
while (row < maxrows)
{
    String text = table.getCell(row, COLUMN).getText();
    logger.debug(text);
    row++;
    if (row % visibleRows == 0)
        window.sendVKey(VKey.PAGE_DOWN);
}

残念ながら、これにより「仮想キーが有効になっていません」という例外が発生します。

試行 3: PageDnAwtRobot を介してキープレスを追加する

組み込みのsendVKey方法は機能しませんでしたが、PageDn手動で押すと機能するため、AwtRobot に切り替えました。

SapTable table; // initialized somewhere else
int maxrows = table.getRowCount();
int row = 0;
int visibleRows = table.getVisibleRowCount();
table.setFocus();
while (row < maxrows)
{
    String text = table.getCell(row, COLUMN).getText();
    logger.debug(text);
    row++;
    if (row % visibleRows == 0)
    {
        Robot robot = new Robot();
        robot.keyPress(KeyEvent.VK_PAGE_DOWN);
        robot.keyRelease(KeyEvent.VK_PAGE_DOWN);
    }
}

キーを押すと機能するようになり、テーブルが次のエントリにスクロールするのがわかります。ただし、テスト アプリケーションはまだハングします。

試行 4: 行数のリセット

Locator Spy を再度使用すると、行のインデックスがゼロにリセットされていることがわかったので、コードでそれを模倣しました。

SapTable table; // initialized somewhere else
int maxrows = table.getRowCount();
int row = 0;
int visibleRows = table.getVisibleRowCount();
table.setFocus();
while (row < maxrows)
{
    String text = table.getCell(row, COLUMN).getText();
    logger.debug(text);
    row++;
    if (row % visibleRows == 0)
    {
        Robot robot = new Robot();
        robot.keyPress(KeyEvent.VK_PAGE_DOWN);
        robot.keyRelease(KeyEvent.VK_PAGE_DOWN);
        row = 0; // <-- 
    }
}

この場合、リストの最初の N (表示されている数) 項目を出力し、位置 N+1 までスクロールし、最初の (!) 行の名前を出力してから、インデックス 1 の項目にアクセスするとハングします (リセット後)。 )。

トライ5:眠る

少し眠ると、テーブルの最後に到達できます。

SapTable table; // initialized somewhere else
int maxrows = table.getRowCount();
int row = 0;
int visibleRows = table.getVisibleRowCount();
table.setFocus();
while (row < maxrows)
{
    String text = table.getCell(row, COLUMN).getText();
    logger.debug(text);
    row++;
    if (row % visibleRows == 0)
    {
        Robot robot = new Robot();
        robot.keyPress(KeyEvent.VK_PAGE_DOWN);
        robot.keyRelease(KeyEvent.VK_PAGE_DOWN);
        row = 0;
        Thread.sleep(1000); // <--
    }
}

この場合、テーブル内のすべてのアイテムを取得します。しかし、テーブルがいつ終了するかわからないため、別のgetCell()呼び出しが行われ、再びハングします。

質問

私は本当に立ち往生しています。テーブル内の実際の行数を取得するなどの他の方法も探しましたが(そうでgetRowCount()はありません)、まだ見つかりませんでした。

Silk4J で SapTable の実際の行数を取得するにはどうすればよいですか?

4

1 に答える 1