Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 隐形JFrame/JTable快多少?_Java_Performance_Swing_Jtable_Jframe - Fatal编程技术网

Java 隐形JFrame/JTable快多少?

Java 隐形JFrame/JTable快多少?,java,performance,swing,jtable,jframe,Java,Performance,Swing,Jtable,Jframe,我有一个swing应用程序。使用jframe,其中包含大量包含大型JTable的内部帧。 这些jtables会不断更新,因此需要进行大量的重新绘制 在某些情况下,我可以简单地保持JFrame不可见。(帧设置可见(假)) 我想知道是否有人知道我是否会在表现上有所收获 (重要或不重要的事情) 比如50%的收益或者你只能得到2%的收益 也许还可以解释一下会发生什么 谢谢 p、 美国。 另一种重新表述问题的方式是: swing组件是否足够聪明,不会在不可见的情况下重新绘制/回流其自身???我认为您应该在

我有一个swing应用程序。使用jframe,其中包含大量包含大型JTable的内部帧。 这些jtables会不断更新,因此需要进行大量的重新绘制

在某些情况下,我可以简单地保持JFrame不可见。(帧设置可见(假))

我想知道是否有人知道我是否会在表现上有所收获 (重要或不重要的事情)

比如50%的收益或者你只能得到2%的收益

也许还可以解释一下会发生什么

谢谢

p、 美国。 另一种重新表述问题的方式是:
swing组件是否足够聪明,不会在不可见的情况下重新绘制/回流其自身???

我认为您应该在不显示JTable时暂时断开TableModel与JTable的连接

您面临的最大问题是JTable对模型更改事件做出反应,并不断地重新绘制自身


也有可能JTable足够智能,在不可见时不会重新绘制自身(但有模型更改),但我不会把钱花在这上面。

我认为您应该在不显示JTable时暂时断开TableModel与JTable的连接

您面临的最大问题是JTable对模型更改事件做出反应,并不断地重新绘制自身


也有可能JTable足够智能,不会在不可见的情况下重新绘制自身(但有模型更改),但我不会把钱花在这上面。

解决这个问题的最佳方法是测试两者。如果你对这两个选项都进行了分析,但没有发现任何好处,那么你可以尝试另一条路线,如sola建议的那样。请确保您没有优化应用程序的错误部分。

解决此问题的最佳方法是同时测试这两个部分。如果你对这两个选项都进行了分析,但没有发现任何好处,那么你可以尝试另一条路线,如sola建议的那样。请确保您没有优化应用程序的错误部分。

我无法给出您将看到多少性能提升的数字,这取决于太多的因素,最好由您自己分析。但是,如果您的组件不可见,那么就我所知,也不会调用paintComponent()或repaint()方法

我无法给出您将看到多少性能提升的任何数字,这取决于太多的因素,最好由您自己分析。但是,如果您的组件不可见,那么就我所知,也不会调用paintComponent()或repaint()方法

看看那些有一些关于绘画效率的有用提示的网站。例如:

在具有复杂输出的组件上, 应使用调用repaint() 仅定义 需要更新的矩形,而不是 而不是无参数版本,这会导致 要重新绘制的整个组件

呈现复杂输出的组件 应该巧妙地使用夹子 矩形以缩小绘图范围 交叉操作 使用剪辑区域

也很容易证明不可见的组件没有涂漆。以下代码隐藏面板并在调用paint时打印

public static void main(String args[]) throws Exception {
    JFrame f = new JFrame();
    final JPanel p = new JPanel(){
        public void paint(Graphics g){
            super.paint(g);
            System.out.println("IN PAINT");
            g.fillRect(10, 10, 20, 20);
        }
    };
    f.setLayout(new BorderLayout());
    f.add(p, BorderLayout.CENTER);

    JButton b = new JButton("OK");
    b.addActionListener(new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("PRESSED");
            p.setVisible(!p.isVisible());
        }
    });
    f.add(b, BorderLayout.SOUTH);
    f.setSize(100,100);
    f.setVisible(true);
}
看一看那些关于绘画效率的有用提示。例如:

在具有复杂输出的组件上, 应使用调用repaint() 仅定义 需要更新的矩形,而不是 而不是无参数版本,这会导致 要重新绘制的整个组件

呈现复杂输出的组件 应该巧妙地使用夹子 矩形以缩小绘图范围 交叉操作 使用剪辑区域

也很容易证明不可见的组件没有涂漆。以下代码隐藏面板并在调用paint时打印

public static void main(String args[]) throws Exception {
    JFrame f = new JFrame();
    final JPanel p = new JPanel(){
        public void paint(Graphics g){
            super.paint(g);
            System.out.println("IN PAINT");
            g.fillRect(10, 10, 20, 20);
        }
    };
    f.setLayout(new BorderLayout());
    f.add(p, BorderLayout.CENTER);

    JButton b = new JButton("OK");
    b.addActionListener(new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("PRESSED");
            p.setVisible(!p.isVisible());
        }
    });
    f.add(b, BorderLayout.SOUTH);
    f.setSize(100,100);
    f.setVisible(true);
}

如果您的JTable位于JScrollPane中,它似乎会在每一行都重新绘制(并调用模型中插入的fireTableRowsInserted)。因此,因为滚动窗格将更新它的scollbar,然后更新它包含的组件(JTable)。如果您的表格不在滚动窗格中,那么它将只重新绘制显示的行。因此,如果您的线条没有显示,您将不会触发重新绘制。。。昏迷。我正在寻找一种方法来避免这种情况。

如果您的JTable位于JScrollPane中,它似乎会在每一行中重新绘制(并调用fireTableRowsInserted您的模型)。因此,因为滚动窗格将更新它的scollbar,然后更新它包含的组件(JTable)。如果您的表格不在滚动窗格中,那么它将只重新绘制显示的行。因此,如果您的线条没有显示,您将不会触发重新绘制。。。昏迷。我正在寻找一种避免这种情况的方法。

是否需要在添加表的新记录后立即向用户显示它们?不需要。在某些情况下,我很乐意让它隐形一两个小时……然后不用更新表模型,您可以将记录放在队列中。然后,在某个时间间隔内(例如x秒或分钟),您可以使用所有排队的信息刷新表模型。但我不确定是否如您所注意到的那样,由于重新绘制而存在性能问题。当对同一组件有一系列重新绘制请求时,只有1个由Swing完成,即最后一个请求。Swing知道某个组件是否不可见是否需要在添加新记录后立即向用户显示该表的新记录?不,我不知道。在某些情况下,我很乐意让它隐形一两个小时……然后不用更新表模型,您可以将记录放在队列中。然后,在某个时间间隔内(例如x秒或分钟),您可以使用所有排队的信息刷新表模型。但我不确定是否如您所注意到的那样,由于重新绘制而存在性能问题。当对同一组件有一系列重新绘制请求时,只有1个由Swing完成,最后一个请求。Swing知道组件是否不可见,这才是真正的问题。。。jtable是否为智能eno