Я использую одну строку JTabel с прикрепленным к ней адаптером мыши. Модель таблицы заполнена некоторыми случайными значениями. После щелчка правой кнопкой мыши на таблице появится JPopupMenu с несколькими 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);
}
}
}
Does добавление таблицы в scrollpane делает разницу – MadProgrammer
Нет, это не так. В моем коде orignal таблица добавляется в JScrollPane, и она ведет себя точно так же. – Emiel
Я пробовал предоставленный код (что было отлично, BTW) с JDK 7/8, но не смог воспроизвести проблему в Windows 10. Может ли это быть проблемой драйвера дисплея или imilar? –