有没有人曾尝试使用Swing构建一个合适的多缓冲渲染环境,在此环境中可以添加Swing用户界面元素?
在这种情况下,我有一个动画红色矩形绘制在背景上.背景不需要每帧更新,因此我将其渲染到BufferedImage上,并仅重绘清除矩形的先前位置所需的部分.请参见下面的完整代码,这扩展了以前的线程通过@trashgod给出的例子,在这里.
到现在为止还挺好; 流畅的动画,低CPU使用率,无闪烁.
然后我将JTextField添加到Jpanel(通过单击屏幕上的任何位置),并通过在文本框内单击来关注它.现在,清除矩形的先前位置会在每个光标闪烁时失败,请参见下图.
我很好奇是否有人知道为什么会发生这种情况(Swing不是线程安全的?图像是异步绘制的?)以及寻找可能解决方案的方向.
这是在Mac OS 10.5,Java 1.6上
JPanel重绘失败了http://www.arttech.nl/javaredrawerror.png
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.Transparency;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.Timer;
public class NewTest extends JPanel implements
MouseListener,
ActionListener,
ComponentListener,
Runnable
{
JFrame f;
Insets insets;
private Timer t = new Timer(20, …Run Code Online (Sandbox Code Playgroud) 我正在尝试为特定目的创建一些特殊组件,在该组件上我需要绘制一个HTML字符串,这是一个示例代码:
public class MyComponent extends JComponent{
public MyComponent(){
super();
}
protected void paintComponent(Graphics g){
//some drawing operations...
g.drawString("<html><u>text to render</u></html>",10,10);
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,drawString方法似乎没有识别HTML格式,它愚蠢地绘制字符串就像它一样.
有没有办法让这项工作?
我正在研究用java编写的绘图应用程序并遇到一些(更多)问题.我有一个gui和一个工作程序(有点),我唯一的问题是用户绘制的线条和图形没有保存(在绘制下一个之后消失).
从过去的问题我了解到我将需要使用BufferedImage来存储绘图然后在我的绘画类中绘制它.
我的问题是,任何人都可以提供如何使用bufferedimage来存储和绘制绘图的基本解释/示例,如果需要,我将如何将绘制线的颜色和粗细传递到存储的数组中.
那就是全班同学.
package javapaint;
import java.awt.*;
import javax.swing.*;
public class JavaPaintUI extends javax.swing.JFrame {
/** Creates new form JavaPaintUI */
public JavaPaintUI() {
initComponents();
}
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
buttonGroup1 = new javax.swing.ButtonGroup();
buttonGroup2 = new javax.swing.ButtonGroup();
jPanel4 = new javax.swing.JPanel();
jRadioButton9 = new javax.swing.JRadioButton();
jRadioButton10 = new javax.swing.JRadioButton();
jSlider2 = new javax.swing.JSlider();
jLabel1 = new javax.swing.JLabel();
jPanel2 = new Panel2();
jPanel3 = new javax.swing.JPanel();
jRadioButton3 = new javax.swing.JRadioButton();
jRadioButton4 = new javax.swing.JRadioButton(); …Run Code Online (Sandbox Code Playgroud)