1

双击时,如何定位(在 JXTable 中)来自不同行的特定列值以打开新框架?

在此处输入图像描述

我现在有这个代码:

myTable.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                if (e.getClickCount() == 2) {
                    JXTable target = (JXTable)e.getSource();
                    int row = target.getSelectedRow();
                    int column = target.getTableColumn(3);  //for example the third column
                    new Detail().setVisible(true);

                }
            }
        });

使用此代码解决:

     final JOptionPane pane = new JOptionPane((Frame) null, JOptionPane.PLAIN_MESSAGE, JOptionPane.DEFAULT_OPTION);

     final JDialog d = pane.createDialog((Frame) null, "Comments");
                   d.setModal(false);
                   d.setAlwaysOnTop(true);
                   d.pack();
     myTable.addMouseListener(new MouseAdapter() {
          public void mouseClicked(MouseEvent e) {
                   if (e.getClickCount() == 2) {
                          int row = myTable.rowAtPoint(e.getPoint());
                          Object value1 = myTable.getValueAt(row, 4);
                          pane.setMessage(value1);
                   if (!d.isVisible())
                   d.setLocationRelativeTo(myTable);
                   d.setVisible(true);
                   }
          }
      });

更新 1:

正如@mKorbel 所说,我想使用像这个例子一样的JPopupMenu (由@mKorbel 提供)。但是我怎样才能实现一个在单击 JMenuItem 时打开的 JDialog。

private void createPopupMenu() {
        JPopupMenu popup = new JPopupMenu();
        JMenuItem MenuItemComments = new JMenuItem("Show Comments");
        JMenuItem MenuItemReference = new JMenuItem("Show Reference");
        popup.add(MenuItemComments);
        popup.add(MenuItemReference);

        MouseListener popupListener = new PopupListener(popup);
        Table_Employee.addMouseListener(popupListener);
    }

private class PopupListener extends MouseAdapter {
        private JPopupMenu popup;
        PopupListener(JPopupMenu popupMenu) {
            popup = popupMenu;
        }
        @Override
        public void mousePressed(MouseEvent e) {
            maybeShowPopup(e);
        }
        @Override
        public void mouseReleased(MouseEvent e) {
            if (Table_Employee.getSelectedRow() != -1) {
                maybeShowPopup(e);
            }
        }
        private void maybeShowPopup(MouseEvent e) {
            if (e.isPopupTrigger()) {

        // get row that pointer is over
        int row = Table_Employee.rowAtPoint(e.getPoint());

        // if pointer is over a selected row, show popup
        if (Table_Employee.isRowSelected(row)) {
           popup.show(e.getComponent(), e.getX(), e.getY());

        }
            }

        }


    }
4

1 回答 1

2
  1. 不要J(X)Frame在运行时创建新的,这个容器的内容将是相同的,没有理由,创建一次,重用这个容器,并在屏幕上可见(hide / show)使用setVisible(false / true)

  2. 不要创建一个J(X)Frame,创建一个J(X)Dialog与父级的JXTable,然后对话框将居中于JXTables

  3. 您也可以使用ListSelectionListener,但使用单选模型

  4. 阅读有关JList, JTableand的 Oracle 教程ListSelectionListener, 逻辑将是相同的 and for SwingX componentstoo,

  5. 我将使用JPopup 作为控件来显示 JDialog,只是为了避免来自鼠标或键盘的烦人事件

编辑

必须添加

  • d.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE), 那么JDialognever 将被关闭只更改为setVisible(false);

  • 必须从选定JTable的行中编码值,

  • 创建一个新的、单独的 void 将值从JTables 行填充到JComponent放入的 sJDialog

  • 确保J(X)Table已更改selectionModesingle selection

  • (非必需)现在您可以在屏幕上定位,但JDialog在屏幕上JDialog仍然不可见

  • 然后调用d.setVisble(true),我建议将此代码行包装到invokeLater(),然后JDialog在所有更改完成后将可见,将此事件移动到末尾Event Dispatch Thread

于 2012-08-05T09:40:57.007 回答