- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个经常更新的 JTable。它位于滚动 Pane 内。
有时我们会看到一条消息,我们想深入研究一下。不幸的是,由于更新的数量,消息将在我们完成查看之前滚出可见屏幕。
我希望能够在检查消息时卡住视口(viewport)/滚动,但仍允许表格模型使用新消息进行更新。
我可以使用这段代码让选定的行转到顶部:
int firstSelectedRow = table.getSelectedRow();
Rectangle rowLocation = table.getCellRect(firstSelectedRow, 0, false);
scroll.getVerticalScrollBar().setValue(rowLocation.y);
freezeScrolling.setText("Resume Updates");
但这只会在按下按钮时发生,然后它会迅速滚开。
有没有办法告诉视口(viewport)/滚动 Pane 卡住所选内容并关闭它,以便滚动 Pane 按照您的预期进行更新?
最佳答案
好吧,这个很逗我,所以我花了一些时间来找到解决这个问题的方法。我找到了两个选项:
这是一个说明这两种机制的 SSCCE(不要介意代码设计的愚蠢,我测试了一堆东西——扩展 JScrollPane 实际上不是一个好主意,它都可以在外部完成)。
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
public class Tables {
private static class JScrollPaneExtension extends JScrollPane implements TableModelListener, AdjustmentListener {
private boolean frozen = false;
private Vector<String> rowData;
private final JTable table;
private final MyTableModel tableModel;
private JScrollPaneExtension(JTable table, MyTableModel tableModel) {
super(table);
this.table = table;
this.tableModel = tableModel;
tableModel.addTableModelListener(this);
getVerticalScrollBar().addAdjustmentListener(this);
}
public boolean isFrozen() {
return frozen;
}
public void setFrozen(boolean frozen) {
if (frozen != this.frozen) {
this.frozen = frozen;
if (frozen) {
captureCurrentTopRowData();
} else {
rowData = null;
}
}
}
private void captureCurrentTopRowData() {
int row = table.rowAtPoint(getViewport().getViewPosition());
if (row > -1) {
rowData = (Vector<String>) tableModel.getDataVector().get(row);
}
}
@Override
public void adjustmentValueChanged(AdjustmentEvent e) {
if (frozen) {
captureCurrentTopRowData();
scrollToRowData();
}
}
@Override
public void tableChanged(TableModelEvent e) {
scrollToRowData();
}
private void scrollToRowData() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
if (frozen) {
int index = tableModel.getDataVector().indexOf(rowData);
getViewport().setViewPosition(table.getCellRect(index, 0, true).getLocation());
}
}
});
}
}
public static class MyTableModel extends DefaultTableModel {
private int count;
private boolean frozen = false;
private List<Vector<String>> buffer = new ArrayList<Vector<String>>();
public MyTableModel() {
addColumn("Test");
}
public void insertNewRow() {
Vector<String> rowData = createNewRowData();
if (isFrozen()) {
buffer.add(rowData);
} else {
insertRow(0, rowData);
}
}
private Vector<String> createNewRowData() {
Vector<String> data = new Vector<String>(1);
data.add("Hello-" + (count++));
return data;
}
public boolean isFrozen() {
return frozen;
}
public void setFrozen(boolean frozen) {
if (frozen == this.frozen) {
return;
}
this.frozen = frozen;
if (!frozen) {
flushBuffer();
}
}
private void flushBuffer() {
for (Vector<String> rowData : buffer) {
insertRow(0, rowData);
}
}
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final MyTableModel model = new MyTableModel();
JTable table = new JTable(model);
final JScrollPaneExtension scroll = new JScrollPaneExtension(table, model);
JPanel panel = new JPanel();
final JButton freeze = new JButton("Freeze");
freeze.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
if (model.isFrozen()) {
freeze.setText("Freeze model");
} else {
freeze.setText("Continue");
}
model.setFrozen(!model.isFrozen());
}
});
final JButton freeze2 = new JButton("Freeze scroll");
freeze2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
if (scroll.isFrozen()) {
freeze2.setText("Freeze scroll");
} else {
freeze2.setText("Resume scroll");
}
scroll.setFrozen(!scroll.isFrozen());
}
});
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
frame.add(scroll);
panel.add(freeze);
panel.add(freeze2);
frame.getContentPane().add(panel, BorderLayout.NORTH);
frame.pack();
frame.setVisible(true);
Timer t = new Timer();
t.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
model.insertNewRow();
}
});
}
}, new Date(), 300);
}
}
关于java - 如何卡住滚动 Pane 内的 JTable 行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10451008/
如果附加了 'not-scroll' 类,我希望我的 body 不滚动,否则它应该正常工作。 我已经搜索这个问题两天了,但找不到任何适合我的解决方案。 我想要的是向 body 添加一个 class,并
我发现似乎是 iOS Safari 中的错误(我正在 iOS 8 上进行测试)。当绝对定位的 iFrame 漂浮在一段可滚动内容上方时,滚动 iFrame 也会滚动下面的内容。以下 HTML (ava
我有以下代码来显示一系列投资组合图片,这些图片以 SVG 格式存储在滚动 div 中: 在 Safari 中滚动使用两根手指或鼠标滚轮当光标位于 SVG 之一上时不起作用。 该页
我想用 javascript 做的是: 一旦你向下滚动页面,将#sidebar-box-fixed 的位置从 position: relative; 更改为定位:固定;。改回position:rela
我对 Elasticsearch 的滚动功能有点困惑。在 elasticsearch 中,每当用户在结果集上滚动时,是否可以每次调用搜索 API?来自文档 "search_type" => "scan
我试图做到这一点,以便当我向上或向下滚动页面时,它会运行不同的相应功能。我发现了一个类似的问题here但我已经尝试了他们的答案并且没有运气。 注意:此页面没有正常显示的滚动条。没有地方可以滚动。 bo
(C语言,GTK库) 在我的表单上,我有一个 GtkDrawingArea 小部件,我在上面使用 Cairo 绘制 GdkPixbufs(从文件加载)。我想要完成的是能够在窗口大小保持固定的情况下使用
最近我一直在尝试创建一个拉到(刷新,加载更多)swiftUI ScrollView !!,灵感来自 https://cocoapods.org/pods/SwiftPullToRefresh 我正在努
我正在开发一个应用程序,其中有两个带有可放置区域的列表和一个带有可拖动项目的侧面菜单。 当我滚动屏幕时,项目的位置困惑。 我试图在谷歌上寻找一些东西,最后得到了这个问题:jQuery draggabl
我在 UIWebView 中加载了一个 HTML 表单,而我的 UIWebView 恰好从 View 的中间开始并扩展。我必须锁定此 webView 不滚动并将其放在 ScrollView 之上以允许
如何在每个元素而不是整个元素上应用淡入淡出(与其高度相比)? HTML: CSS: * { padding: 0; margin: 0; box-sizing: border
我想使用带有垂直轴的 PageView 并使用鼠标滚动在页面之间移动,但是当我使用鼠标滚动时页面不滚动...仅页面单击并向上/向下滑动时滚动。 有什么办法吗? 我想保留属性 pageSnapping:
我制作这个程序是为了好玩,但我被卡住了,因为程序在屏幕外运行。如何在不完全更改代码的情况下实现滚动条。 public static void main(String args[]) throws IO
我想使用带有垂直轴的 PageView 并使用鼠标滚动在页面之间移动,但是当我使用鼠标滚动时页面不滚动...仅页面单击并向上/向下滑动时滚动。 有什么办法吗? 我想保留属性 pageSnapping:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
使用 jquery 技术从 css-tricks.com 获得滚动/跟随侧边栏,如果您不知道我在说什么,这里是代码: $(function() { var $sidebar = $
我是 jQuery Mobile 新手。我需要向我的应用程序添加 Facebook 滑动面板功能。 我经历了 sliding menu panel ,它工作正常,但我在菜单面板中的内容超出了窗口大小,
有没有办法在 js 或 jQuery 或任何其他工具中检测 ctrl + 滚动。我正在尝试执行一些动态布局代码,我需要检测不同分辨率下的屏幕宽度,我通过使用 setTimeout() 的计时器实现了这
我有一部分html代码:
我想控制 RichTextBox 滚动,但在控件中找不到任何方法来执行此操作。 这样做的原因是我希望当鼠标光标位于 RichTextBox 控件上时鼠标滚轮滚动有效(它没有事件焦点:鼠标滚轮事件由表单
我是一名优秀的程序员,十分优秀!