我正在使用Java Swing编写游戏.我希望每次循环执行时都会绘制一个小延迟,以在屏幕上创建级联效果.我相信系统中的效率例程会将调用折叠repaint()成单个调用.无论如何,在总延迟之后,所有变化都会立即发生.有没有办法强制系统立即重绘,然后延迟循环的每次迭代?
我的代码:
for(int i=0;i<10;i++){
JButton[i].setBackground(Color.WHITE);
JButton[i].repaint();
Thread.sleep(2000);
JButton[i].setBackground(Color.GRAY);
JButton[i].repaint();
}
Run Code Online (Sandbox Code Playgroud) NewProductPanel pPanel=new NewProductJPanel();
pPanel.setVisible(true);
mainPanel.setLayout(new java.awt.BorderLayout());
mainPanel.add(pPanel);
Run Code Online (Sandbox Code Playgroud)
我已经创建了一个jPanel表单,我想将它动态添加到我的程序的mainJFrame中,我使用NetBeans..plz帮我解决这个问题.
我有一个带有JPanel的ScrollPane,我在其中添加了大约200个组件JPanel.知道我希望Vertical-Slider移动到特定的Component.但问题是,当我打电话时:
myButton.scrollRectToVisible(myButton.getBounds());
Run Code Online (Sandbox Code Playgroud)
getBounds() 给我宽度和高度0.
显然,元素仍然没有被绘制.我怎么能等到repaint()方法完成它的所有工作,这样我才能做到scrollRectToVisible()?
编辑:
如果我给出了我的代码的简短示例,它可能会有所帮助:
addElementsToPanel(); //function where I add Elements to the Panel
myJPanel.revalidate();
myJPanel.repaint();
myButton.scrollRectToVisible(myButton.getBounds());
Run Code Online (Sandbox Code Playgroud) 我是Java Swing的新手,我有一个奇怪的问题要刷新我的JPanel.
我JPanel在我的框架中创建一个静态组件,我从一个静态方法调用FileListenner我来重新绘制JPanel
public static void repaintPlan(JPanel f) {
f.paint(f.getGraphics());
f.revalidate(); // or validate
}
Run Code Online (Sandbox Code Playgroud)
我的意思是,当我检测到文件内容的变化时,我计算新的坐标并重新绘制JPanel(我从JPanel to definepaintComponent()`方法创建一个类exends )
当我运行应用程序时,一切正常,并且当文件中的更改数据时重绘工作; 但如果我用鼠标单击Jpanel,该repaint()方法将不再起作用.你能告诉我为什么点击之后JPanel,重新粉刷不起作用?
抱歉我的英文不好谢谢你提前:)
编辑:谢谢你的回复!但即使我使用repaint()方法,也是同样的问题.我正试图了解点击后会发生什么JPanel.我应该在Swing中使用鼠标事件来解决问题吗?
我有一个名为Foo的类,它扩展了一个名为Bar的类,它扩展了JPanel并实现了ActionListener.当我选择圆形并单击绘制按钮时,我绘制一个圆形,当我按下矩形并单击绘制时,它会删除前一个形状并绘制一个矩形.
但是,我想在JPanel上保留所有形状,直到我选择单击"删除"按钮.所以我删除了super.paintComponent(g)它并且它可以工作,但它也导致类Bar的按钮以一种小故障的方式重新出现.如何再次停止绘画按钮?我想不要扩展Bar并让Foo扩展JPanel.
public class Bar extends JPanel implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
if (e.getActionCommand() == "Draw")
{
this.requestDraw = true;
repaint();
}
if (e.getActionCommand() == "Circle")
{
requestRectangle = false;
requestTriangle = false;
requestCircle = true;
}
if (e.getActionCommand() == "Rectangle")
{
requestCircle = false;
requestTriangle = false;
requestRectangle = true;
}
if (e.getActionCommand() == "Right Triangle")
{
requestCircle = false;
requestRectangle = false;
requestTriangle = true;
}
}
public class Foo extends Bar
{ …Run Code Online (Sandbox Code Playgroud) 为什么我的图像不会为简单的动画重新绘制?我从两种不同的方法调用 repaint() ,一种会导致重绘,但另一种不会。强制重绘的方法是从事件侦听器生成的。一个不是定时动画线程。我知道动画线程运行正常,只要我不断滑动滑块,它就会完美显示。请帮忙!
PS 是的,我在这里看到了很多类似的问题,我尝试过验证、重新验证和使用油漆与油漆组件。组成代码的四个类如下:
import javax.swing.*;
public class gutz{
public static int windowWidth = 640;
public static int windowHeight = 480;
public static void main(String[] args){
hBod hb1 = new hBod(50, 30, 21, 111, 7, -11); //mass, radius, xpos, ypos, xvel, yvel
Thread t1 = new Thread(hb1);
windowmakr w = new windowmakr();
w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
w.setSize(windowWidth, windowHeight);
w.setVisible(true);
t1.start();
}
}
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
public class windowmakr extends JFrame {
private JSlider slider;
private drawr panel;
public windowmakr(){ …Run Code Online (Sandbox Code Playgroud) 我搜索了很多问题,但我从未找到我可以真正实现或理解的答案!
我不希望代码在屏幕重新绘制后继续运行!
我有一个简单的功能: wait until repaint has finished
public static void clearScreen()
{
panel.repaint();
}
Run Code Online (Sandbox Code Playgroud)
我现在可以告诉你,这有效!
唯一的问题是它不等待重新绘制,例如:
public static void blah()
{
drawSomething();
clearScreen();
drawSomething();
}
Run Code Online (Sandbox Code Playgroud)
这两幅图很有可能从屏幕上清晰可见。正如您可能猜到的那样,我不想要这个!
我只想提一下,所有单独的功能都可以工作!
我正在编写一个代码,我在JPanel上绘制多个形状然后调用repaint.我认为当我调用重绘时,JPanel中的形状应该移动到一个新位置,因为随机函数现在将提供不同的值.但形状根本不动.任何想法为什么会发生这种情况?
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
@SuppressWarnings("serial")
public class Filter extends JFrame
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
Filter mainFrame = new Filter();
mainFrame.setVisible(true);
}
});
}
public Filter()
{
//Creating the JFrame main window
setSize(800, 500);
setTitle("Particle Filter");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setLocation(100, 100);
getContentPane().setLayout(new BoxLayout(this.getContentPane(), BoxLayout.X_AXIS));
//creates two …Run Code Online (Sandbox Code Playgroud) 我需要在 Qt 中快速绘制小部件,但我不想使用任何准备好的东西。我有一些浮动数据,例如QVector< float >数据,我需要在小部件上绘制它。但我不希望使用paintEvent和QPainter直接就可以了。有没有机会将此数据转换为位图(像素图?)并直接加载它以显示在小部件上?如何从浮点数创建位图?
所以我终于让 Canvas 以我想要的方式工作,但它不断闪烁,repaint() 每秒运行 20 次,当我让它每秒运行 10 次时,闪烁确实减少了。
package pd.data;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import pd.areas.MainMenu;
@SuppressWarnings("serial")
public class Main extends JFrame implements Runnable {
private JPanel contentPane = new JPanel();
private Thread gameThread = new Thread(this);
public boolean running = false;
@SuppressWarnings("unused")
private int current = PDU.PD_MAIN_MENU;
private MainMenu mainmenu;
public Main() {main.setTitle("PD");
main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
main.setLocation(SPU.screenWidth / 2 - SPU.windowSize.width / 2,
SPU.screenHeight / 2 - SPU.windowSize.height / 2);
main.setResizable(false);
main.setVisible(true);
contentPane.setLayout(new BorderLayout(0, 0));
contentPane.setPreferredSize(SPU.windowSize);
main.setContentPane(contentPane);
main.pack();
mainmenu …Run Code Online (Sandbox Code Playgroud)