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?
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);
}
}
}
Does Die Tabelle in Scrollpane zu setzen macht einen Unterschied – MadProgrammer
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
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? –