Java GUI에서 예기치 않은 동작이 발생합니다. JTable
이 포함 된 JScrollPane
을 만들고 싶습니다. JScrollPane
을 Frame
에 추가하고 싶습니다. 여기 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
은 절대로 호출되지 않는 것처럼 보입니다.
내가 잘못하고있는 일에 도움이된다면 시간 내 주셔서 감사합니다.
좋아, 방금 변경되었습니다. 클래스가 JScrollPane을 더 이상 확장하지 않고 getPanel() 메서드를 가지고 있습니다. 그러나 나는 아직도 나의 이전 접근이 효과가없는 이유를 이해하지 못한다. 은 입니다. JScrollPane 패널 = 새 JScrollPane(); panel.add (table);' 'JScrollPane panel = new JScrollPane (table)'과 유사하지 않습니까? 도움 주셔서 감사합니다. PS : 기본 레이아웃이기 때문에 JFrame에 구성 요소를 추가 할 때 BorderLayout.CENTER를 지정할 필요가 없습니다. –
좋은 질문입니다. 나는 위에서 정교했다. – trashgod
설명 해 주셔서 감사합니다. –