2017-11-06 10 views
1

私はテーブルを作成しました。このテーブルでは、特定の行がコンボボックスで編集可能です。このコンボボックスを右クリックして開き、左クリックしないでください。私はいくつかのことを試してみましたが、私は、これは私の最も近いアプローチだと思う:JTableとCombobox。右クリックで開く

resultsTable.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseClicked(java.awt.event.MouseEvent evt) { 


       Point p = new Point(evt.getX(), evt.getY()); 
       int row = resultsTable.rowAtPoint(p); 
       int column = resultsTable.columnAtPoint(p); 

       if (resultsTable.getModel().isCellEditable(row, column)) { 
        if (SwingUtilities.isRightMouseButton(evt)) { 
         resultsTable.setRowSelectionInterval(row, row); 
         resultsTable.setColumnSelectionInterval(column, column); 

         resultsTable.editCellAt(row, column); 
         StatusComboBox box = (StatusComboBox) resultsTable.getModel().getValueAt(row, column); 
         box.setVisible(true); 
         box.showPopup(); 
        } 
       } 
      } 
     }); 

しかし、それは私に次のエラー得られます)box.showPopup(によって引き起こされると

java.awt.IllegalComponentStateException: component must be showing on the screen to determine its location 
at java.awt.Component.getLocationOnScreen_NoTreeLock(Component.java:2062) 
at java.awt.Component.getLocationOnScreen(Component.java:2036) 
at javax.swing.JPopupMenu.show(JPopupMenu.java:948) 
at javax.swing.plaf.basic.BasicComboPopup.show(BasicComboPopup.java:209) 
at javax.swing.plaf.basic.BasicComboBoxUI.setPopupVisible(BasicComboBoxUI.java:877) 
at javax.swing.JComboBox.setPopupVisible(JComboBox.java:816) 
at javax.swing.JComboBox.showPopup(JComboBox.java:801) 
at org.zaproxy.zap.extension.authorisationChecker.view.AuthorisationCheckerStatusPanel$1.mouseClicked(AuthorisationCheckerStatusPanel.java:154) 
at java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:270) 
at java.awt.Component.processMouseEvent(Component.java:6536) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) 
at java.awt.Component.processEvent(Component.java:6298) 
at java.awt.Container.processEvent(Container.java:2236) 
at java.awt.Component.dispatchEventImpl(Component.java:4889) 
at java.awt.Container.dispatchEventImpl(Container.java:2294) 
at java.awt.Component.dispatchEvent(Component.java:4711) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4534) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466) 
at java.awt.Container.dispatchEventImpl(Container.java:2280) 
at java.awt.Window.dispatchEventImpl(Window.java:2746) 
at java.awt.Component.dispatchEvent(Component.java:4711) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) 
at java.awt.EventQueue.access$500(EventQueue.java:97) 
at java.awt.EventQueue$3.run(EventQueue.java:709) 
at java.awt.EventQueue$3.run(EventQueue.java:703) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90) 
at java.awt.EventQueue$4.run(EventQueue.java:731) 
at java.awt.EventQueue$4.run(EventQueue.java:729) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 

を。

editCellAtにコンボボックスが表示されるため、このエラーは分かりません。それは(明らかに^^)コンボボックスを開けません。

ありがとうございます!

+0

は短い実行可能な例を([SSCCE](http://sscce.org))を提供してください、私たちはまた、あなたの問題を再現することができます。これにより、お客様のケースに適したソリューションを提供することができます。 –

+0

私のapprochは少し違うかもしれませんが、 'JCombobox'のリスナーの設定/オーバーライドは、テーブルの設定ではなく右クリックで開きますか? – AxelH

+0

@AxelH Thingは、セルエディタをレンダラーではなくコンボボックスに設定しただけです。だから、テーブルに表示されているテキストをクリックすると、コンボボックスはクリックされません。 – CookieAndPizza

答えて

1

セルのエディタとして使用されているコンボボックスにアクセスする必要があります。

Basicのコードは次のようになります。

int row = table.rowAtPoint(e.getPoint()); 
int column = table.columnAtPoint(e.getPoint()); 
table.changeSelection(row, column, false, false); 
table.editCellAt(row, column); 
Component c = table.getEditorComponent(); 

if (c instanceof JComboBox) 
{ 
    JComboBox comboBox = (JComboBox)c; 
    comboBox.showPopup(); 
} 
+0

JComboBox comboBox =(JComboBox)table.getEditorComponent();トリックをしました。ありがとう、一日中検索しています:D – CookieAndPizza

関連する問題