4

Java Swingを使用してJTableセルにマウスを合わせると情報ボックスを表示したいので、複数の部分があります

  1. テーブルセルでマウスオーバーイベントをキャプチャするにはどうすればよいですか? セルのコンテンツを設定してから、データを取得できる必要があります。
  2. そのセルにマウスを合わせると、動的サーバー データを含むパネル/ボックスを表示するにはどうすればよいですか?
  3. マウスオーバーのたびにサーバーに問い合わせる必要がないように、情報パネル/ボックスをキャッシュするにはどうすればよいですか?

例:

表のセルに次のように入力します: 94903. タブまたは入力後、セルは数値に設定されます。マウスオーバーすると、名前、住所、電話番号、電子メールなどのボックスが表示されます。

ありがとう!

4

2 に答える 2

5

HTML を使用してツールヒントのテキストをフォーマットできます。これにより、独自のソリューションを作成する必要や費用をかけずに、複雑な構造の情報をツールヒントに提供できます。唯一の問題は、ツールチップが自動的に破棄されることです。

それでもうまくいかない場合は、次の方法を試してください。

import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.*;
import javax.swing.JPopupMenu;
import javax.swing.JTable;
import javax.swing.Timer;

public class TestTable {

    private Timer showTimer;
    private Timer disposeTimer;
    private JTable table;
    private Point hintCell;
    private MyPopup popup; // Inherites from JPopupMenu

    public TestTable() {

        showTimer = new Timer(1500, new ShowPopupActionHandler());
        showTimer.setRepeats(false);
        showTimer.setCoalesce(true);

        disposeTimer = new Timer(5000, new DisposePopupActionHandler());
        disposeTimer.setRepeats(false);
        disposeTimer.setCoalesce(true);

        table.addMouseMotionListener(new MouseMotionAdapter() {

            @Override
            public void mouseMoved(MouseEvent e) {

                Point p = e.getPoint();
                int row = table.rowAtPoint(p);
                int col = table.columnAtPoint(p);

                if ((row > -1 && row < table.getRowCount()) && (col > -1 && col < table.getColumnCount())) {

                    if (hintCell == null || (hintCell.x != col || hintCell.y != row)) {

                        hintCell = new Point(col, row);
                        Object value = table.getValueAt(row, col);
                        // Depending on how the data is stored, you may need to load more data
                        // here...
                        // You will probably want to maintain a reference to the object hint data

                        showTimer.restart();

                    }

                }

            }
        });

    }

    protected MyPopup getHintPopup() {

        if (popup == null) {

            // Construct the popup...

        }

        return popup;

    }

    public class ShowPopupActionHandler implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {

            if (hintCell != null) {

                disposeTimer.stop(); // don't want it going off while we're setting up

                MyPopup popup = getHintPopup();
                popup.setVisible(false);

                // You might want to check that the object hint data is update and valid...
                Rectangle bounds = table.getCellRect(hintCell.y, hintCell.x, true);
                int x = bounds.x;
                int y = bounds.y + bounds.height;

                popup.show(table, x, y);

                disposeTimer.start();

            }

        }
    }

    public class DisposePopupActionHandler implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {

            MyPopup popup = getHintPopup();
            popup.setVisible(false);

        }
    }
}

今、私はポップアップを構築していません。Bob Sinclarの回答のポップアップメニューも使用します

于 2012-07-17T23:55:24.730 に答える
2

マウスオーバーを機能させる良い方法は次のとおりです。最初にこれを行い、チェックするときにテキストを出力します。

これは、ポップアップ メニューを表示する方法を示しています。

また、キャッシュに関しては、最後の 10 個の値をメモリに保存し、新しいエントリ ポイントが ping されるたびにサーバーから要求を実行する場合があります。つまり、ローカルに存在しない場合です。そして、情報が変更された場合に備えて、最後の 10 件のヒットを 1 分ごとに更新します。

別の便利なマウスオーバー ガイド

于 2012-07-17T21:24:41.810 に答える