我正在构建一个棋盘游戏的applet,处理用户输入大致如下所示:
public void mousePressed(MouseEvent event) {
int row = event.getX() / (getSize().width / 8) ;
int column = event.getY() / (getSize().height / 8) ;
if(possibleMove(column, row) {
makeMove(column,row,whosTurn);
repaint();
start();
}
}
Run Code Online (Sandbox Code Playgroud)
人工输入后,计算机选择一个移动并调用repaint()和start(),就像这个方法一样.
但是屏幕似乎只有在计算机移动后才会更新,所以在调用start()之后.怎么会发生这种情况,因为在start()之前调用了repaint()?
我怀疑这可能是因为repaint()启动一个新线程(是吗?),但为什么它会等待start()?
当然,如果有必要,我可以提供更多代码.
我有一种方法可以写出剩下多少猜测,并且我希望每次人们错过字母或单词时都要重新绘制,但是它会一直重新绘制,这会导致整个程序不断闪烁.
我的方法看起来像这样:
public void repaintWord(Graphics g){
g.SetColor(Color.RED);
g.drawString("You have " + getN() + " guesses left", 400, 50);
repaint();
}
Run Code Online (Sandbox Code Playgroud)
当getN()改变它的值时,如何只重画一次?
我有一个乒乓球项目(种类),它的工作原理,但run()函数有问题.如果我用我写入面板的功能绘制框架(它们工作,我检查)它给出了图形的问题,如果我使用重绘(如我所说)它绘制框架并立即删除它,每个解决方案将有所帮助(更好的是我的代码级别中的一个简单的):
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JPanel;
import java.util.Random;
import javax.swing.*;
import sun.org.mozilla.javascript.internal.Kit;
public class Picture extends JPanel implements MouseListener, Runnable{
private int k = 0;
Thread MyThread;
private DrawPic img;
private Rectangle r1, r3;
public Picture(DrawPic img, Rectangle rect1, Rectangle rect3) {
super();
this.setLocation(0, 85);
this.setLayout(new FlowLayout());
this.setSize(1280, 1024);
this.addMouseListener(this);
this.setFocusable(true);
this.r1 = rect1;
this.r3 = rect3;
this.img = img;
this.MyThread = new Thread(this);
MyThread.start();
this.setVisible(true);
}
public void paintRectangleL(Rectangle rect, Graphics g) …Run Code Online (Sandbox Code Playgroud) 我刚刚开始使用java 2d图形应用程序,在我的研究重绘是重绘我们的图形浪费了大量资源.但是我想知道什么重绘是什么,有效以及如何有效地使用它,为我画布上的许多可移动动态对象安全快速地线程?
这是我的简单代码,它在椭圆形光标附近绘制.每次点击框架都会重新绘制,当时只能绘制一个椭圆形.我想知道如何使每个椭圆形图形点击以留在框架上.谢谢你每个建议.
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class Buffer extends JPanel implements MouseListener{
public static JFrame frame;
public static boolean check;
public void paintComponent(Graphics g){
super.paintComponent(g);
if(check==true){
g.drawOval((int)MouseInfo.getPointerInfo().getLocation().getX(), (int)MouseInfo.getPointerInfo().getLocation().getY(), 10, 10);
}
}
public static void main(String args[]){
Buffer x=new Buffer();
x.setBackground(Color.cyan);
frame=new JFrame();
frame.setSize(500,500);
frame.addMouseListener(x);
frame.add(x);
frame.setVisible(true);
}
public void mouseClicked(MouseEvent e){
check=true;
repaint();
}
public void mouseEntered(MouseEvent arg0){}
public void mouseExited(MouseEvent arg0){}
public void mousePressed(MouseEvent arg0){}
public void mouseReleased(MouseEvent arg0){}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 openCV 创建网络摄像头视图,但是当我重新绘制保存的图像时,它会闪烁,并且图像有时看起来是半灰色的。
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
public class Panel extends JPanel {
BufferedImage img;
public Panel() {
super(true);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
try {
img = ImageIO.read(new File("webcam.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
g.drawImage(img, 0, 0, 640, 480, this);
repaint();
}
}
Run Code Online (Sandbox Code Playgroud) 我一直在用c#开发项目.
它有2种形式,它们之间相互连接.
当第二个表单关闭,第一个表单刷新时,我想这样做.
如果我使用Thread的Sleep程序会很累.我希望通过结束活动来做到这一点.我该怎么办?(就像java的重绘一样)
代码如下: Form1
public static Form1 form;
public Form1()
{
InitializeComponent();
form = this;
}
private void button11_Click(object sender, EventArgs e)
{
Form2 yeniform = new Form2();
yeniform.Show();
}
Run Code Online (Sandbox Code Playgroud)
Form2(关闭按钮)
private void button1_Click(object sender, EventArgs e)
{
Form1.form.Invalidate();
Form1.form.Refresh();
this.Close();
}
Run Code Online (Sandbox Code Playgroud) 我开始学习浏览器的内部工作原理,并遇到了回流/重绘机制(以及它如何应用于 React,但我不想离题)。
一般来说,我认为任何使浏览器计算值/可见更改的行为都会触发回流/重绘。
然而,我却无法理解Element.setAttribute。它会触发 Chrome 中的回流/重绘吗?更新dom树中多个元素属性最有效的方法是什么?
我有一个 Delphi GUI 应用程序,它运行得很好,直到显示分辨率更改自动导致程序的 GUI 窗口被重新绘制。我们可以通过消息捕获这个显示事件WM_DISPLAYCHANGE。
在重绘事件中,似乎某些TListView在那一刻隐藏的组件不会被重绘,直到它们再次可见。
似乎仅在表单的可见组件上调用重绘,并且操作系统在不可见的项目再次变得可见时重新绘制它们。
但是,当代码引用消息TListView后WM_DISPLAYCHANGE尚未显示的 a 中的项目时,这会导致问题。内部应该TListView有项目,但TListView.Items.Count返回 0,就好像TListView是空的一样。
在屏幕上显示可见后TListView,一切都会恢复正常,并且我可以再次引用TListView.
我尝试显式调用TListView.Repaint()更新它而不必显示它,但它不起作用。
这是有记录的行为吗?
有没有办法立即重新绘制不可见的表单组件,而不让它在屏幕上可见?
我在webservice中有一个数据连接.在Assynctask中,我每5秒获取一次数据.数据到达后,我制作新的数据集,请原来我只是重绘mChartView生活.在这里提出我的问题.折线图重新绘制不重新生成图表只是在最后一个新的顶部.当然2-3分钟的menmory :(
这是我的代码:
class GetData extends AsyncTask<Void, String, Void> {
private ArrayList<String> Alldata = new ArrayList<String>();
public XYMultipleSeriesDataset datasetOut;
public XYMultipleSeriesRenderer mRendererOut;
@Override
protected Void doInBackground(Void... unused) {
Alldata.clear();
Alldata = DataFromWeb.getChartDataNew("&name=XXX", "XXX");
return (null);
}
@Override
protected void onPostExecute(Void unused) {
datasetOut = CCChart.getDataSet(getBaseContext(), Alldata);
mRendererOut = CCChart.getRendererPortrait(getBaseContext());
Log.d("Debug", "alldatasize: " + Alldata.size());
Log.d("Debug", "dataset " + datasetOut.getSeriesCount() );
if (mChartView != null) {
mChartView.repaint();
Log.v("CC_trace", "CCChartRepaint");
} else {
mChartView = ChartFactory.getLineChartView(getBaseContext(), datasetOut , mRendererOut);
layout.addView(mChartView, new LayoutParams( …Run Code Online (Sandbox Code Playgroud)