我第一次使用Swing来创建一个简单的GUI.它包含一个JFrame我放置了一个单独的JButton,当点击它时,调用一些其他代码,大约需要.3秒钟返回.
就在调用此代码之前actionPerformed(),我想更新按钮上的文本以通知用户正在进行处理.我的问题是,直到3秒钟的呼叫返回后,按钮上的文字才会更新.我希望在通话过程中出现更新的文本,然后我会将其更改回来.
当我点击按钮时,调用repaint()on JButton不会执行任何操作并在JFrame结果中调用它Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException.
例如,我需要在运行时禁用两个按钮.在我禁用第一个按钮后,它会变成灰色,第二个 - 它也会变成灰色.但我不知道如何同时重新粉刷!
我需要这样的东西:
如何实现?
MyApp(.NET c#)由OtherApp(c ++)触发.
触发后,我的应用程序将占据整个屏幕并为用户提供两个选项.一个选项退出MyApp并返回到OtherApp主屏幕.第二个选项退出初始屏幕并显示另一个用户输入屏幕 - 输入后退出并返回到OtherApp.
有时候,OtherApp屏幕不会重新绘制(只能看到背景,而不能看到按钮) - 我不能轻易复制它(当我这样做时看起来像是侥幸),但我已经在很多应用程序上看到了它.
有没有办法MyApp可以强制屏幕重绘OtherApp?
可能是什么导致了这个?
澄清 - 其他应用程序不是我们的.我们的客户使用OtherApp.MyApp由filewatcher事件触发.当我们看到一个文件时,我们会处理它.如果这是我们要查找的文件,我们会为用户提供两个选项.OtherApp不知道MyApp存在.
我的视图中有一些方法可以修改调用时绘制的一些形状.在Java中,为了确保组件更新,我会打电话repaint().有什么东西能确保我的观点正确更新吗?
我读的地方,调用invalidate()的onDraw()方法将让事情最新的,所以我不会需要有像repaint()在我的方法是修改形状的绘制.
这是正确的,还是我还有别的办法?
编辑
要添加一个示例,我在视图中调用的方法是:
public void setLineThickness(int thickness) {
aLineThickness = thickness;
if(aLineThicness > 1)
//repaint(); - Okay in Java but not in Android
}
Run Code Online (Sandbox Code Playgroud) 我正在制作游戏记忆,当你选择两张牌时,如果匹配你就得保留它们,否则你会把它们转回去.如果你记得你已经选择过的牌,你可以对接下来的两张牌进行更好的猜测.
我repaint()遇到的问题涉及不立即重新粉刷的方法.
当我翻转第二张卡片时,无论结果如何,我都要显示两张卡片在放弃或翻转之前向右翻转.我是通过打电话来做的sleep().
当然,如果我repaint()将卡片正面向上翻转,等待一秒钟,然后repaint()再根据它们的值,有用的小Java只会重绘一次(我想念C!).
基本上我想在我之前强制调用更新sleep().我已经阅读了一些其他线程,基本上说最好的方法是创建两个线程来保持逻辑和图形分离,然后你可以使用sleep()你的逻辑并保持你的GUI更新,但我在第一学期CS课程的第一学期在高中时,我希望将其保持在课程的水平上(尽管我花了很多时间在夏季网上开发和编写C语言).
因为我知道StackOverflow上有用的人喜欢阅读代码,所以这是我在下面提到的程序的一部分.该类HitArea是Card对象,cards[]数组包含一定数量HitArea的.(我没有重命名HitArea该类).activeCard1并且activeCard2是HitArea我用来跟踪用户的两个选择的实例,并且空白构造函数是保留的"不可见" HitArea,尽管我稍后会将其更改为null.最后,cards.flip()反转一个toggle布尔值,确定卡是否正面朝上.
public void respond(HitArea choice)
{
if(choice.inGame)
{
if(activeCard1.value == 0 && activeCard1.value == 0)
activeCard1 = choice;
else if((!(activeCard1.value == 0) && activeCard2.value == 0) && (activeCard1.id != choice.id))
{
activeCard2 = choice;
check();
}
}
}
public void check()
{
update(); …Run Code Online (Sandbox Code Playgroud) 我试图阻止浏览器重新绘制以提高使用 CSS 动画的大型单页应用程序的性能。
如果我有一个对其:hover { transform: scale(...) }有影响的元素,我可以通过使用will-change: transform和/或此处transform: translateZ(0)提到的来防止重绘。
但是一旦我transition向该元素添加 a ,许多元素就会重新开始重新绘制。
这是一个演示代码笔和它的 gif
唯一可以防止这种重绘的方法是将其他元素放在 DOM 顺序中的动画元素之前,或者将动画元素的 z-index 索引在其他元素之上。但是对于复杂的单页应用程序,我不想对任何只需要悬停过渡的元素的 z-index 进行微观管理。
任何其他想法或参考?我还没有transition在别处讨论过这个与s 相关的特定问题。
我正在使用 CSS 变量制作动画,其中 CSS 变量值根据页面滚动而变化。然后将该变量用于具有关键帧的动画。
最初它只能在 Firefox 上正确更新。同时,我找到了一种方法让它在 Chrome 上也能工作,通过强制重新绘制,在这种情况下,将颜色从 #000 动画到 #001。
/* --scale is dynamic changed by JS */
@keyframes move {
0% {
transform: translateX(0) scale(var(--scale));
color: #000;
}
100% {
transform: translateX(33vw) scale(1.5);
color: #001;
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道在现代网络浏览器上是否有一种可靠的方法可以检测文件回流和/或重新绘制,或者是否有任何迫切需要这样的东西可能会将其置于W3规范中.
我还想知道如果使用特定于供应商的技巧(例如Mozilla显然有一个MozAfterRepaint事件),它是如何完成的,如果它不可能以标准或跨浏览器的方式实现.
谢谢.
很抱歉这个问题有很多更新,我很高兴每个人都想帮助我.我认为下面有一个更清楚的方法来理解这个问题:
如果在更改附加了转换的属性之前将元素的display属性设置为阻止,则CSS转换将不适用.请考虑以下代码:
CSS:
#creative {
display: none;
opacity: 0;
transition: opacity 0.5s;
}
Run Code Online (Sandbox Code Playgroud)
HTML:
<div id="creative">
<span>Sample text</span>
</div>
Run Code Online (Sandbox Code Playgroud)
使用Javascript:
var dom = {};
dom.creative = document.getElementById('creative');
dom.creative.style.display = 'block';
dom.creative.style.opacity = 1;
Run Code Online (Sandbox Code Playgroud)
该元素将正确显示,但没有任何过渡.此问题的解决方法是通过访问元素的一个可视属性来强制重绘:
dom.creative.style.display = 'block';
var a = dom.creative.offsetHeight; /* <-- forces repaint */
dom.creative.style.opacity = 1;
Run Code Online (Sandbox Code Playgroud)
这有什么好方法吗?好吧,我的意思是每次我需要更改显示属性和附加转换的属性时不添加额外的javascript代码行.
我正在尝试使用Java和Swing制作2D游戏,并且窗口刷新太慢。但是,如果我移动鼠标或按键,则窗口刷新的速度应尽可能快!
这是一个GIF,显示仅当我移动鼠标时窗口如何快速刷新。
为什么窗口会像这样缓慢刷新?为什么鼠标和键盘会影响其刷新率?如果可能,如何使它始终保持快速刷新?
我使用javax.swing.Timer每1/25秒更新一次游戏状态,然后在游戏面板上调用repaint()重新绘制场景。
我知道计时器可能不会总是延迟精确到1/25秒。
我也了解调用repaint()只是要求尽快重新绘制窗口,而不是立即重新绘制窗口。
我的图形卡不支持OpenGL 2+或硬件加速的3D图形,这就是为什么我不使用libgdx或JME进行游戏开发的原因。
该Stack Overflow用户描述了我遇到的相同问题,但是据报道,作者通过在单独的计时器上反复调用repaint()解决了该问题。我试过了,它的确使窗口刷新有些快,但即使这样它也比我想要的要慢。在这种情况下,在窗口上摆动鼠标仍然可以提高刷新率。因此,该帖子似乎并没有真正解决问题。
另一个Stack Overflow用户也遇到了此问题,但是他们在游戏循环中使用连续的while循环而不是Timer。显然,此用户通过在while循环中使用Thread.sleep()解决了该问题。但是,我的代码使用Timer完成延迟,所以我不知道Thread.sleep()如何解决我的问题,甚至不知道该放在哪里。
我通读了《用AWT和Swing进行绘画》,以弄清是否误解了重新绘画的概念,但是该文档中没有任何内容可以为我阐明问题。每当游戏更新时,我都会调用repaint(),并且只有在发生鼠标或键盘输入时,窗口才会快速刷新。
我已经在网上搜索了几天,试图找到答案,但似乎无济于事!
import java.awt.Graphics;
import java.awt.Dimension;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
class Game {
public static final int screenWidth = 160;
public static final int screenHeight = 140;
/**
* Create and show the …Run Code Online (Sandbox Code Playgroud)