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!
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. –
Gute Frage; Ich habe oben ausgearbeitet. – trashgod
Danke für die Erklärung, es macht jetzt Sinn! –