2012-03-03 24 views
0

このような動作が必要な場合:JTableセルを指しているマウスカーソルが表示される場合は、ポップアップメニューなどを表示する必要があります。セル上でマウスをクリックしないでください。助言がありますか?JTableのセルにマウスカーソルを置くと、ポップアップメニューが表示されます

+3

私はツールチップを理解していますが、ポップアップメニューは非常に面倒です。ポップアップメニューを表示するには、一度クリックする必要があります。ポップアップメニューを表示するには、ポップアップメニューを隠すために100回以上クリックするよりも好きです。 –

+0

@JBNizetはそれに依存しています。 – dvigal

答えて

3

JB Nizetは良い点があります。 OTOH、私はこの例を準備しました。そして、「私たちは技術を持っています」。

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

class TimesTable { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JTable t = new JTable(new TimesTableModel()); 
       t.setDefaultRenderer(Object.class, new TimesTableRenderer()); 

       JOptionPane.showMessageDialog(null, t); 
      } 
     }); 
    } 
} 

class TimesTableRenderer extends DefaultTableCellRenderer { 
    @Override 
    public Component getTableCellRendererComponent(
     JTable table, 
     Object value, 
     boolean isSelected, 
     boolean hasFocus, 
     int row, 
     int column) { 

     Component c = super.getTableCellRendererComponent(
      table,value,isSelected,hasFocus,row,column); 
     JComponent jc = (JComponent)c; 
     jc.setToolTipText(
      (row+1) + "x" + (column+1) + "=" + ((row+1)*(column+1))); 
     return jc; 
    } 
} 

class TimesTableModel extends DefaultTableModel { 
    @Override 
    public int getColumnCount() { 
     return 7; 
    } 

    @Override 
    public int getRowCount() { 
     return 5; 
    } 

    @Override 
    public Object getValueAt(int row, int column) { 
     return new Integer((row+1)*(column+1)); 
    } 
} 
0

お世話になりました。私はセル内のデータを変更する必要がありますが、マウスクリックが1つしかないようにしてください!私が上で話したことは、それが変種からのものです。私は2つのボタンを持つポップアップメニューを持っています: "アクセス"と "禁止"。その私はあなたがそれについて考える何

public class PopupMenuMouseMotionListener implements MouseMotionListener { 
    private JXTreeTable jxTreeTable; 
    private TreeTableModel model; 
    private JPopupMenu popupMenu; 
    private boolean inCell = false; 
    private Rectangle r = null; 
    private boolean visible = false; 
    private long startTime = 0L; 
    private Component[] buttons; 

    PopupMenuMouseMotionListener(JXTreeTable jxTreeTable, TreeTableModel model, JPopupMenu popupMenu) { 
     this.jxTreeTable = jxTreeTable; 
     this.model  = model; 
     this.popupMenu = popupMenu; 
     this.buttons  = popupMenu.getComponents(); 
    } 

    public void mouseDragged(MouseEvent event) { 
     //Does nothing 
    } 

    public void mouseMoved(MouseEvent event) { 
     Point point = event.getPoint(); 
     int row = jxTreeTable.rowAtPoint(point); 
     int column = jxTreeTable.columnAtPoint(point); 
     double time = 0.0; 
     if (column >= 1) { 
      if (startTime == 0L) { 
       startTime = System.currentTimeMillis(); 
      }; 
      long ms = System.currentTimeMillis() - startTime; 
      time = ms/1000 + ms % 1000; 
      if (r == null) { 
       r = jxTreeTable.getCellRect(row, column, false); 
      }; 
      inCell = true; 
      Component c = event.getComponent(); 
      if (inCell && r.contains(point)) { 
       if (time >= 100.50 && visible == false) { 
        popupMenu.show(c, r.x, r.y); 
        visible = true; 
       } 
      } else { 
       popupMenu.setVisible(false); 
       inCell = false; 
       startTime = 0L; 
       r = null; 
       visible = false; 
      } 
     } else popupMenu.setVisible(false); 
    } 
} 

...そのような解決策を思い付きましたか?

関連する問題