我正在使用一个附有MouseAdapter的单行JTabel。表格模型由一些随机值填充。右键单击表格后,将出现一个带有多个JMenuItems的JPopupMenu。如果弹出菜单的某些部分曾经绘制在其所附加的面板之外,则会出现视觉伪影。有趣的是,只有当弹出菜单没有许多项目附加时,才会发生这种情况。对于我而言,任何具有超过七个项目的弹出窗口都一直正常工作。
仅在Windows 10 64位和Java 1.8.0_112-b15上进行了测试。
为什么会这样,是否有解决方法?
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);
}
}
}
-Dsun.java2d.d3d=false
或-Dsun.java2d.opengl=true
,可能会有所帮助。 - VGR