- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想要一个冒泡效果 - 一些分数从下到上冒泡的图像。下面是完整的代码。问题是 paint() 永远不会被 repaint() 调用。我不擅长 java awt 或 swing。有什么原因吗?
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
/**
* The Bubble object for implementing some animations for each block of LOVE pieces
*/
class Bubble extends JLabel {
private static final long serialVersionUID = 1L;
boolean isBubbling = false;
int xpos;
int ypos;
float transparency;
String text = "+100";
GameSettings config;
AlphaComposite transparency05=AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f);
Bubble(int x, int y) {
isBubbling=false;
this.xpos = x;
this.ypos = y;
}
void Bubbling() {
isBubbling=true;
for(int i=1;i<=50; i+=4) {
System.out.println("Bubbling init");
ypos -= (int)(7.2*i);
transparency = transparency/2;
setFont(new Font("arial, helvetica",Font.BOLD|Font.ITALIC,i));
repaint();
try {Thread.sleep(15);} catch(Throwable e) {}
}
new Thread() {
public void run() {
for(int i=50;i>=0; i-=4) {
System.out.println("Bubbling run");
ypos -= (int)(7.2*i);
transparency = transparency/2;
setFont(new Font("arial, helvetica",Font.BOLD|Font.ITALIC,i));
repaint();
try {Thread.sleep(15);} catch(Throwable e) {}
}
isBubbling=false;
repaint();
}
}.start();
}
@Override
public void paint(Graphics g1) {
super.paint(g1);
System.out.println("Bubbling paint begin");
if(isBubbling) {
System.out.println("Bubbling paint");
Graphics2D g=(Graphics2D) g1;
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
FontMetrics fm=g.getFontMetrics();
Rectangle r = getBounds();
int width=fm.stringWidth(text);
int height=fm.getHeight()*4/5;
int cx=g.getFont().getSize()/10;
int x=(r.width-width)/2;
int xx=fm.charWidth('i');
//g.setComposite(transparency05);
g.setComposite(AlphaComposite.SrcOver);
g.setColor(Color.red);
//g.drawString(text,xpos*config.pieceWidth,ypos*config.pieceHeight);
g.drawString(text,xpos,ypos);
//Image img=Tetris.getResource().getImage(config.imagePath+config.imagePrefix+"heart"+config.imagePostfix);
//g.drawImage(img,img.getWidth(null)+3,0,null);
//g.drawImage(img,xpos*config.pieceWidth,ypos*config.pieceHeight,null);
}
}
//for test
static public void main(String[] args) {
//Create and set up the window.
JFrame frame = new JFrame("Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Create and set up the content pane.
JPanel newContentPane = new JPanel();
newContentPane.setOpaque(true); //content panes must be opaque
Bubble bub = new Bubble(50, 50);
newContentPane.add(bub);
frame.setContentPane(newContentPane);
frame.setPreferredSize(new Dimension(300, 300));
//Display the window.
frame.pack();
frame.setVisible(true);
bub.Bubbling();
}
}
最佳答案
您的代码中存在很多问题,但未调用 paint()
的主要原因是您的 Bubble
组件的大小为 0 x 0。这是因为您没有覆盖 getPreferredSize()
以返回足够的值。此外,您的 ypos
变量会立即变为负数,这意味着您没有时间观看动画。
现在,您真的应该考虑处理以下其他问题:
paintComponent
而不是 paint
SwingUtilities.invokeLater
调用从 EDT 启动您的 UI。Bubbling
方法中创建另一个线程对我来说仍然是一个谜(要么从一开始就为整个方法创建,要么根本不创建)javax.swing.Timer
更适合您的情况这是您的代码的更新(但我没有根据上面的评论更改所有内容):
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
/**
* The Bubble object for implementing some animations for each block of LOVE pieces
*/
class Bubble extends JLabel {
private static final long serialVersionUID = 1L;
boolean isBubbling = false;
int xpos;
int ypos;
float transparency;
String text = "+100";
AlphaComposite transparency05 = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f);
Bubble(int x, int y) {
isBubbling = false;
this.xpos = x;
this.ypos = y;
}
void Bubbling() {
isBubbling = true;
for (int i = 1; i <= 50; i += 4) {
System.out.println("Bubbling init");
ypos--;
transparency = transparency / 2;
setFont(new Font("Arial", Font.BOLD | Font.ITALIC, i));
repaint();
try {
Thread.sleep(50);
} catch (Throwable e) {
}
}
new Thread() {
@Override
public void run() {
for (int i = 50; i >= 0; i -= 4) {
System.out.println("Bubbling run");
ypos--;
transparency = transparency / 2;
setFont(new Font("Arial", Font.BOLD | Font.ITALIC, i));
repaint();
try {
Thread.sleep(50);
} catch (Throwable e) {
}
}
isBubbling = false;
repaint();
}
}.start();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(180, 50);
}
@Override
protected void paintComponent(Graphics g1) {
super.paintComponent(g1);
if (isBubbling) {
System.out.println("Bubbling paint");
Graphics2D g = (Graphics2D) g1;
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
FontMetrics fm = g.getFontMetrics();
Rectangle r = getBounds();
int width = fm.stringWidth(text);
int height = fm.getHeight() * 4 / 5;
int cx = g.getFont().getSize() / 10;
int x = (r.width - width) / 2;
int xx = fm.charWidth('i');
// g.setComposite(transparency05);
// g.setComposite(AlphaComposite.SrcOver);
g.setColor(Color.red);
// g.drawString(text,xpos*config.pieceWidth,ypos*config.pieceHeight);
System.err.println(xpos + " " + ypos);
g.drawString(text, xpos, ypos);
// Image img=Tetris.getResource().getImage(config.imagePath+config.imagePrefix+"heart"+config.imagePostfix);
// g.drawImage(img,img.getWidth(null)+3,0,null);
// g.drawImage(img,xpos*config.pieceWidth,ypos*config.pieceHeight,null);
}
}
// for test
static public void main(String[] args) {
// Create and set up the window.
JFrame frame = new JFrame("Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Create and set up the content pane.
JPanel newContentPane = new JPanel(new FlowLayout());
newContentPane.setOpaque(true); // content panes must be opaque
Bubble bub = new Bubble(50, 50);
newContentPane.add(bub);
frame.setContentPane(newContentPane);
frame.setPreferredSize(new Dimension(300, 300));
// Display the window.
frame.pack();
frame.setVisible(true);
bub.Bubbling();
}
}
关于java - paint() 不会在 JLabel 动画中被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18381448/
我正在尝试以编程方式创建位图,但发现绘制带阴影的 Rect 会忽略传入的颜色 arg。我已将事情简化为这种情况 - 代码只是绘制了一个旋转的蓝色方 block ,它应该有一个灰色的影子,但影子总是蓝色
我可以轻松使用为 Paint.NET 制作的插件吗?在我自己的 C# 应用程序中(假设我遵守插件许可)? 我的目标是使某些效果自动化,Paint.NET 似乎有很多。 最佳答案 Paint.NET 以
我很好奇这些方法的作用以及如何使用它们,因为除了 Javadocs 中的单句描述之外似乎没有任何细节: setStrokeJoin setStrokeMiter 有人有一些示例代码或好的描述吗? 最佳
这个问题在这里已经有了答案: Error printing image in PyQt (1 个回答) PyQt print QWidget (1 个回答) 关闭 2 年前。 我试图在 QPixmap
我对这个感到困惑。我尝试按照一些人的建议将 QPainter 移动到它自己的 def ,但它给出了完全相同的错误。这是我创建的 def。 def PaintButtons(self): sol
我遇到这个问题,当我执行 repaint() 时,类中的 paint() 或 update() 方法没有被调用。这是代码: public class BufferedDisplay extends C
我一直在阅读关于 chrome 中的关键渲染路径 here和 here .我对这些资源的理解是“合成”步骤发生在主线程之外,并且依赖于之前的“绘制”步骤,该步骤生成要合成在一起的光栅化图层。 但是,当
在我的应用程序中,用户之一有时会出错并且应用程序崩溃。用户向我发送日志: java.lang.IndexOutOfBoundsException at android.graphics.Paint.
我正在编写简单的画图程序,您可以在其中通过拖动鼠标来绘制任何您想要的东西。您可以更改画笔的颜色和大小,但在这个版本中,当我更改画笔的颜色或大小时,当我通过拖动鼠标再次开始绘制时,之前绘制的所有内容也会
我已经实现了可点击的 Recyclerview 项并设置了 android:background="?selectableItemBackground" 以获得点击效果,但是在检查代码时我发现了这个
这是我使用 firemonkey + Delphi XE2 制作的 Delphi 应用程序的示例。 如您所见,您可以使用 Firemonkey 中的视觉样式“样式书”来自定义窗口框架内大多数内容的外观
我想请教您如何在绘画应用程序中实现自由形式的绘画。鉴于命令对象将包含单击、任意拖动和释放,这将如何必然存储在命令中并绘制到位图上下文中? 对于初学者来说,数据是否只是放在一个大列表中的 mousemo
似乎显而易见的答案是否定的,但我还是想找出答案。 如果我的面板中有很多复杂的组件,需要一段时间才能加载,然后在顶部有另一个非常基本的面板,完全覆盖它,背景面板是否仍会在 paint 方法中绘制? 最佳
首先是code: import 'package:flutter/cupertino.dart'; class Test extends StatelessWidget { @override
import java.awt.*; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.Ac
我的java代码有问题。我想做一个画家程序,但每当我选择一个形状并绘制它时之前绘制的所有形状都变得与此形状相同。这是代码。我知道问题出在 paintComponent 中的 for 语句,但我可以用什
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
这是代码,正方形会渲染但不会移动,即使它应该渲染每个循环。问题似乎出在 Core 类的 run() 中 package com.game; import java.awt.*; import
这里的问题是调用了paintComponent()方法,它获取了fillRect()所需的变量,但在按下按键后实际上并没有绘制任何东西。我不明白为什么,因为每次按下 D 键时 mato.getPosi
程序未在屏幕上显示我的 Oval。我没有收到任何错误,所以我有点停滞不前。我查看了我的另一个程序,我几乎逐字编写了它。 游戏.java public class Game extends JPanel
我是一名优秀的程序员,十分优秀!