小编San*_*ari的帖子

java等待光标显示问题

我在应用程序中显示等待光标时遇到问题.只要鼠标位于定义自己光标的面板上方,就不会出现等待光标.如果面板未更改光标,则会出现等待光标.

我附上了SSCE来准确解释我的问题.

public class BusyCursorTest extends javax.swing.JFrame {

public BusyCursorTest() {

    javax.swing.JMenuBar menuBar = new javax.swing.JMenuBar();
    javax.swing.JMenu menu = new javax.swing.JMenu("Menu");
    javax.swing.JMenuItem wait1 = new javax.swing.JMenuItem("Wait 100 ms");
    javax.swing.JMenuItem wait2 = new javax.swing.JMenuItem("Wait 250 ms");
    javax.swing.JMenuItem wait3 = new javax.swing.JMenuItem("Wait 500 ms");
    javax.swing.JMenuItem wait4 = new javax.swing.JMenuItem("Wait 1000 ms");
    menu.add(wait1);
    menu.add(wait2);
    menu.add(wait3);
    menu.add(wait4);
    menuBar.add(menu);
    setJMenuBar(menuBar);
    wait1.addActionListener(getActionListener(this, delayActionListener(100)));
    wait2.addActionListener(getActionListener(this, delayActionListener(250)));
    wait3.addActionListener(getActionListener(this, delayActionListener(500)));
    wait4.addActionListener(getActionListener(this, delayActionListener(1000)));

    cursorPanel = new javax.swing.JPanel();
    cursorPanel.addMouseListener(new java.awt.event.MouseAdapter() {

        public void mouseEntered(java.awt.event.MouseEvent e) {
            cursorPanel.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.CROSSHAIR_CURSOR));
        }

        public void mouseExited(java.awt.event.MouseEvent …
Run Code Online (Sandbox Code Playgroud)

java swing busy-cursor

15
推荐指数
1
解决办法
2万
查看次数

java swing清除事件队列

是否可以以标准方式执行此操作?

这是场景.

  1. 开始在EDT中做一些昂贵的事情(EDT被阻止,直到昂贵的操作结束).

  2. 当EDT被阻止时,用户继续单击/拖动鼠标按钮.所有鼠标操作都记录在某处.

  3. 当EDT是免费的(用昂贵的东西完成)时,它开始处理鼠标事件.

我在步骤3中想要的是丢弃堆积的鼠标事件.在EDT免费之后,任何新的鼠标事件都应该以通常的方式处理.

关于如何实现这一点的任何想法.

PS:我不可能阻止EDT被阻止(我不控制程序中某些模块的行为).

编辑:如果我可以安全地调用"SunToolkit.flushPendingEvents()",那么在开始EDT中的昂贵操作之前,我总是可以放一个玻璃板.在昂贵的操作结束后,在EDT线程上,冲洗所有事件 - 他们将进入一个不做任何事情的玻璃窗格.然后让EDT正常工作.

EDIT2:我添加了一个SSCCE来演示这个问题.


public class BusyCursorTest2 extends javax.swing.JFrame {

    public BusyCursorTest2() {

        javax.swing.JButton wait = new javax.swing.JButton("Wait 3 seconds");
        getContentPane().setLayout(new java.awt.GridLayout(2, 1, 0, 0));
        getContentPane().add(wait);
        getContentPane().add(new javax.swing.JToggleButton("Click me"));
        setTitle("Busy Cursor");
        setSize(300, 200);
        setDefaultCloseOperation(javax.swing.JFrame.DISPOSE_ON_CLOSE);
        setVisible(true);

        wait.addActionListener(new java.awt.event.ActionListener() {

            public void actionPerformed(java.awt.event.ActionEvent event) {

                final java.util.Timer timer = switchToBusyCursor(BusyCursorTest2.this);

                try {
                    //do something expensive in EDT
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        //do nothing
                    }
                } finally {
                    switchToNormalCursor(BusyCursorTest2.this, timer);
                } …

java swing eventqueue event-dispatch-thread

5
推荐指数
1
解决办法
7184
查看次数

sqlite drop index非常慢

我有一个大约75 GB的sqlite数据库.在数据库上创建索引需要将近4个小时.索引后,文件大小约为100 GB.

通常,我必须修改(插入/删除/更新)大块(几GB)的数据.截至目前,我正在修改表之前删除索引.修改完成后,将重新创建索引.

删除索引需要花费大量时间(与创建索引的顺序相同).

在一些非常特殊的情况下(当需要重新生成整个数据时),我可以写入新的数据库文件并将其替换为原始数据库文件.这个策略并不要求我放弃指数.

如果我不能只切换数据库文件,我该怎么做才能加快索引删除?欢迎任何建议/想法.

这是我认为单个文件数据库的局限之一.如果表/索引存储在单独的文件中,那么这些文件可以简单地标记为已删除.

sqlite indexing sql-drop

5
推荐指数
0
解决办法
627
查看次数

在不创建新副本的情况下获取数组的一部分

我试图找到一种在不创建新副本的情况下切片超大型阵列的解决方案/解决方法。这是我的问题。

假设我有大量的double / int,大小都在1亿或更多。我将代表不同事物的许多不同数组存储在一个非常大的数组中,以大大节省内存使用量。因此,我没有一个大小为100的一百万个数组,而是一个大小为一亿的单个数组。我存储索引(开始和停止)以跟踪我的数据。

我想获得数千个大小为100的切片。如果我使用Arrays.copyOfRange()方法获取切片,则由于将每个切片都是消耗内存的新副本,因此无法实现将所有内容放入单个大数组的目的。

我有一些遗留代码(多年来,许多人写了超过一百万行),它们可以处理自己的数据(较小的数组)。不可能修改现有代码以在大型数组中使用索引(开头,结尾)。

如果我能以某种方式返回原始数组,使得返回的数组是一个引用(或假装为),其中索引0是原始大型数组中的某个任意索引,那将很棒。

在C / C ++中,我可以轻松地返回具有特定偏移量和长度的指针,调用代码可以使用该偏移量和长度。

我在Java中有哪些选择?

编辑:我看了以下类似的问题,但它不包含对我的问题的答复。 如何在Java中获取数组的子数组而不复制数据?

java arrays

5
推荐指数
1
解决办法
3974
查看次数

最大的空球体或矩形

在N(~500)维度中,我希望找出最大的球体或矩形,使得球体/矩形不包含已存在的点.整个点集合在一个轴对齐的矩形框中(值的下边界和上边界).

我可以用任何已知的多项式时间方法/代码来解决我的问题吗?

两个众所周知的算法:i)矩形中最大的空矩形(http://www.cs.princeton.edu/~chazelle/pubs/ComputLargestEmptyRectangle.pdf),以及ii)在位置约束内找到最大的空圆(http) ://www.cs.dartmouth.edu/reports/TR86-130.pdf)不起作用.

虽然上述算法的复杂度为N log N或N ^ 2 log N,其中N是已存在点的数量,但复杂度也是凸包或边界多边形的顶点数的线性函数.500维的矩形将具有2 ^ 500个角,这使得上述技术不可行.

理想情况下,我正在寻找一种方法(它不必是精确的),它可以确定N(点数)和D(维度)的多项式时间中最大的圆/矩形.

谢谢.

geometry computational-geometry

5
推荐指数
1
解决办法
769
查看次数

java事件队列事件调度刷新/陷阱事件

我有一个与设计相关的问题,我正试图找到答案.

这是场景.

假设您希望由于用户输入而做一些昂贵的(耗时的)(例如从某个数据库加载大量数据,读取大文件).强烈推荐的方法是在单独的线程中完成耗时的工作,永远不会阻止EDT,否则GUI将无法响应.

但是有些情况下,除非后台任务完成,否则不应向GUI提供输入.在我的特定情况下,只有在后台工作完成后,我才能确定哪些GUI元素应该可见并启用/禁用.只有那些应该可见和启用的GUI元素才应该响应用户输入,否则在我的特定情况下行为可能是不可预测的.

这就是我正在做的处理这种情况.

第1步:在我即将开始耗时的操作之前.

  1. 将光标更改为忙碌光标.
  2. 将鼠标侦听器添加到组件顶层框架的玻璃板上.
  3. 使玻璃板可见,以便它可以接收鼠标事件.由于鼠标输入,玻璃板不会做任何事情.

第2步:在后台线程中执行耗时的操作.后台线程有一个finally块,它在作业完成时通知事件线程(由于错误而完成或中止).

第3步:

  1. 将鼠标光标切换回正常状态.
  2. 从玻璃窗格中删除侦听器.
  3. 使玻璃板不可见,以便将鼠标事件发送给预期的收件人.

这是处理这种情况的正确方法吗?

你们推荐什么?

java events swing dispatch

3
推荐指数
1
解决办法
1323
查看次数

java jni异常访问冲突

我使用 JNI 的 java 应用程序崩溃,hs_err_pid 文件给出错误“异常访问冲突”。操作系统是Windows VISTA。

据我所知,我的本机代码非法写入不属于它的内存块。

我过去曾在 Linux 上的纯本机代码上使用 valgrind 来检测此类问题。

但是当使用java时,valgrind就会失败并且无法工作。

您建议使用什么(如果有)方法来识别有问题的代码?

我不可能手动挖掘本机代码(几百万行)来识别它。

java java-native-interface access-violation

0
推荐指数
1
解决办法
3147
查看次数