2017-02-02 2 views
7

Ich verwende eine einzelne Zeile JTabel mit einem MouseAdapter daran. Das Tabellenmodell enthält einige zufällige Werte. Wenn Sie mit der rechten Maustaste auf die Tabelle klicken, wird ein JPopupMenu mit mehreren JMenuItems angezeigt. Visuelle Artefakte beginnen zu zeigen, wenn ein Teil des Popups außerhalb des Panels gezeichnet wurde, an dem es zu einem bestimmten Zeitpunkt hängt. Interessanterweise scheint dies nur dann zu passieren, wenn dem Popup nicht viele Elemente angehängt sind. Jedes Popup mit mehr als sieben Elementen hat für mich konsequent funktioniert.Warum verursacht ein kleines JPopupMenu visuelle Artefakte, während ein größeres nicht?

Nur unter Windows 10 64 Bit mit Java 1.8.0_112-b15 getestet.

Warum passiert das und gibt es einen Workaround?

JPopupMenu artifact

public class PopupTest { 

    private static final int NUM_POPUP_ITEMS = 3; 

    private JFrame frame = new JFrame(); 
    private JPanel panel = new JPanel(); 
    private TableModel model = new TableModel(); 
    private JTable table = new JTable(); 

    public static void main(String[] a) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new PopupTest(); 
      } 
     }); 
    } 

    public PopupTest() { 
     panel.setLayout(new BorderLayout()); 
     panel.add(table, BorderLayout.CENTER); 
     panel.setPreferredSize(new Dimension(400, 500)); 
     table.setModel(model); 
     table.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mousePressed(MouseEvent event) { 
       popup(event); 
      } 
     }); 
     frame.setLocation(150, 150); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setContentPane(panel); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private void popup(MouseEvent e) { 
     if (SwingUtilities.isRightMouseButton(e)) { 
      JPopupMenu menu = new JPopupMenu(); 
      for (int i = 0; i < NUM_POPUP_ITEMS; i++) { 
       menu.add(new JMenuItem(String.valueOf(i))); 
      } 
      menu.show(panel, e.getX(), e.getY()); 
     } 
    } 

    private class TableModel extends AbstractTableModel { 

     private List<Double> dataList = new ArrayList<>(); 

     public TableModel() { 
      for (int i = 0; i < 40; i++) { 
       dataList.add(Math.random()); 
      } 
     } 

     @Override 
     public int getRowCount() { 
      return dataList.size(); 
     } 

     @Override 
     public int getColumnCount() { 
      return 1; 
     } 

     @Override 
     public Object getValueAt(int rowIndex, int columnIndex) { 
      return dataList.get(rowIndex); 
     } 
    } 
} 
+0

Does Die Tabelle in Scrollpane zu setzen macht einen Unterschied – MadProgrammer

+0

Nein, tut es nicht.In meinem Original-Code ist die Tabelle zu einem JScrollPane hinzugefügt und es verhält sich genau die gleiche Art. – Emiel

+3

Ich versuchte den Code zur Verfügung gestellt (was ausgezeichnet war, BTW) mit JDK 7/8, konnte das Problem unter Windows 10 jedoch nicht reproduzieren. Dies könnte ein Bildschirmtreiberproblem sein imilar? –

Antwort

0

kann leider nicht comment ‚Ursache des niedrigen Ruf :(. Anstatt die Schaffung eines neuen JPopupMenu für jeden Klick hinzufügen, erstellen Sie einfach ein einziges Menü. Siehe http://www.java2s.com/Tutorial/Java/0260__Swing-Event/Rightclicktotriggerthepopupmenu.htm.

+0

Das ist wahrscheinlich nicht die Ursache des Problems. – VGR

+0

Ich bin rostig: Was passiert mit all den anderen JPopupMenus? –

+0

Sobald eine Komponente keine Verweise hat und nicht [anzeigbar] ist (https://docs.oracle.com/javase/8/docs/api/java/awt/Component.html#isDisplayable--), ist sie für "Müll" geeignet Sammlung wie jedes andere Objekt. – VGR

Verwandte Themen