2016-07-19 6 views
2

Java GUI에서 예기치 않은 동작이 발생합니다. JTable이 포함 된 JScrollPane을 만들고 싶습니다. JScrollPaneFrame에 추가하고 싶습니다. 여기 JTable이 포함 된 JScrollPane에서 TableModel이 호출되지 않습니다.

코드입니다 :

public class UrlsScrollPanel extends JScrollPane { 
private static final long serialVersionUID = 1L; 

public UrlsScrollPanel() { 

    //setup urls and collections 
    ArrayList<URL> urls = URL.getAll(); 
    ArrayList<Collection> collections = new ArrayList<>(); 
    for(URL url : urls) collections.add(new Collection(url)); 

    //table 
    String[] columns = {    
     "database", 
     "status", 
     "consumption", 
     "last snapshot date", 
     "last message", 
     "details", 
     "stop collect" 
    }; 

    AbstractTableModel dataModel = new AbstractTableModel() { 
     private static final long serialVersionUID = 1L; 

     @Override 
     public Object getValueAt(int rowIndex, int columnIndex) { 
      System.out.printf("row: %d, column: %d \n", rowIndex, columnIndex); //is never called. 
      URL url = urls.get(rowIndex); 
      Collection collection = collections.get(rowIndex); 
      ArrayList<Message> lastMessages = collection.getLastSnapshot().getMessages(); 
      Message lastMessage = lastMessages.get(lastMessages.size() - 1); 

      if(columnIndex == 0) return url.toString(); 
      if(columnIndex == 1) return collection.getStatus(); 
      if(columnIndex == 2) return ConsumptionChart.getChartPanel(collection); 
      if(columnIndex == 3) return collection.getLastSnapshot().getDate(); 
      if(columnIndex == 4) return String.format("[ %s ] %s", lastMessage.getDate(), lastMessage.getBody()); 
      return "Comming soon."; 
     } 

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

     @Override 
     public int getColumnCount() { 
      return columns.length; 
     } 

     @Override 
     public boolean isCellEditable(int row, int column) { 
      return false; 
     } 
    }; 
    JTable table = new JTable(dataModel); 
    add(table); 
    setBackground(Color.red); 
    setSize(500, 500); 
} 
} 

그리고 여기에 내가 전화하는 방법입니다

public static void main(String[] args) {   
    JFrame frame = new JFrame(); 
    frame.setVisible(true); 
    frame.setResizable(true); 
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
    frame.setLocationRelativeTo(null); 
    UrlsScrollPanel panel = new UrlsScrollPanel(); 
    frame.add(panel, BorderLayout.CENTER); 
    SwingUtilities.updateComponentTreeUI(frame); 
} 

결과가 즉시 사라지는 프레임의 왼쪽 상단에 깜박이는 붉은 광장입니다. 또한 dataModel은 절대로 호출되지 않는 것처럼 보입니다.

내가 잘못하고있는 일에 도움이된다면 시간 내 주셔서 감사합니다.

답변

2

연장JScrollPane. 대신, table구조JScrollPane에 사용 접근이 here을 설명

frame.add(new JScrollPane(table), BorderLayout.CENTER); 

; 완전한 예가 here으로 표시됩니다. setViewportView()을 사용하는 대체 접근법은 here입니다.

이 두 가지가 서로 유사하지 않습니까? How a Scroll Pane Works에 도시 된 바와 같이

JScrollPane panel = new JScrollPane(); panel.add(table); 
… 
JScrollPane panel = new JScrollPane(table); 

호는 제 제제는 ScrollPaneLayout의 중심 위치를 점유하고 상기 table을 표시하는 데 사용되었을 JViewport 요소를 대체 JScrollPane 직접 table을 추가한다. 두 번째 공식은 내부적으로 setViewportView(table)을 호출하며 스크롤 창의 JViewport에 표시 할 구성 요소를 알려줍니다.

+0

좋아, 방금 변경되었습니다. 클래스가 JScrollPane을 더 이상 확장하지 않고 getPanel() 메서드를 가지고 있습니다. 그러나 나는 아직도 나의 이전 접근이 효과가없는 이유를 이해하지 못한다. 은 입니다. JScrollPane 패널 = 새 JScrollPane(); panel.add (table);' 'JScrollPane panel = new JScrollPane (table)'과 유사하지 않습니까? 도움 주셔서 감사합니다. PS : 기본 레이아웃이기 때문에 JFrame에 구성 요소를 추가 할 때 BorderLayout.CENTER를 지정할 필요가 없습니다. –

+0

좋은 질문입니다. 나는 위에서 정교했다. – trashgod

+0

설명 해 주셔서 감사합니다. –