2016-07-19 19 views
2

Ich habe ein unerwartetes Verhalten mit der Java-GUI. Ich möchte eine JScrollPane erstellen, die eine JTable enthält, dann diese JScrollPane zu einer Frame hinzufügen. HierTableModel, das nicht in einem JScrollPane aufgerufen wird, das eine JTable enthält

ist der Code:

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); 
} 
} 

Und hier ist, wie ich es nennen:

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); 
} 

Das Ergebnis ist ein rotes Quadrat ist an der oberen linken Ecke des Rahmens blinkt dann verschwindet sofort. Auch die dataModel scheint nie aufgerufen zu werden.

Jede Hilfe in was ich falsch mache ist sehr geschätzt, danke für Ihre Zeit!

Antwort

2

Nicht erweiternJScrollPane. Verwenden Sie stattdessen Ihre table zu Konstrukt ein JScrollPane:

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

Der Ansatz here beschrieben wird; ein vollständiges Beispiel wird gezeigt here; Ein alternativer Ansatz unter Verwendung von setViewportView() wird untersucht here.

Sind diese beiden nicht ähnlich?

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

No. Wie in How a Scroll Pane Works gezeigt, fügt die erste Formulierung, die table direkt mit dem JScrollPane, die JViewport Komponente ersetzen, die die zentrale Position in der ScrollPaneLayout und die verwendet worden wäre, nimmt die table anzuzeigen. Die zweite Formel ruft intern setViewportView(table) auf, wodurch der Bildlaufbereich JViewport angezeigt wird, welche Komponente angezeigt werden soll.

+0

Ok, ich habe mich gerade geändert, meine Klasse erweitert JScrollPane nicht mehr und besitzt eine Methode getPanel(). Allerdings verstehe ich immer noch nicht, warum mein früherer Ansatz nicht funktioniert. Ist 'JScrollPane Panel = neue JScrollPane(); panel.add (Tabelle); ' nicht ähnlich zu' JScrollPane panel = neuer JScrollPane (Tabelle) '? Danke für Ihre Hilfe! PS: Beim Hinzufügen einer Komponente zu einem JFrame muss BorderLayout.CENTER nicht angegeben werden, da dies das Standardlayout ist. –

+0

Gute Frage; Ich habe oben ausgearbeitet. – trashgod

+0

Danke für die Erklärung, es macht jetzt Sinn! –