私はJavaプロジェクトを作成しており、JTable
. 私がやりたいことは、 を にリンクするpopupmenu
ことjtable
です。にpopupmenu
は 4 つの異なる がありitems
ます。で選択したitems
、知っておく必要のあるものの一部。問題は関数にあります。適切な を返す関数を取得できません。をクリックすると、クリックしたのと同じ列にポップされます。しかし、または-functions (ラベル「addSelected」または「deleteSelected」の menuItem 内) を使用し、(s) が選択されていない場合は、-functions を使用して でクリックしているを見つけます。のようだrow
jtable
selectRow
row
jtable
right mouse button
popupmenu
addSelectedRow
removeSelectedRow
row
selectRow
row
right mousebutton
rowAtPoint(Point p)
正しい行を見つけるだけではありません。0 または -1 を返します。私はこの問題にほぼ1週間苦労しているので、コードをポン引きしてください:D コードが十分にきれいであることを願っています:D
<--編集済み--> http://painkiller.comlu.com/images/1.jpg
これが問題のスクリーンショットです。
JTable
常に少なくとも 1 つの行があります。任意の行をクリックします (この状況では 2 番目row
)。Row
目的で選ばない。「Lisäävalittu」を押すと、「Add selected
」を意味し、関数selectRow()
が呼び出されます。
/ * *場所
jTbl.getLocation(): java.awt.Point[x=0,y=0]
e.getPoints() java.awt.Point[x=4,y=8]
SwingUtilities.convertPoint(e.getComponent(), e.getPoint(), jTbl) java.awt.Point[x=350,y=31]
最初に試したe.getPoint()
*e.getPoints() -> java.awt.Point[x=4,y=8]
からの行インデックス番号が返されましたrowAtPoint()
: 0
それから私は試しましたSwingUtilities.convertPoint()
* SwingUtilities.convertPoint(tablePopMenu, e.getPoint(), jTbl);
- >java.awt.Point[x=28,y=10]
返された行インデックス番号からrowAtPoint()
:2
動作しているように見えますが、関数が -1 または 0 をスローすることがあります (そのバグを確認する必要があります)。
<-- -->
private void TableMousePressed(java.awt.event.MouseEvent evt) {
try
{
/*
* The popupmenu content (items) are standart for all tables
* The label of popupmenu items are used to select proper
* command in select case
* 1. Add selected-> Add only selected row(s)
* 2. Add all -> Add all rows
* 3. Delete selected -> Remove only selected row(s)
* 4. Delete all-> Remove all row(s)
*/
javax.swing.JTable temp; //Temporar jTable alien
String label = ((javax.swing.JMenuItem)evt.getSource()).getText(); //Switch Case
temp = (javax.swing.JTable)((JPopupMenu)(evt.getComponent().getParent())).getInvoker();
switch(label) //Select rigt method by jMenuItem.getText() method (the label of menu item) {
case "Add selected":
addSelectedRow(evt, temp);
break;
case "Add all":
addAllRows(temp);
break;
case "Delete selected":
removeSelectedRow(evt, temp);
break;
case "Delete all":
removeAllRows(temp);
break;
}
}
catch(Exception ex){ex.printStackTrace();}
}
/**
* @param e - MouseEvent
* @param jTbl - JTable which will be used
*/
private void addSelectedRow(java.awt.event.MouseEvent e, javax.swing.JTable jTbl){
if(jTbl.getSelectedRow() == -1){ //If no row(s) is selected
selectRow(e, jTbl); //select row
}
int cellCount = jTbl.getModel().getColumnCount(); //amount of columns to apply
int rows[] = jTbl.getSelectedRows(); //amount of rows to apply
cellCollection = new Object[jTbl.getModel().getColumnCount()]; //Object which contains row and cells. will be added to a jTable as a new row
for(int row = 0; row < rows.length; row++){ //Creates new row by excisting data
for(int cell = 0; cell < cellCount; cell++){
cellCollection[cell] = jTbl.getModel().getValueAt(rows[row], cell);
}
((DefaultTableModel)jTbl.getModel()).addRow(cellCollection); //Adds a new row with data
}
}
/**
* @param jTbl - JTable which will be used
*/
private void addAllRows(javax.swing.JTable jTbl){
int rowCount = jTbl.getModel().getRowCount(); //Amount of adding rows
int cellCount = jTbl.getModel().getColumnCount(); //Amount of adding colums
cellCollection = new Object[jTbl.getModel().getColumnCount()]; //New object which contains a row with columns filled with excisting data in a for-loop
for(int row = 0; row < rowCount; row++){
for(int cell = 0; cell < cellCount; cell++){
cellCollection[cell] = jTbl.getModel().getValueAt(row, cell);
}
((DefaultTableModel)jTbl.getModel()).addRow(cellCollection);
}
}
/**
* @param e - MouseEvent
* @param jTbl - JTable which will be used
*/
private void removeSelectedRow(java.awt.event.MouseEvent e, javax.swing.JTable jTbl){
if(jTbl.getSelectedRow() == -1){ //If no row(s) is selected
selectRow(e, jTbl); //selects a row
}
int[] rows = jTbl.getSelectedRows(); //Get selected row(s)
for(int i = rows.length - 1; i >= 0; i--)
((DefaultTableModel)jTbl.getModel()).removeRow(rows[i]); //Removes the rows
getTableToLife(jTbl); //Adds a new empty row if jtable has no rows after removing
}
/**
* @param jTbl - JTable which will be used
*/
private void removeAllRows(javax.swing.JTable jTbl){
int rowCount = jTbl.getModel().getRowCount(); //Amount of removing rows
for(int row = rowCount-1; row >=0; row--){
((DefaultTableModel)jTbl.getModel()).removeRow(row); //Remove rows
}
getTableToLife(jTbl);//Adds a new empty row if jtable has no rows after removing
}
/**
* @param jTbl - JTable which will be saved
*/
private void getTableToLife(javax.swing.JTable jTbl){
if(jTbl.getModel().getRowCount() == 0){ //If jtable has no rows
int cellCount = jTbl.getModel().getColumnCount(); //How many cells will be added
cellCollection = new Object[cellCount];
for(int cell = 0; cell < cellCount; cell++){
cellCollection[cell] = null; //No new data is required }
((DefaultTableModel)jTbl.getModel()).addRow(cellCollection); //Adding a new empty row
}
}
/**
* @param e - Mouse event
*/
private void selectRow(java.awt.event.MouseEvent e, javax.swing.JTable jTbl)
{
// This is the main problem at the moment
// System.out.print("\r " + jTbl.rowAtPoint(e.getPoint()));
// ListSelectionModel selector = jTbl.getSelectionModel();
// selector.removeSelectionInterval(0, jTbl.getHeight()); //I though it he could help, but no effect (row [0] seems to be selected
// int p = jTbl.rowAtPoint(e.getPoint()); //or this function seems to be uncapable to find right row i clicked on jtable
// selector.setSelectionInterval(p, p); //returns 0 or -1. reason is unknown
// New solution
ListSelectionModel selector = jTbl.getSelectionModel();
Point newP = SwingUtilities.convertPoint(tablePopMenu, e.getPoint(), jTbl);
int p = jTbl.rowAtPoint(newP);
System.out.print("\rRow number: " + (p));
if(p <=0)
selector.setSelectionInterval(p, p);
else
selector.setSelectionInterval(p-1, p-1);
}
私の一日を救ってくれてありがとう!