gpt4 book ai didi

java - 未在包含 JTable 的 JScrollPane 中调用 TableModel

转载 作者:行者123 更新时间:2023-11-30 08:35:03 25 4
gpt4 key购买 nike

我在使用 Java GUI 时出现意外行为。我想创建一个包含 JTableJScrollPane,然后将此 JScrollPane 添加到 Frame

代码如下:

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

结果是一个红色方 block 在框架的左上角闪烁,然后立即消失。此外,似乎从未调用过 dataModel

非常感谢对我做错的任何帮助,感谢您的宝贵时间!

最佳答案

不要扩展 JScrollPane。相反,使用您的 table构造 JScrollPane:

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

描述了该方法here ;显示了一个完整的示例 here ;研究了使用 setViewportView() 的替代方法 here .

Are these two not similar?

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

JScrollPane panel = new JScrollPane(table);

没有。如图How a Scroll Pane Works ,第一个公式将 table 直接添加到 JScrollPane , 替换 JViewportScrollPaneLayout中占据中心位置的组件这将用于显示 table。第二种形式在内部调用 setViewportView(table),它告诉滚动 Pane 的 JViewport 要显示的组件。

关于java - 未在包含 JTable 的 JScrollPane 中调用 TableModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38456362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com