3

私の質問は、JXTable 列 (1 つまたは特定の列のみ) からハイパーリンクを作成して、デフォルトのデスクトップ Web ブラウザーの「_blank」リンクのように動作させるにはどうすればよいかということです。

JXTable と DefaultTableModel を使用し、sqlite データベースからデータを呼び出します。私はインターネット、グーグル、[...] で調査を行い、次のような多くの情報を見つけました。

  • MouseListener を JXTable に登録します。
  • MouseEvent からポイント オブジェクトを生成します。
  • getValueAt を介してテキストを取得します

***注: 列にはセルごとにリンクが 1 つだけあり、テキストはなく、リンクだけです。

今のところ、このコードを実装して、セルをダブルクリックするアクションを作成しました。この例のように、デフォルトのブラウザーで開く列のハイパーリンクを実装するのを誰かが手伝ってくれます(ただし、データがデータベースから呼び出されないため、適応する方法がわかりません)。

Table_Employee.addMouseListener(new MouseAdapter() {
   public void mouseClicked(MouseEvent e) {
      if (e.getClickCount() == 2) {
         JXTable target = (JXTable)e.getSource();
         int row = target.getSelectedRow();
         int column = target.getSelectedColumn();
           JFrame newFrame = new JFrame();               //I want to open an distinc link
               newFrame.setTitle("Detail Screen");       //for every cell along one column
               newFrame.setVisible(true);                //in the web browser, not a frame.
         }
   }
});

EDIT 1 @Kleopatra の EDIT 2 のコードには、アプリケーションにいくつかの問題があります。また、次のコードのような別の試みを行いました。最初のクリックが関係しているときにリンクが表示されますが、反応しません (ブラウザが開いていません)。@Kleopatra、あなたの提案について詳しく教えてください。なぜなら、そのコードを入れようとすると、IDE がhyperlinkColumnを認識しないからです。

Table_Employee.addMouseListener(new MouseAdapter() {
   public void mouseClicked(MouseEvent e) {
      if (e.getClickCount() == 1) {
         JXTable target = (JXTable)e.getSource();
         int row = target.getSelectedRow();
         int column = target.getSelectedColumn();
         AbstractHyperlinkAction<Object> simpleAction = new AbstractHyperlinkAction<Object>(null) {

                public void actionPerformed(ActionEvent e) {
                //open the browser event?
                }
         };

    TableCellRenderer renderer = new DefaultTableRenderer(
    new HyperlinkProvider(simpleAction));
        Table_Employee.getColumnExt(2).setEditable(false);
        Table_Employee.getColumnExt(2).setCellRenderer(renderer);
      }
   }
});
4

1 に答える 1

7

リスナーは関係ありません。SwingX には、必要に応じてアクションを設定するだけの HyperlinkProvider があります。

JXTable table = new JXTable(myModel);
AbstractHyperlinkAction<Object> simpleAction = new AbstractHyperlinkAction<Object>(null) {

    public void actionPerformed(ActionEvent e) {
        // here goes what you want to do on activating the hyperlink
        //LOG.info("hit: " + getTarget());
    }

};
TableCellRenderer renderer = new DefaultTableRenderer(
    new HyperlinkProvider(simpleAction));
table.getColumnExt(0).setEditable(false);
table.getColumnExt(0).setCellRenderer(renderer);

ハイパーリンクを自動サポートするには、列を編集不可にする必要があることに注意してください。

編集 2

ブラウザ/メール クライアントを開きたい場合は、SwingX HyperlinkAction で構成された HyerlinkProvider を使用します。これは、コア DesktopAction によって支えられています。そのターゲットはタイプ URI である必要があり、その後、どちらかを開くかどうかを自動検出します。

列ごとに手動でインストールできます。

TableCellRenderer renderer = new DefaultTableRenderer(
    new HyperlinkProvider(new HyperlinkAction()));
table.getColumnExt(0).setEditable(false);
table.getColumnExt(0).setCellRenderer(renderer);

実際、それはさらに単純です。JXTable には、URI クラスのデフォルトとしてすでにそれがあります。あなたがしなければならないのは、列クラスとして uris とレポートを含むようにモデルを実装することです:

DefaultTableModel model = new DefaultTableModel(...) {

     @Override
     Class<?> getColumnClass(int column) {
         if (column == hyperlinkColumn) {
             return URI.class;
         } 
         ... // handle other columns
         return super.getColumnClass(column);
     }

     @Override
     boolean isCellEditable(int row, int column) {
         if (column == hyperlinkColumn) {
            return false; 
         }
         ... // handle other columns
         return super.isCellEditable(row, column); 
     }
}

実際のサポートを確認するには (JXList/JXTree も同様です)、SwingLabs Web デモを実行します。例はいくつかのページにあり、fi JXTable、Hyperlink/extended、Highlighter が含まれており、付属のコードにざっと目を通してください。

于 2012-08-02T15:46:44.433 に答える