尝试在表刷新后保留排序器位置

2023-12-21

我有以下方法:

private void passStingR(StringBuilder retVal) throws BadLocationException {

int scrollPositionR = scrollR.getVerticalScrollBar().getValue();//get value of scroll position stores in javas memory

windowR.remove(scrollR);
tableR.getModel();
modelR.setRowCount(0);

Document docR = null;
try {
docR = loadXMLFromString(retVal.toString());//pull in the XML data into a new doc
} catch (Exception ex) {
Logger.getLogger(remit.class.getName()).log(Level.SEVERE, null, ex);
}

populate1R(docR);


tableR.getTableHeader().setReorderingAllowed(false);//prevent user from changing column order now at refresh level   

SimpleDateFormat time_formatterR = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String current_time_strR = time_formatterR.format(System.currentTimeMillis());

updatetFieldR.setText(current_time_strR);

scrollR.remove(tableR);
tableR = new JTable(modelR)
{
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);

Font myFont = new Font("Arial",Font.PLAIN,10);
Font myFont1 = new Font("Arial", Font.BOLD,10);
 if (!isRowSelected(row)) {
                    if (tableR.getColumnCount() >= 0) {
                              String type = (String) getModel().getValueAt(row, 11);
                        c.setBackground("0.0".equals(type) ? Color.RED : Color.WHITE);
                        c.setForeground("0.0".equals(type) ? Color.WHITE : Color.BLACK);
                        c.setFont("0.0".equals(type) ? myFont1: myFont);

                    }

 }  



 return c;



};
};



TableColumn column = null;
    for (int i = 0; i < 18; i++) {
        column = tableR.getColumnModel().getColumn(i);
          if (i == 0) {
            column.setPreferredWidth(70); //sport column is bigger
          }
            if (i == 1) {
            column.setPreferredWidth(500); //sport column is bigger
             } 
                if (i == 7) {
            column.setPreferredWidth(30); //sport column is bigger
             }
               if (i == 8) {
            column.setPreferredWidth(20); //sport column is bigger
             }
                   if (i == 9) {
            column.setPreferredWidth(25); //sport column is bigger
             }
             if (i == 14) {
            column.setPreferredWidth(500); //sport column is bigger
             }
               if (i == 15) {
            column.setPreferredWidth(10); //sport column is bigger
             }
               if (i == 16) {
            column.setPreferredWidth(20); //sport column is bigger
             }

    }

 tableR.getTableHeader().setReorderingAllowed(false);//prevent the user from sorting the columns at intialise GUI stage even though the user cannnot change this      

 RowSorter<TableModel> sorter = new TableRowSorter<>(modelR);//creating a new sorter here from my modelR

tableR.setRowSorter(sorter);//set the sorter positon

scrollR = new JScrollPane(tableR);      
windowR.add(scrollR);

windowR.validate();

scrollR.getVerticalScrollBar().setValue(scrollPositionR);


    }

然后我在上面的代码中创建一个排序器,如下所示

RowSorter<TableModel> sorter = new TableRowSorter<>(modelR);//creating a new sorter here from my modelR

tableR.setRowSorter(sorter);//set the sorter positon

这允许我对特定列进行排序并对列进行排序。 然而,一旦刷新发生,排序器就会重置: 刷新过程为:

public void actionPerformed(ActionEvent e) {
Object source = e.getSource();

String stringfromDateR =  tffromDateR.getText();
String stringtoDateR =  tftoDateR.getText();

if(source == buttonR){
  if(timerR != null) {
      System.out.print("cancel");
      timerR.cancel();

    } 
//  System.out.print("cancel1bbbbb");
timerR = new Timer();    
//auto refresh begins
int delayR = 0; //0 seconds startup delay
int periodR = 7000; //x seconds between refreshes
timerR.scheduleAtFixedRate(new TimerTask() 


{    

public void run() {

try {
    getdataR(stringfromDateR,stringtoDateR);
 } catch (IOException | BadLocationException ex) {
 Logger.getLogger(JavaApplication63.class.getName()).log(Level.SEVERE, null, ex);           

}



      }
  }, delayR, periodR);    
} 

if(source == buttonR1){


 if(timerR != null) {
        timerR.cancel();
    }
modelR.setRowCount(0);
} 


    }

and then

private void getdataR(String stringfromDateR,String stringtoDateR) throws IOException, BadLocationException {

StringBuilder retVal = new StringBuilder();
URL oracle = new URL("XXXXXXXXXXXXXXXXXXXXX" );
BufferedReader in = new BufferedReader(new InputStreamReader(oracle.openStream()));

String newLine = "\n";
String inputLine;
while ((inputLine = in.readLine()) != null) {
            System.out.println(inputLine);
retVal.append(inputLine).append(newLine);

}

in.close();

passStingR(retVal);

    }

刷新后如何保留排序器。我不确定是否设置

modelR.setRowCount(0); 

导致分拣机失去其分拣机位置。

我确实尝试过 get sortkeys 但这不起作用,我也尝试过 在刷新发生之前

RowSorter<? extends TableModel> tablesorterpos = tableR.getRowSorter();

然后申请

tableR.setRowSorter(tablesorterpos);

刷新后但这不起作用

这就是我尝试过的

private void passStingR(StringBuilder retVal) throws BadLocationException {
 RowSorter<TableModel> sorter = new TableRowSorter<>(modelR);//creating a new sorter here from my modelR
List<? extends SortKey> sorterR = sorter.getSortKeys();
int scrollPositionR = scrollR.getVerticalScrollBar().getValue();//get value of scroll position stores in javas memory

windowR.remove(scrollR);
tableR.getModel();
modelR.setRowCount(0);

Document docR = null;
try {
docR = loadXMLFromString(retVal.toString());//pull in the XML data into a new doc
} catch (Exception ex) {
Logger.getLogger(remit.class.getName()).log(Level.SEVERE, null, ex);
}

populate1R(docR);


tableR.getTableHeader().setReorderingAllowed(false);//prevent user from changing column order now at refresh level   

SimpleDateFormat time_formatterR = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String current_time_strR = time_formatterR.format(System.currentTimeMillis());

updatetFieldR.setText(current_time_strR);

scrollR.remove(tableR);
tableR = new JTable(modelR)
{
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);

Font myFont = new Font("Arial",Font.PLAIN,10);
Font myFont1 = new Font("Arial", Font.BOLD,10);
 if (!isRowSelected(row)) {
                    if (tableR.getColumnCount() >= 0) {
                              String type = (String) getModel().getValueAt(row, 11);
                        c.setBackground("0.0".equals(type) ? Color.RED : Color.WHITE);
                        c.setForeground("0.0".equals(type) ? Color.WHITE : Color.BLACK);
                        c.setFont("0.0".equals(type) ? myFont1: myFont);

                    }

 }  



 return c;



};
};



TableColumn column = null;
    for (int i = 0; i < 18; i++) {
        column = tableR.getColumnModel().getColumn(i);
          if (i == 0) {
            column.setPreferredWidth(70); //sport column is bigger
          }
            if (i == 1) {
            column.setPreferredWidth(500); //sport column is bigger
             } 
                if (i == 7) {
            column.setPreferredWidth(30); //sport column is bigger
             }
               if (i == 8) {
            column.setPreferredWidth(20); //sport column is bigger
             }
                   if (i == 9) {
            column.setPreferredWidth(25); //sport column is bigger
             }
             if (i == 14) {
            column.setPreferredWidth(500); //sport column is bigger
             }
               if (i == 15) {
            column.setPreferredWidth(10); //sport column is bigger
             }
               if (i == 16) {
            column.setPreferredWidth(20); //sport column is bigger
             }

    }

 tableR.getTableHeader().setReorderingAllowed(false);//prevent the user from sorting the columns at intialise GUI stage even though the user cannnot change this      


sorter.setSortKeys(sorterR);
tableR.setRowSorter(sorter);//set the sorter positon


scrollR = new JScrollPane(tableR);      
windowR.add(scrollR);

windowR.validate();

scrollR.getVerticalScrollBar().setValue(scrollPositionR);


    }

我收到此错误:

at javax.swing.DefaultRowSorter.rowsDeleted(DefaultRowSorter.java:880)
at javax.swing.JTable.notifySorter(JTable.java:4276)
at javax.swing.JTable.sortedTableChanged(JTable.java:4120)
at javax.swing.JTable.tableChanged(JTable.java:4397)
at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:296)
at javax.swing.table.AbstractTableModel.fireTableRowsDeleted(AbstractTableModel.java:261)
at javax.swing.table.DefaultTableModel.setNumRows(DefaultTableModel.java:321)
at javax.swing.table.DefaultTableModel.setRowCount(DefaultTableModel.java:339)
at javaapplication63.remit.passStingR(remit.java:238)
at javaapplication63.remit.getdataR(remit.java:227)
at javaapplication63.remit.access$000(remit.java:60)
    at javaapplication63.remit$1.run(remit.java:187)
    at java.util.TimerThread.mainLoop(Timer.java:555)
    at java.util.TimerThread.run(Timer.java:505)

您可以从以下位置获取当前排序键DefaultRowSorter。所以基本逻辑是:

  1. 获取排序键()
  2. 刷新表模型
  3. 设置排序键(...)

Edit:

import java.awt.*;
import java.awt.event.*;
import java.util.List;
import javax.swing.*;
import javax.swing.table.*;

public class TableSortSSCCE extends JPanel
{
    private String[] columnNames = {"First Name",
                                    "Last Name",
                                    "Sport",
                                    "# of Years",
                                    "Vegetarian"};

    private Object[][] data =
    {
        {"Kathy", "Smith", "Snowboarding", new Integer(5), new Boolean(false)},
        {"John", "Doe", "Rowing", new Integer(3), new Boolean(true)},
        {"Sue", "Black", "Knitting", new Integer(2), new Boolean(false)},
        {"Jane", "White", "Speed reading", new Integer(20), new Boolean(true)},
        {"Joe", "Brown", "Pool", new Integer(10), new Boolean(false)}
    };

    private JTable table;


    public TableSortSSCCE()
    {
        super(new BorderLayout());

        DefaultTableModel model = new DefaultTableModel(data, columnNames);
        table = new JTable(model);
        table.setPreferredScrollableViewportSize( table.getPreferredSize() );
        table.setAutoCreateRowSorter(true);

        JScrollPane scrollPane = new JScrollPane(table);
        add(scrollPane, BorderLayout.CENTER);

        JButton clear = new JButton("Clear Table");
        clear.addActionListener( new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                DefaultTableModel model = (DefaultTableModel)table.getModel();
                model.setRowCount(0);
            }
        });
        add(clear, BorderLayout.NORTH);


        JButton reload = new JButton("Reload Table");
        reload.addActionListener( new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                TableRowSorter sorter = (TableRowSorter)table.getRowSorter();
                List<? extends RowSorter.SortKey> sortKeys = sorter.getSortKeys();

                DefaultTableModel model = new DefaultTableModel(data, columnNames);
                table.setModel(model);
                table.setAutoCreateRowSorter( true );

                sorter = (TableRowSorter)table.getRowSorter();
                sorter.setSortKeys( sortKeys );
            }
        });
        add(reload, BorderLayout.SOUTH);
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("TableSortSSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        TableSortSSCCE newContentPane = new TableSortSSCCE();
        frame.setContentPane(newContentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args)
    {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试在表刷新后保留排序器位置 的相关文章

随机推荐

  • 对 r 中的索引对对数组进行子集化

    尽管我进行了搜索 但我找不到我的问题的直接答案 假设我有一个数组 vector1 lt c 5 9 3 vector2 lt c 10 11 12 13 14 15 result lt array c vector1 vector2 dim
  • 在 Sublime Text 中将多行文本列组合在一起

    假设我有 2 列 每列有 10 亿行 它们是这样开始的 Column 1 I said She said it said Column 2 you re amazing he s awesome enough already 我尝试突出显示
  • OpenAPI 缺少 FastAPI 应用程序中某些 Pydantic 模型的架构

    我正在构建一个 FastAPI 应用程序 其中有很多 Pydantic 模型 尽管应用程序工作得很好 但正如预期的那样 OpenAPI Swagger UI 文档没有显示所有这些模型下的架构Schemas部分 这是pydantic的内容sc
  • Spring Webflux 禁用登录

    让我简短地描述一下我现在面临的问题 我已经为 webflux 应用程序配置了 spring security 当我尝试访问不需要身份验证的路由时 我收到登录表单提示 路线是 swagger ui 它应该在没有任何登录表单或其他内容的情况下打
  • 在 TensorFlow 中运行具有不同批量大小的已保存模型的最佳方法是什么?

    下雨了TensorFlow 存储库中的 Cifar10 示例模型 https github com tensorflow tensorflow tree master tensorflow models image cifar10使用bat
  • 如何在泛型集合上创建扩展方法

    我有一个包含 FrameworkElements 的列表 我想创建一个名为 MoveToTop 的扩展方法 这一切要做的就是接受属于该列表一部分的项目并将其移动到列表的开头 我知道这可以在不使用扩展方法的情况下完成 但我希望将其作为扩展方法
  • 从不均匀分布的集合中删除项目

    我有一个网站 用户可以提交问题 每天零个 一个或多个 对其进行投票并每天回答一个问题 更多详细信息here https stackoverflow com questions 8600909 distribution among users
  • 获取静态初始化块以在 java 中运行而不加载类

    我有一些课程 如下所示 public class TrueFalseQuestion implements Question static QuestionFactory registerType TrueFalse Question pu
  • 我的航站楼里有啤酒:怎么办?

    Brew puts a picture of a tiny beer in my terminal 它是如何做到这一点的 我什至不知道 但我需要知道 因为我未来的所有命令行应用程序也必须在其输出中放入小图片 它可能只是一个 unicode
  • 为脚本标签指定 ID

    我遇到了一个场景script元素一个id属性可以轻松解决问题 然而 在阅读了有关script元素在w3学校 http www w3schools com TAGS tag script asp and 怪异模式 http www quirk
  • swipeRefresh 运行时替换 Fragment 无法正常工作

    我有片段 A 其中包括 SwipeRefresh 和 RecycleView 当用户单击 RecycleView 中的某个项目时 我替换一个新的片段 即 B mAdapter setOnItemClickListener new MyAda
  • Ruby App MVC 框架(非 Web)

    有人听说过用于应用程序 脚本的 Ruby MVC 框架吗 当 Rails 出现时 它是一个革命性的工具 因为它将 MVC 带给了广大 Web 开发人员 并第一次迫使他们使用设计模式和约定 我正在寻找类似的东西 但用于编写从 cron 或用户
  • Java 中的数组列表

    在 Java 中创建数组列表的语法是什么 我已经尝试过以下方法 List
  • 取消 [self PerformSelector:... withObject:nil afterDelay:20];

    我使用下面的代码在 viewDidLoad 中调用方法 sr 如何在该方法 sr 调用之前取消它 self performSelector selector sr withObject nil afterDelay 20 NSObject
  • 使用 JQuery 动态重复和删除表单元素

    我有一个带有附加添加和删除按钮的表单 单击这些按钮后 相同的表单行将被重复或完全删除 div class container div
  • 如何在折线图或散点图中添加 3 个以上系列?

    当我尝试在折线图或散点图中添加 3 个以上系列时 出现异常 在谷歌浏览器中 未捕获的类型错误 对象 object Object 的属性 未定义 不是函数 在火狐中 Ext chart Shape type 不是函数 停止此错误 attr E
  • 将 url 传递到从 RabbitMQ 消费的 scrapy 中的 parse 方法

    我正在使用 scrapy 来消费来自 RabbitMQ 的消息 url 但是当我使用yield 调用将我的 url 作为参数传递的解析方法时 该程序不在回调方法中 下面是我的以下代码蜘蛛 coding utf 8 import scrapy
  • wx中如何同步两个网格的滚动条

    创建一个自定义 wx frame 以包含一个内部有两个网格控件的拆分窗口 它用于比较每个网格中的数据 此时两个网格的滚动条需要支持同步滚动 问题 如何获取这两个网格的滚动事件 我尝试将 wx EVT SCROLL 事件放入框架中 但失败了
  • javascript中的undefined是什么类型? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有人能告诉我 JavaScript 中未定义的类型是什么吗 typeof undefined 会返回什么 什么是未定义 在 JavaScr
  • 尝试在表刷新后保留排序器位置

    我有以下方法 private void passStingR StringBuilder retVal throws BadLocationException int scrollPositionR scrollR getVerticalS