在JDialog中加入一个JTable,jTable中是我查询数据库得到的数据,我的问题是
1.通过在JTable数据项上双击鼠标关闭JDialog,JDialog包含该JTable
2.将鼠标双击的数据项回填到textfield中

解决方案 »

  1.   

    不难啊.对JTable加入鼠标监听.双击后关闭用关闭对话框的方法关闭就行了.
    至于取数据,也是在鼠标监控方法里,双击后能得到行和列的值,那么就能到数据项的值了.然后把得到的数据传数需要得到该数据的类的方法.
      

  2.   

    http://my.nbip.net/homepage/zhouB403/MyCode/TableEditDemo.zip
      

  3.   

    谢谢两位,我基本上已经实现了获得数据和向textfield中回填数据,我先在面临的问题是我双击鼠标后Dialog不能被关闭。我现在代码帖出请各位看是哪里出现问题了,请各位指教:
    这是我的JTable类:
    public class ShouFeiXiangMuTable extends JPanel {
      //声明表格
      JTable table = new JTable();
      //声明表格的数据类
      DefaultTableModel model;
      //表格的数据
      Object[][] data={
          {
              "", "", "", "", "", ""
          }
      };
      //表格的标题
      String[] columnNames = {
          "代   码", "拼 音 码", "自定义码", "收  费  项  目", "单    位", "单    价"
      };
      JScrollPane jScrollPane1 = new JScrollPane();
      BorderLayout borderLayout1 = new BorderLayout();
      public ShouFeiXiangMuTable() {
        try {
          jbInit();
        }
        catch (Exception ex) {
          ex.printStackTrace();
        }
      }  void jbInit() throws Exception {
        Dimension s = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        this.setBackground(SystemColor.controlHighlight);
        this.setFont(new java.awt.Font("Dialog", 0, 12));
        this.setDebugGraphicsOptions(0);
        this.setPreferredSize(new Dimension(680, 400));
        this.setToolTipText("");    RunClass runClass = new RunClass();
        List list = (List) runClass.getLeechdomInfo();
        if (list == null || list.size() < 1) {
          JLabel label = new JLabel("表中无数据,请到系统管理添加数据!",SwingConstants.CENTER);
          label.setFont(new Font("Dialog", 0, 12));
          JOptionPane.showMessageDialog(null, label);
        }
        else {
          int trow=list.size();
          int tcol=columnNames.length;
          data = new Object[trow][tcol];
          int tmp=0;
          for (int i = 0; i < list.size(); i++) {
            for (int row = 0; row < trow; row++) {
              ShouFeiXiangMuDo shoufeixiangmu = new ShouFeiXiangMuDo();
              shoufeixiangmu = (ShouFeiXiangMuDo) list.get(i);
              String[] values = {
                  shoufeixiangmu.getDM(),                 //从数据库中得到的数据
                  shoufeixiangmu.getPYM(),                //从数据库中得到的数据
                  shoufeixiangmu.getZDYM(),               //从数据库中得到的数据
                  shoufeixiangmu.getSFXM(),               //从数据库中得到的数据
                  shoufeixiangmu.getDW(),                 //从数据库中得到的数据
                  String.valueOf(shoufeixiangmu.getJG())  //从数据库中得到的数据          };
              for (int j = 0; j < values.length; j++) {
                data[tmp][j] = values[j];
              }
            }
            tmp++;
          }
        }
        model =new DefaultTableModel(data, columnNames) {
          public boolean isCellEditable(int row, int column) {
            return false;
          } //指让单元不可编辑
        };
        table.setModel(model);
        //指定标题的重新排序不被允许
        table.getTableHeader().setReorderingAllowed(false);
        //不会因为在列标题之间拖动而改变大小
    //    table.getTableHeader().setResizingAllowed(false);
        this.setLayout(borderLayout1);
        //使选择框成为一个单元格
        table.getTableHeader().setFont(new java.awt.Font("Dialog", 0, 14));
        table.getColumnModel().getColumn(3).setPreferredWidth( 300 );
        table.getColumnModel().getColumn(4).setPreferredWidth( 50 );
        table.setFont(new java.awt.Font("Dialog", 0, 12));
        table.setDebugGraphicsOptions(0);
        table.setMaximumSize(new Dimension(2147483647, 100));
        table.setColumnSelectionAllowed(false);
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        table.setRowHeight(20);
        //取得表格的行方法
        ListSelectionModel rowSM = table.getSelectionModel();
        //加入行选择接收器
        rowSM.addListSelectionListener(new ListSelectionListener() {
          public void valueChanged(ListSelectionEvent e) {
            //当多种事件被激发的时候,不执行行接收器后面的代码
            if (e.getValueIsAdjusting())
              return;
            //取得行对象
            ListSelectionModel lsm = (ListSelectionModel) e.getSource();
            int selectedRow = lsm.getMinSelectionIndex();
            //取得行的第一列数据
    //        model = table.getModel();
            Object data = model.getValueAt(selectedRow, 3);
            System.out.println("第一列数据值=======" + data);
          }
        });
        //JTable中怎样获取鼠标所在位置的行数
        table.addMouseListener(new java.awt.event.MouseAdapter() {
          public void mouseClicked(java.awt.event.MouseEvent e) {
            //双击了鼠标显示详细信息
            if (e.getClickCount() == 2) {
              //获取鼠标点击的行的位置(及行数)
              Point mousepoint;
              mousepoint = e.getPoint();
              //取得行的第一列数据
              Object data = model.getValueAt(table.rowAtPoint(mousepoint), 0);
              String value = data.toString();
              List v_list = (List)new RunClass().getLeechdomInfo();
              if (v_list == null || v_list.size() < 1) {
              }
              else {
                ShouFeiXiangMuDo yp = (ShouFeiXiangMuDo) v_list.get(0);
                MenZhenHuaJiaShouFei.createInstance().jTextField3.setText(yp.getSFXM());
                MyTableDialog.closeMyDialog();
              }
            }
          }
        });    jScrollPane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        jScrollPane1.getViewport().setBackground(Color.white);
        jScrollPane1.setFont(new java.awt.Font("Dialog", 0, 12));
        jScrollPane1.setDebugGraphicsOptions(0);
        jScrollPane1.setSize(s);
        this.add(jScrollPane1, BorderLayout.CENTER);
        jScrollPane1.getViewport().add(table);
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
      }
    }
    这是我的Dialog类:
    public class MyTableDialog extends JDialog {
      private static MyTableDialog myTableDialog = new MyTableDialog(true);
      ShouFeiXiangMuTable jTable = new ShouFeiXiangMuTable();
      DefaultListModel Model = new DefaultListModel();
      JPanel panel1 = new JPanel();
      BorderLayout borderLayout1 = new BorderLayout();
      JScrollPane jScrollPane1 = new JScrollPane();
      public MyTableDialog(boolean bool) {
        this(null, "收费项目选择", bool);
      }
      public MyTableDialog(Frame frame, String title, boolean modal) {
        super(frame, title, modal);
        this.setBounds(200,220,680,400);
        try {
          jbInit();
        }
        catch(Exception ex) {
          ex.printStackTrace();
        }
      }
      private void jbInit() throws Exception {
        getContentPane().add(getJPanel());
      }
      public JPanel getJPanel(){
        panel1.add(jTable,BorderLayout.CENTER);
        return panel1;
      }
      public static void closeMyDialog(){
        myTableDialog.dispose();
     }
    }
      

  4.   

    我想问题应该出现在MyTableDialog这个类,我刚开始很奇怪为什么有如下这句话哪?private static MyTableDialog myTableDialog = new MyTableDialog(true);后来我看到你想有个句柄来找到MyTableDialog的实例。但是,我想知道你是如何使用MyTableDialog类的哪?是每一次都new出来一个,然后让它显示吗?如果这样,你是用的是一个实例,而上面的那就又是另一个实例了,而你dispose的是上面的那个实例,就不会影响到你现在使用的实例了
      

  5.   

    Michael_lee(水晶先生) 你说的就是我想用的,我据个例子,我说一下流程:我是由一个JDialog里的一个JTextField点击回车键,弹出一个JDialog1,在JDialog1中有一个JTable然后双击JTable中的一项然后关闭JDialog1,在将选择的一项帖回JDialog的JTextField中,有点罗嗦,不知道说清楚了没有。我在解释一下private static MyTableDialog myTableDialog = new MyTableDialog(true);
    我是想用在JTable中使用MyTableDialog的实例来关闭Dialog。这是可行的,(我有写了一个在JDialog中展现一个JList实现前面的流程),现在我想是不是出错是在一个内部类中调用该实例的一个dispose()一个方法出错了。
    public static void closeMyDialog(){
        myTableDialog.dispose();
     }
    也就是该方法不起作用的原因呀?这只是我的猜想,请指教
      

  6.   

    第一:private static MyTableDialog myTableDialog = new MyTableDialog(true);改成private static MyTableDialog myTableDialog = null;第二:public MyTableDialog(Frame frame, String title, boolean modal) 改成    public MyTableDialog(Frame frame, String title, boolean modal)
        {
            super(frame, title, modal);
            myTableDialog = this;
            this.setBounds(200, 220, 680, 400);
            try
            {
                jbInit();
            }
            catch(Exception ex)
            {
                ex.printStackTrace();
            }
        }
    第三:public static void closeMyDialog()改成:    public static void closeMyDialog()
        {
            myTableDialog.dispose();
            myTableDialog = null;
        }
    再试试,我想你会得到想要的效果
      

  7.   

    非常感谢恢复帖子的朋友,现在问题已经解决了,特别感谢 Michael_lee(水晶先生) 。