我知道,repaint()即使使用Swing的线程模型,以前从任何线程调用和其他一些选定的方法都被认为是安全的,但是我最近在评论中告诉我并非如此.
谷歌发现很多旧的讨论说这是安全的,但最近没什么.所有过去曾经说过安全的官方参考文献似乎已经消失了,我在各种论坛上发现了一些人讨论它是如何不再安全的.
我找不到任何正式的东西来确认它是否存在 - 而且我真的希望看到一些解释改变逻辑的东西,如果它已被改变的话.考虑到破坏现有应用程序的风险有多严重,删除它似乎是一个非常奇怪的功能.
我真的在寻找一个官方参考链接(即Javadoc,oracle教程或源代码链接),说明这些方法是否可以安全地从任何线程调用.
这里提到这个问题:
在EDT之外安全使用Component.repaint()?
从现已消失的Sun页面中引用一句话:
以下JComponent方法可以安全地从任何线程调用:repaint(),revalidate()和invalidate().repaint()和revalidate()方法将事件派发线程的请求分别调用paint()和validate().
这符合我的理解,但我现在找不到那个页面或任何类似的页面,我看到几个人的未经证实的谣言说它不再安全.但另一方面,我找不到任何明确的说这个功能已经改变.
改变笔记
可能有助于解决这个问题的是Oracle关于Swing线程处理变化的官方声明.我发现了"Java 7中的更改"页面,但根本没有提到它,这些页面都没有以任何方式提及线程或EDT:
http://docs.oracle.com/javase/7/docs/technotes/guides/swing/enhancements-7.html
http://docs.oracle.com/javase/7/docs/technotes/guides/awt/enhancements-7.html
关于这个问题的宝贵文章 - 由JackPattishallJr提到.
CSS如何对网页特定区域的页面绘制时间产生显着的负面影响?
例如:
我不知道CSS是否根据用户在页面中的位置生效.这种行为是否确定它确实存在?
是否存在可能导致性能不佳的冲突或异常CSS定位,动画等?
CSS样式如何直接和一致地链接到页面性能?具体来说,页面绘制时间.
更新:我根据刚才做的两个测试编辑了问题和示例:
如果我的浏览器没有启用javascript,那么糟糕的性能问题(令人惊讶)就是一致的.
删除有问题区域的样式后,问题得到解决(但不完全,因为现在我的页面很难看).
我注意到我的网页在页面的某个特定区域表现不佳(滞后).
为了研究这个问题,我启用了show paint rectangles并且enable continuous page repainting为了获得关于页面重绘率的一些读数.
这是一个健康的阅读,在我的页面区域响应和顺利:

这是一个不健康的阅读(在问题区域),页面的响应速度很慢,滚动非常滞后:

页面表现完美,顶部有健康的重新绘制率(实际上活动最多的地方),并且在页面的较低区域执行非常(几乎停止).当我离开有问题的区域时,它会恢复到完美的性能.
更新:我完全禁用了Javascript,并获得了与之前相同的性能问题和读数.
我有一个包含许多facebook"Like"按钮的页面,使用内联fbml技术嵌入(而不是iframe).很简单.页面渲染正常,一切都按预期工作.
然而...
一旦我将xmlns:fb="http://www.facebook.com/2008/fbml"名称空间声明添加到文档中,我注意到IE中初始页面呈现时间的急剧下降.仔细检查(使用ie8开发人员工具)显示整个DOM在页面初始加载后的短时间内反复出现"刷新"或"回流".一些进一步的捣乱揭示了回流的数量显然与<fb:xxx>文件中的元素数量成比例.
删除xmlns声明会使问题消失.
以前有人经历过吗?
更新:
一些进一步的挖掘揭示了一些更具体的问题......问题确实是IE正在重新流动页面,包括重新执行任何内联脚本等等.原因似乎并不包含xmlns本身,而是按钮本身的xfbml呈现.添加xmlns只是触发了xfbml渲染,没有xmlns,按钮从未在第一时间呈现.以下标记说明了该问题.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en" xmlns:fb="http://www.facebook.com/2008/fbml">
<head>
<script type="text/javascript">
alert('some inline js');
</script>
</head>
<body>
<div id="fb-root"></div>
<div>
<fb:like href="http://example.local/1" layout="button_count" show_faces="false" width="80" action="like" font="arial" colorscheme="light"></fb:like>
<fb:like href="http://example.local/2" layout="button_count" show_faces="false" width="80" action="like" font="arial" colorscheme="light"></fb:like>
<fb:like href="http://example.local/3" layout="button_count" show_faces="false" width="80" action="like" font="arial" colorscheme="light"></fb:like>
</div>
<script src="http://connect.facebook.net/en_US/all.js#xfbml=1" type="text/javascript"></script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
当在ie中运行时,上面的示例生成3个警报,我希望只看到一个.
我遇到Swing问题,只有在计算机显示器电源关闭时才会出现,但我的Swing应用程序继续在后台运行.看起来每当显示器关闭时,Swing/AWT都会取消所有绘画操作,导致GUI中的一些显示问题在显示器重新打开后立即可见.
例如,当我使用自定义JNI函数关闭监视器并随后打开一个简单的消息对话框时,当监视器重新打开时,消息对话框为空:

但它在下次重绘后正确绘制:

这是Swing的预期行为吗?有没有办法指示Swing即使显示器电源关闭也能继续绘制到屏幕上?
编辑:这是一个SSCCE:
package test;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
public class App {
public static void main(String[] args) throws Throwable {
System.out.println("***** Please turn off the monitor in the next 70 seconds *****");
Thread.sleep(1000L * 70);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JOptionPane.showMessageDialog(null, "Test");
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
我使用的是64位Windows 7 Home Premium SP1和64位Java 1.6.0_24.
编辑2:这是另一个我体验"取消绘画操作"效果的程序:
package test;
import static com.mycompany.Util.turnOffMonitors;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel; …Run Code Online (Sandbox Code Playgroud) 我在C#(VS2010)中创建了一个包含(以及其他)文本框控件的表单.文本框可能在某些时候包含大量数据(约300万个字符).
当滚动或移动的周围没有遇到任何问题的形式,但是当窗体最小化并恢复回来,重绘序列(我相信)被触发引起的大约5-10秒的大滞后的重新绘制表格.
我已经尝试了几种解决方案:
使用双缓冲区 - 根据我所读到的,双缓冲仅适用于表单本身而不适用于其控件
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.UserPaint, true);
禁用文本框redrew一次最小化使用:SendMessage(this.my_textBox.Handle, WM_SETREDRAW, false, 0);
并在表单恢复后启用.我注意到如果我不重新启用文本框重绘,表单重绘延迟也存在.
使用位图的手动双缓冲区 - 与#1类似的结果.
我在某处读到这个问题可能与文本框控件试图缩小或调整到数据量有关,但无法覆盖它.
我以前在MFC中有相同的项目,但没有遇到任何重复或滞后的问题.
请告诉我如何解决这个问题.
可能重复:
Java GUI repaint()问题?
我写了一个Java代码,但是我遇到了GUI问题.当我将一个组件添加到JFrame对象中时,我调用repaint()方法以更新GUI但它不起作用.但是当我最小化或调整此框架的大小时,GUI会更新.
这是我的代码:
public static void main(String[] args)
{
JFrame frame = new JFrame();
frame.setSize(460, 500);
frame.setTitle("Circles generator");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
String input = JOptionPane.showInputDialog("Enter n:");
int n = Integer.parseInt(input);
CircleComponent component = new CircleComponent(n);
frame.add(component);
component.repaint();
}
Run Code Online (Sandbox Code Playgroud) 当我们使用JavaScript 将大量样式更改应用到单个元素时,phpied&Writing Efficient JavaScript(幻灯片87)建议:
而不是使用style.stylename逐个应用样式,使用cssText或更改类名一次应用所有内容,因为它将减少回流/重绘
哪个更好时,有一个只有单一风格的改变?
document.getElementById('myid').style.cssText += ";color:#999;";
Run Code Online (Sandbox Code Playgroud)
要么
document.getElementById('myid').style.color = "#999";
Run Code Online (Sandbox Code Playgroud)
jsperf.com/csstext-vs-styles-single表明,当只有一个样式更改时,使用单独的样式名称比cssText更快.
是否还有其他因素需要考虑?
我正在尝试构建一个简单的绘图工具.该mouseDrag事件创建一个新的椭圆形,并导致我JPanel到repaint().
这到目前为止工作正常.但是,如果我mouseDrag在第一次触发事件之前按下任何按钮(或任何其他UI组件),则按钮将绘制在我面板的左上角.
我已将代码隔离到此测试应用程序中:
import java.awt.BasicStroke;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test extends JFrame
{
public Test()
{
final JPanel paintPanel = new JPanel(){
@Override
protected void paintComponent(Graphics g)
{
Graphics2D g2d = (Graphics2D)g;
g2d.setPaintMode();
g2d.setStroke(new BasicStroke(1));
g2d.fillRect(100, 100, 10, 10);
}
};
paintPanel.setPreferredSize(new Dimension(300,300));
paintPanel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e)
{
paintPanel.repaint();
}
});
this.setLayout(new …Run Code Online (Sandbox Code Playgroud) 在HTML5/JS应用程序中,我们有一些视图,其中包含一些样式,具体取决于data-attribute元素:
喜欢
<li data-level="0"></li>
Run Code Online (Sandbox Code Playgroud)
要么
<li data-level="1"></li>
Run Code Online (Sandbox Code Playgroud)
CSS
li[data-level^="1"] {
/* some styles */
}
Run Code Online (Sandbox Code Playgroud)
这似乎无处不在page reload.
但是当通过JS以编程方式设置data-attribute时,CSS属性将在所有相关的桌面浏览器中呈现,但不会在移动Safari中呈现.
JS部分看起来像这样:
this.$el.attr('data-level', this.model.getLevel())
Run Code Online (Sandbox Code Playgroud)
关于如何强制应用这些属性的任何想法(刷新/重绘某些东西)?
我想避免使用class属性和不同的类,因为事情比这里显示的更复杂......
问题
在IE10上发生.(IE8工作正常.)
我编写了一些JavaScript代码,在20分钟不活动后,将浏览器重定向到另一个URL以指示用户已注销.通常这很好.但是我注意到一个奇怪的情况......如果用户的Windows计算机在此超时期间被锁定,那么看起来好像什么也没发生.
但是,当我查看浏览器的URL栏时,我可以清楚地看到该URL已经更新到自动注销页面.但是浏览器窗口的整个内容仍然显示旧页面!由于某种原因,浏览器窗口没有重新绘制/刷新.它看起来像是冻结了.
此时......如果我在页面上快速鼠标点击,则浏览器"醒来"并显示新内容.(似乎只有一次鼠标点击是不够的.你点击的速度越快,"唤醒"的速度就越快.)
理论
我最好的猜测是IE10浏览器在计算机锁定时停止重新绘制窗口.但是,我确实认为JavaScript引擎仍在运行,因为我在不同的时间间隔测试了另一个具有多个JS新Date()时间戳的场景,当屏幕最终重新绘制时,每个日期时间都是唯一的,显示实际发生的时间.
重新创建问题 - 版本1
我注意到这只发生在重定向到公司本地Intranet上的URL时.我不知道为什么会这样......但如果我有URL作为谷歌或雅虎的主页....那么我无法重新创建这个问题.它只是正常工作.让我想知道它是否可能是某种组策略/可信区域/内联网与互联网问题......
<!DOCTYPE HTML>
<html>
<head></head>
<body>
<script>
var url = 'http://IntranetWebApps.OurCompany.com/MyWebApp/Home'; // fails
//url = 'http://www.yahoo.com'; // this 'Internet' site works
//url = 'http://www.google.com'; // this 'Internet' site works
setTimeout(function () {
window.location.href = url;
}, 10000 // wait 10 seconds, then execute redirect
);
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
题
有没有人有任何想法如何解决这个问题,以便IE10窗口将永远重绘,而不是显示陈旧的内容?
javascript windows internet-explorer repaint internet-explorer-10
repaint ×10
java ×4
swing ×4
css ×3
javascript ×3
reflow ×2
awt ×1
c# ×1
fbml ×1
graphics ×1
graphics2d ×1
optimization ×1
performance ×1
restore ×1
textbox ×1
validation ×1
webpage ×1
windows ×1
winforms ×1