2017-02-02 3 views
7

MouseAdapter가 첨부 된 단일 행 JTabel을 사용하고 있습니다. 테이블 모델은 임의의 값으로 채워집니다. 테이블을 마우스 오른쪽 버튼으로 클릭하면 여러 JMenuItem이있는 JPopupMenu가 나타납니다. 시각적 아티팩트는 팝업의 일부가 패널 외부에 그려져 있는지 여부를 보여주기 시작합니다. 흥미롭게도 이것은 팝업에 많은 항목이 첨부되어 있지 않은 경우에만 발생하는 것으로 보입니다. 7 개가 넘는 항목이있는 팝업은 지속적으로 작동합니다.작은 JPopupMenu가 시각적 인 인공물을 일으키는 반면 왜 큰 JPopupMenu는 시각적 인 인공물을 생성합니까?

Java 1.8.0_112-b15가 설치된 Windows 10 64 비트에서만 테스트되었습니다.

왜 이런 일이 발생하며 해결 방법이 있습니까?

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

합니까를 scrollpane에 테이블을 넣는 데 차이가 있습니다 – MadProgrammer

+0

아니요 내 orignal 코드에서 테이블이 JScrollPane에 추가되고 똑같은 방식으로 동작합니다 – Emiel

+3

JDK 7/8,하지만 Windows 10에서 문제를 재현하지 못했습니다. 이것이 디스플레이 드라이버 문제일까요? 이뮤얼? –

답변

0

죄송합니다, 단 하나의 메뉴를 만들, :(. 대신 모든 클릭에 대해 새로운 JPopupMenu를 창조의 저 명성 의견 '원인을 추가 할 수 없습니다. http://www.java2s.com/Tutorial/Java/0260__Swing-Event/Rightclicktotriggerthepopupmenu.htm를 참조하십시오.

+0

이는 문제의 원인이되지 않습니다. – VGR

+0

녹슨 해요. 다른 JPopupMenu는 어떻게 될까요? –

+0

구성 요소에 참조가없고 [표시 가능] (https://docs.oracle.com/javase/8/docs/api/java/awt/Component.html#isDisplayable--)되지 않으면 가비지를받을 수 있습니다 다른 개체와 마찬가지로 컬렉션. – VGR

관련 문제