java-释放鼠标时对JTable进行排序
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-释放鼠标时对JTable进行排序,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2934字,纯文字阅读大概需要5分钟。
内容图文
![java-释放鼠标时对JTable进行排序](/upload/InfoBanner/zyjiaocheng/695/cfcec8adf05c4dbdaa3d59fc59f1922e.jpg)
我有一个JTable,其属性AutoCreateRowSorter设置为true.单击时效果很好,但是如果在单击时仅将鼠标移动1px,则不会出现排序,这在某些情况下不舒服.如何解决这个问题?
UPD我只想在释放鼠标时显示排序.
解决方法:
肮脏的方法(请阅读:如果您不是绝对地绝望,请确切地知道自己在做什么!请不要这样做),方法是挂接到uiDelegate安装的MouseListener并将排序触发器移到已发布的方法中.这涉及
>一个自定义的MouseListener,它将除单击事件之外的所有事件委托给最初安装的事件,并在传递已发布的事件之前进行排序
>将原件替换为自定义
>更改LAF时更新替换项(因为原始文件由ui控制).这需要JTableHeader的子类化,并在updateUI中进行接线
自定义监听器:
public static class EventHook implements MouseListener {
private JTableHeader header;
private MouseListener delegate;
public EventHook(JTableHeader header) {
this.header = header;
installHook();
}
protected void installHook() {
MouseListener[] listeners = header.getMouseListeners();
for (int i = 0; i < listeners.length; i++) {
MouseListener l = listeners[i];
if (l.getClass().getName().contains("TableHeaderUI")) {
this.delegate = l;
listeners[i] = this;
}
header.removeMouseListener(l);
}
for (MouseListener l : listeners) {
header.addMouseListener(l);
}
}
public void uninstallHook() {
MouseListener[] listeners = header.getMouseListeners();
for (int i = 0; i < listeners.length; i++) {
MouseListener l = listeners[i];
if (l == this) {
listeners[i] = delegate;
}
header.removeMouseListener(l);
}
for (MouseListener l : listeners) {
header.addMouseListener(l);
}
}
@Override
public void mouseReleased(MouseEvent e) {
// sort before calling super
sort(e);
delegate.mouseReleased(e);
}
private void sort(MouseEvent e) {
if (!header.isEnabled()) {
return;
}
// do nothing if dragged
if (header.getDraggedDistance() != 0) {
return;
}
if (e.getClickCount() % 2 == 1 &&
SwingUtilities.isLeftMouseButton(e)) {
JTable table = header.getTable();
RowSorter sorter;
if (table != null && (sorter = table.getRowSorter()) != null) {
int columnIndex = header.columnAtPoint(e.getPoint());
if (columnIndex != -1) {
columnIndex = table.convertColumnIndexToModel(
columnIndex);
sorter.toggleSortOrder(columnIndex);
}
}
}
}
@Override
public void mouseClicked(MouseEvent e) {
// swallow the clicked - want to trigger sort on released
}
@Override
public void mousePressed(MouseEvent e) {
delegate.mousePressed(e);
}
@Override
public void mouseEntered(MouseEvent e) {
delegate.mouseEntered(e);
}
@Override
public void mouseExited(MouseEvent e) {
delegate.mouseExited(e);
}
}
子类化JTableHeader
public static class MyTableHeader extends JTableHeader {
private EventHook hook;
public MyTableHeader(TableColumnModel model) {
super(model);
}
@Override
public void updateUI() {
if (hook != null) {
hook.uninstallHook();
hook = null;
}
super.updateUI();
hook = new EventHook(this);
}
}
用法,可以是JTable的子类并重写createDefaultTableHeader或手动设置标头:
// either subclass
JTable table = new JTable(new AncientSwingTeam()) {
@Override
protected JTableHeader createDefaultTableHeader() {
return new MyTableHeader(getColumnModel());
}
};
table.setAutoCreateRowSorter(true);
内容总结
以上是互联网集市为您收集整理的java-释放鼠标时对JTable进行排序全部内容,希望文章能够帮你解决java-释放鼠标时对JTable进行排序所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。