2016-10-26 17 views
0

'table'のmouseListenerで 'urObjectInCell'オブジェクトを別のクラスBtnDelete1に使用する必要があります。Java:あるmouseListenerから別のクラスへのオブジェクトの使用方法

は、ここに私のマウスリスナーのコードです:

JTable table; 
    public FirstSwingApp(){ 
     super(); 
     table = new JTable(model); 

     table.addMouseListener(new MouseAdapter() { 

     public void mouseClicked(final MouseEvent e) { 
      if (e.getClickCount() == 1) { 
       final JTable target = (JTable)e.getSource(); 
       final int row = target.getSelectedRow(); 
       final int column = 1; 
       // Cast to ur Object type 
       urObjctInCell = target.getValueAt(row, column); 

      } 
     } 
     }); 
     friendNo = urObjctInCell.toString(); 

私は前に宣言されたfriendNo文字列にオブジェクトを格納しようとしました。しかし、私は友人がオブジェクトの価値を取っているとは思わない。

ここで私のクラスBtnDelete1コードです:

public class BtnDelete1 implements ActionListener { 

    public void actionPerformed(ActionEvent e) { 



     String fnumber = friendNo; 

     CallableStatement dstmt = null; 
     CallableStatement cstmt = null; 

     ResultSet rs; 


     try { 

      conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/Contact_Manager?user=root"); 


      String SQL = "{call delete_contact (?)}"; 

      String disQuery = "select * from FRIEND"; 

      dstmt = conn.prepareCall(disQuery); 
      cstmt = conn.prepareCall(SQL); 

      cstmt.setString(1, fnumber); 

      cstmt.executeQuery(); 

      rs = dstmt.executeQuery(); 

      ResultSetMetaData metaData = rs.getMetaData(); 

      // names of columns 
      Vector<String> columnNames = new Vector<String>(); 
      int columnCount = metaData.getColumnCount(); 
      for (int column = 1; column <= columnCount; column++) { 
       columnNames.add(metaData.getColumnName(column)); 
      } 

      // data of the table 
      Vector<Vector<Object>> data = new Vector<Vector<Object>>(); 
      while (rs.next()) { 
       Vector<Object> vector = new Vector<Object>(); 
       for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) { 
        vector.add(rs.getObject(columnIndex)); 
       } 
       data.add(vector); 
      } 

      // It creates and displays the table 


      model.setDataVector(data, columnNames); 

      // Closes the Connection 

      dstmt.close(); 
      System.out.println("Success!!"); 
     } catch (SQLException ex) { 

      System.out.println("Error in connection: " + ex.getMessage()); 
     } 


    } 
} 

のMouseListenerから得urObjectInCellオブジェクトの値は、JTableの「テーブル」の行を削除するのに使用されます。

+0

あなたは 'FirstSwingApp'、あなたは' mouseEvent'をやっているのと同じ方法で、 'BtnDelete'アクションイベントを持っていない理由は? –

+0

私はすべての異なるボタンのアクションを実行するために別々のクラスを使用しています。 'firstSwingsApp()'はGUIがインスタンス化されるコンストラクタです。私はテーブル上でマウスがクリックされたときにアクションを実行するための別のクラスを作っていましたが、 'mouseClick'は別の' actionListener'を許可しません。 –

答えて

2

これは間違っていると思います。いくつかの不公平な婚姻でMouseListenerとActionListenerを混ぜようとするのではなく、単にActionListenerに通知されたときにJTableから選択されたセルを取得するのはなぜですか?

これを行うには、JTable保持クラスに、選択したJTableセルへの参照を抽出し、このクラスへの参照をActionListenerに渡し、ActionListenerに通知があったときにこのメソッドを呼び出させる方法呼び出されるコールバックメソッド。例えば

あなたはJTableはNoMouseListenerNeededと呼ばれるGUIで開催されてい言う:あなたがリスナーにGUIを渡すことで、選択したセルを取得するのActionListener(またはAbstractAction)を使用することができ

import java.awt.BorderLayout; 
import javax.swing.*; 
import javax.swing.table.DefaultTableModel; 

@SuppressWarnings("serial") 
public class NoMouseListenerNeeded extends JPanel { 
    private static final Integer[][] DATA = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; 
    private static final String[] COLS = { "A", "B", "C" }; 
    private DefaultTableModel tblModel = new DefaultTableModel(DATA, COLS); 
    private JTable table = new JTable(tblModel); 

    public NoMouseListenerNeeded() { 
     JPanel btnPanel = new JPanel(); 
     btnPanel.add(new JButton(new MyButtonListener(this))); 

     setLayout(new BorderLayout()); 
     add(new JScrollPane(table)); 
     add(btnPanel, BorderLayout.PAGE_END); 
    } 

    // get data held by selected cell in JTable 
    // returns null if no cell selected 
    public Object getSelectedCell() { 
     int col = table.getSelectedColumn(); 
     int row = table.getSelectedRow(); 

     if (col < 0 || row < 0) { 
      return null; // no selection made, return null 
     } else { 
      return table.getValueAt(row, col); 
     } 
    } 

    private static void createAndShowGui() { 
     NoMouseListenerNeeded mainPanel = new NoMouseListenerNeeded(); 

     JFrame frame = new JFrame("NoMouseListenerNeeded"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 

、および呼び出し選択したデータを返すGUIの方法:

import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import javax.swing.AbstractAction; 
import javax.swing.JOptionPane; 

@SuppressWarnings("serial") 
public class MyButtonListener extends AbstractAction { 
    private NoMouseListenerNeeded mainGui; 

    public MyButtonListener(NoMouseListenerNeeded mainGui) { 
     super("Press Me"); 
     putValue(MNEMONIC_KEY, KeyEvent.VK_P); 
     this.mainGui = mainGui; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     Object cell = mainGui.getSelectedCell(); 

     if (cell != null) { 
      String message = "Selection is: " + cell; 
      JOptionPane.showMessageDialog(mainGui, message, "Selection", JOptionPane.PLAIN_MESSAGE); 
     } 
    } 
} 
+0

jtableにActionListenerを追加するにはどうすればよいですか?それはMouseListenerを許可するだけです –

+0

@Dungeoun ??? JTableにActionListenerを追加するときはいつですか?私は自分の答えを読み返したが、それをそこに見つけることはできないし、そこにあるべきでもない。いいえ、通常どおり、JButtonに必要なものにActionListenerを追加します。 –

+0

しかし、まずその行をクリックしてテーブルから行を選択し、削除ボタンをクリックして削除アクションを実行する必要があります。したがって、2つの別々のアクション。テーブルに1つ、ボタンに1つ。 –

関連する問題