2017-09-17 17 views
1

私はJavaのRMIとスイングで作業していますが、データベースから値を読み取っていますが、このコードでは選択した行の値を読み取ることができません。私はすべてのデータベースを表示するためにJTableにしたい、そして、それはサーバー内の利用可能なすべてのデータベースを表示していますが、これで選択された行の値を読み取ることができません選択された行のjtableの値を読み取る

パッケージschoolclient;

import javax.swing.*; 
import javax.swing.event.ListSelectionEvent; 
import javax.swing.event.ListSelectionListener; 
import javax.swing.table.*; 

import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.util.*; 
import schoolserver.SchoolInterface; 


public class DatabaseList { 
    JFrame jFrame = null; 
    JPanel jPanel = null; 
    JList jList = null; 
    JTable jTable = null; 
    String data = null; 
    schoolserver.SchoolInterface schoolInt = null; 

    public DatabaseList(SchoolInterface sii) { 

     schoolInt = sii; 
     jFrame = new JFrame(); 
     jTable = new JTable(){ 
      public boolean isCellEditable(int row, int column) {     
       return false;    
     } 
     }; 
     jTable.setModel(createTable()); 
     jTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     jTable.addMouseListener(new MouseAdapter() { 
      public void MouseClicked(MouseEvent e) { 
       if(SwingUtilities.isLeftMouseButton(e) && (e.getClickCount() == 2)) { 
        new createListSelection(); 
       } 
      } 
     }); 
     JScrollPane scrollPane = new JScrollPane(jTable); 
     jFrame.add(scrollPane); 
     jFrame.setSize(200, 200); 
     jFrame.setVisible(true); 
    } 

    private DefaultTableModel createTable() { 
     DefaultTableModel dtm = new DefaultTableModel(); 
      dtm.addColumn("Databases", createArray()); 
     return dtm; 
    } 

    private class createListSelection implements ListSelectionListener { 
     @Override 
     public void valueChanged(ListSelectionEvent e) { 
      if(!e.getValueIsAdjusting()) { 
       ListSelectionModel lsm = jTable.getSelectionModel(); 
       data = (String) jTable.getValueAt(jTable.getSelectedRow(), 0); 
       System.out.println(data); 
       } 
     } 
    } 

    Object[] createArray() { 

     ArrayList<Object> al = null; 
     Object[] x = null; 

     try { 
      al = schoolInt.availableDatabases(); 
      x = new Object[al.size()]; 
      int i = 0; 
      for(Object o : schoolInt.availableDatabases()) 
       x[i++] = o; 
     } 
     catch(Exception e) { 
      JOptionPane.showMessageDialog(null, "no connection to database or " 
        + "remote server availabe", "Server Information", JOptionPane.OK_OPTION); 
     } 

     return x; 
    } 
} 
+0

なぜリスナー内からリスナーを作成していますか?それはどういうわけか、正しく見えません。リスナーをJTableに一度追加してからそれに応答するのはなぜですか? –

+0

このコードの変更点を教えてください – user8297824

+0

いいえ - 私が持っていないリソースが必要なため、このコードを実行できません。しかし、もう一度、なぜあなたのコードがこの奇妙な方法で書かれているのか、つまり何をしようとしているのかを説明してください。ダミーデータを入れ、自分でコンパイルして実行できるようにコードを編集することを検討してください。 –

答えて

0

あなたは複雑すぎるように見えます。リスナー内でリスナーを再追加するのではなく、リスナー、MouseListenerをJTableに追加して一度追加するだけです。その中でダブルクリック(プレス)を確認し、応答します。何かのように:

jTable.addMouseListener(new MouseAdapter() { 
     @Override 
     public void mousePressed(MouseEvent e) { 
      if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 2) { 
       data = (String) jTable.getValueAt(jTable.getSelectedRow(), 0); 
       System.out.println(data); 
      } 
     } 

    }); 

その他の問題、あなたのMouseAdapterの中のあなたの方法は、これまで、呼び出されません。

jTable.addMouseListener(new MouseAdapter() { 
     public void MouseClicked(MouseEvent e) { 
      // .... 
     } 
    }); 

あなたの総額が間違っている、とMouseAdapterの/のMouseListenerは(のmouseClickedメソッドを持っていないのでmouseClicked)、このメソッドは呼び出されません。 かもしれないと思われる方法の上に常に@Override注釈を置いてください。そうでない場合は、コンパイラに警告させてください。これを済ませれば、コンパイラからの警告がすぐに得られます。あなたがJTableのに選択リスナーを追加することはありませんあなたのコメント

  • について

    。繰り返しますが、MouseAdapter内のメソッドは、大文字ではないため正しく呼び出されません。

  • 呼び出されたとしても、ListSelectionListenerを何回繰り返し使用していますか?
  • ダブルクリックにのみ応答するのが目的の場合、ListSelectionListenerは必要なものではありません。この状況では、MouseListenerだけが動作します。
  • 適切なチュートリアルを読んでください。これらのすべてとよく説明されています。 Swing Infoタグ内のリンクを確認してください。
+0

私はなぜlistselectionlistenerからうまくいかないのか聞いてみるかもしれませんが、私はあなたの説明が私に知識を与えることができる初心者です – user8297824

+0

@ user8297824:edit to answer please –

関連する問題