2013-04-27 152 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