2013-04-27 156 views
0

沒有人知道爲什麼
System.out.println(e.getFirstIndex()); System.out.println(e.getLastIndex()); 兩者什麼都不做?我的聽衆沒有正確註冊?我想知道什麼時候選擇了某個單元格並對其執行操作。就像通過鼠標或鍵選擇單元格的默認文本一樣。ListSelection監聽器沒有觸發事件

package VLGui; 

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.text.DateFormat; 
import java.util.*; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.ListSelectionModel; 
import javax.swing.Timer; 
import javax.swing.table.*; 

import VLCore.cellSelectedListener; 


public class mainFrame extends JFrame{ 

    private JLabel lblTime; 
    private Vector columnName = new Vector(); 
    private Vector tblData = new Vector(); 
    private JTable JTbl; 
    private Timer timer = new Timer(1000,new MyListener()); 

    private JPanel topPnl,cenPnl,btmPnl; 
    private Calendar time; 

    private Object[] columnNames = {"Veh No.","Description","Time In","Time Out"}; 

    public mainFrame() 
    { 
     timer.start(); 
     //jtable settings 
     JTbl = new JTable(new DefaultTableModel(columnNames,1)); 
     JTbl.setPreferredScrollableViewportSize(JTbl.getPreferredSize()); 
     JTbl.setFillsViewportHeight(true); 
     JTbl.setCellSelectionEnabled(false); 
     JTbl.setColumnSelectionInterval(0,0); 
     JTbl.setRowSelectionInterval(0,0); 
     JTbl.getSelectionModel().addListSelectionListener(new cellSelectedListener(JTbl)); 
     //Settings 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setTitle("Vehicle Log"); 
     setSize(500,1000); 
     setVisible(true); 

     //Dec 
     JScrollPane tableContainer = new JScrollPane(JTbl); 
     topPnl = new JPanel(); 
     cenPnl = new JPanel(); 
     btmPnl = new JPanel(); 
     lblTime = new JLabel(); 


     //Adding Components 
     topPnl.add(lblTime,BorderLayout.CENTER); 
     cenPnl.add(tableContainer); 


     getContentPane().add(topPnl,BorderLayout.NORTH); 
     getContentPane().add(cenPnl,BorderLayout.CENTER); 
     //add(btmPnl); 

    } 

    public class MyListener implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      time = Calendar.getInstance(); 
      lblTime.setText(time.getTime().toString()); 
      lblTime.repaint(); 
     } 

    } 
} 




package VLCore; 

import javax.swing.JTable; 
import javax.swing.ListSelectionModel; 
import javax.swing.event.ListSelectionEvent; 
import javax.swing.event.ListSelectionListener; 

public class cellSelectedListener implements ListSelectionListener { 
private JTable jTbl; 

    public cellSelectedListener() 
    { 

    } 

    public cellSelectedListener(JTable tbl) 
    { 
     jTbl = tbl; 
    } 

    @Override 
    public void valueChanged(ListSelectionEvent e) { 
     ListSelectionModel lsm = (ListSelectionModel)e.getSource(); 
     System.out.println(e.getFirstIndex()); 
     System.out.println(e.getLastIndex()); 
    } 

} 

回答

1

問題是,該行已被選中。

表選擇模型涉及行的選擇更改。

如果更改您註冊偵聽如下的順序...

JTbl.getSelectionModel().addListSelectionListener(new cellSelectedListener(JTbl)); 
JTbl.setColumnSelectionInterval(0, 0); 
JTbl.setRowSelectionInterval(0, 0); 

你會看到行選擇變化。

更新代碼審查...

通常,這是JTbl.setPreferredScrollableViewportSize(JTbl.getPreferredSize());不是一個好主意。你真的想把它留給滾動窗格來做出這些決定。如果您確實想要影響表格的寬度,則可以更改列大小。

的Java命名慣例表明,所有的實例變量以小寫字符,所以JTbl將成爲jTbl各階級開始以大寫字母,所以mainFrame將成爲MainFrame ...小的事情,但它的人民是真正用來。

+0

好的。刪除我的答案,以避免混淆。 – 2013-04-27 07:20:15

+0

@MelNicholson做了一點挖掘和WTF? ;) – MadProgrammer 2013-04-27 07:21:43

+0

是的。我發現的問題不是那個問題所在。 – 2013-04-27 07:23:17