我正在使用Javascript绘制SVG网格.我已设法绘制轴,以及我的象限标签.但是我遇到了一个添加动态点的问题.
我正在尝试在SVG元素的onload事件中绘制点.使用Firebug时,我已经能够确认代表我的点的圆形元素被添加到SVG DOM中,并为位置,画笔描边等设置了正确的属性.
不幸的是,我的浏览器(Firefox 3)渲染的实际图像没有更新,以反映我添加了这些新DOM元素的事实!
以下是我用于将元素添加到正确DOM节点的代码:
function drawPoints()
{
var points = pointCollection.points;
var grid = SVGDoc.getElementById("gridGroup");
for(var i = 0 in points)
{
var x = points[i].x;
var y = points[i].y;
var label = points[i].event;
//<circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red"/>
var dot = SVGDoc.createElement("circle");
dot.setAttribute("cx", x);
dot.setAttribute("cy", y);
dot.setAttribute("r", 15);
dot.setAttribute("stroke", "red");
dot.setAttribute("stroke-width", "2");
dot.setAttribute("fill", "black");
grid.appendChild(dot);
}
}
Run Code Online (Sandbox Code Playgroud)
之后的Firefox的Firebug调试扩展所示的SVG结构是:
<svg width="800" height="800" version="1.1" xmlns="http://www.w3.org/2000/svg" onload="init(evt); drawAxis(); drawPoints()">
<g id="gridGroup" stroke="green">
<line id="xAxis" x1="0" x2="800" y1="400" y2="400" …Run Code Online (Sandbox Code Playgroud) 嗨我在.net中使用表单,我在运行时动态添加大量链接标签,我将这些链接标签添加到面板并将该面板添加到winform.当链接标签的数量增加时,表单会弹出一个自动滚动条(垂直)...现在当我使用该自动滚动向下滚动时,表单不会更新其视图,因为我滚动,只有当我停止滚动时,表单才会刷新...此外,当它刷新它看起来太糟糕..我可以看到它如何绘制缓慢....
有谁曾经处理过这个问题?
我在scroll事件处理程序中尝试了form.refresh(),但这似乎没有帮助..
有线索吗?
问题:在运行方法之前,图形不会重新绘制.
单击按钮时会调用两个方法.每个方法内部都是代码,用于更改与此方法关联的图形的颜色(在UI中); 当方法开始时,图形从黑色变为绿色; 当方法完成时,颜色从绿色变为红色.然后调用下一个方法,其图形应变为绿色(方法正在运行),当方法完成时,其图形应填充红色(方法完成).
我创建了一个简单的状态圆图形(带有填充颜色的30像素圆圈),有3种颜色状态:黑色表示准备好; 绿色的跑步; 红色完成.
我认为这个问题与repaint()单独的线程有关并且计划在能够运行时运行?我尝试将更新图形的代码放在自己的thread-runnable中,然后使用线程.join()确保代码已经完成运行但是没有用.
编辑:删除我用于演示的代码,并根据注释替换单个可运行的代码示例.如果运行代码,您将看到的是在单击每个方法启动和停止时图形不更新的按钮后,它会等待两个方法都运行然后重新绘制图形.
package graphicsUpdateDemo;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;
import java.beans.Transient;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
/**
* Application entry
*/
public class App{
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new MainFrame();
}
}); …Run Code Online (Sandbox Code Playgroud) 互联网的人!
我一直在为学校做一个饮酒游戏计划.
//不是相关的信息,只是为了lulz://学校建议游戏,我没有;)这是游戏// http://sotallytober.com/games/verbal/mexican/
无论如何,我使用以下代码在JPanel中绘制了一个图像(它是一个扩展JPanel的类)
public class iconPanel extends JPanel {
ImageIcon image;
Image pic;
public iconPanel(String startScreenImage) {
image = new ImageIcon(startScreenImage);
pic = image.getImage();
this.setBackground(new Color(0, true));
}
@Override
public void paintComponent(Graphics g) {
//Paint background first
g.drawImage (pic, 0, 0, getWidth (), getHeight (), this);
}
Run Code Online (Sandbox Code Playgroud)
现在在我的另一个类中,我有布局和所有组件,我在我的JPanels上声明如下:
private JPanel pnDrinkPlayerBW;
Run Code Online (Sandbox Code Playgroud)
然后在名为MakeComponents的同一个类中的一个方法中,我将JPanel设置为:
pnDrinkPlayerBW = new iconPanel("img/glass.jpg");
pnDrinkPlayerBW.setPreferredSize(new Dimension(183,61));
Run Code Online (Sandbox Code Playgroud)
然后我将它添加到面板中,它必须来,并将该面板添加到方法makeLayout()中的框架上(我不认为它是有用的代码,所以如果你想看到它,请问我)
然后,如果按下按钮,我想将glass.jpg图像更改为另一个图像,例如beerGlass0.png,所以在另一个方法actionEvents()的actionlistener中我这样做:
pnDrinkPlayerBW = new iconPanel("img/beerGlass.png");
pnDrinkPlayerBW.setPreferredSize(new Dimension(183,61));
pnDrinkPlayerBW.repaint();
Run Code Online (Sandbox Code Playgroud)
我会把这个类的构造函数放在这里,就像人们需要它一样:
public SpelScreen(){
makeComponents();
makeLayout();
actionEvents();
} // note : this …Run Code Online (Sandbox Code Playgroud) 我有一个类Forest和CellularJPanel,延伸JPanel和显示Forest.我写了一个原始的代码来创建JFrame,Forest,CellularJPanel并添加CellularJPanel到JFrame.接下来是一个无限循环,它进行Forest更新和CellularJPanel重绘.
JFrame jFrame = new JFrame();
Forest forest = new Forest();
CellularJPanel forestJPanel = new CellularJPanel(forest);
jFrame.add(forestJPanel);
jFrame.pack();
//jFrame.setResizable(false);
jFrame.setLocationRelativeTo(null);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setVisible(true);
while (true)
{
try
{
forestJPanel.repaint();
forest.update();
forest.sleep(); // calls Thread.sleep(...)
}
catch (InterruptedException e)
{
}
}
Run Code Online (Sandbox Code Playgroud)
这是CellularJPanel该类的代码:
public class CellularJPanel extends JPanel
{
private CellularAutomata cellularAutomata;
public CellularJPanel(CellularAutomata cellularAutomata)
{
super();
this.cellularAutomata …Run Code Online (Sandbox Code Playgroud) 我一直在开发一种乐谱软件,我想用它来训练我的音乐学生视奏。
我想知道我是否采取了正确的方法,或者是否有更好的方法。
我已经设法使用支持乐谱的 unicodes 和字体使用如下代码制作谱号、音符和谱表对象:
public static void spaceStaff(Graphics g){
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
Font font = new Font("Bravura", Font.PLAIN, 32);
g2.setFont(font);
g2.drawString("\uD834\uDD1A", note.spacing-2, staffDistance);
note.spacing = note.spacing + 16;
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个名为 Surface 的类,它将笔记绘制到 JPanel 上:
public class Surface extends JPanel {
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
staff.spaceStaff(g);
clef.drawGclef(g);//not given in example code above
note.drawCrotchet(g, note.B1);//not given in example code above
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用此代码启动应用程序并显示音乐笔记:
public class SightreadHelper extends JFrame {
public SightreadHelper(){
initUI();
}
private void …Run Code Online (Sandbox Code Playgroud) 如何在帧repaint()最大化或调整大小后立即强制使用Frame ?
在发生特定操作时,我找不到调用哪种方法.我有一堆用Paint中的Graphic对象编写的图形,它们的方向取决于来自的实时反馈getWidth(),getHeight()但是当我最大化时不会调用paint,只有当那些像素不幸地改变时.
我有一个JPanel,我在上面画了四个矩形.随机选择这些矩形中的每一个的颜色.仅当用户单击特定矩形时,颜色才会更改.
问题是,当用户调整窗口大小时,JPanel上的所有内容都会重复"重新绘制".这导致矩形快速改变颜色.
理想情况下,在调整大小时,我需要矩形的颜色保持不变.否则,我还可以使用一个解决方案,在完成调整大小后,JPanel只重画一次.
您对我如何实现这一点有什么一般性的想法吗?如果ComponentListener中有onStartResize和onFinishResize回调方法,我觉得这样会容易得多.
谢谢!
我是油漆/图形的新手,并想知道如何将JPanel添加到我的代码中,使得整个图形将在JPanel上,而不是在JFrame上.
换句话说,我正在尝试创建一个允许我这样做的GUI:在右侧显示左侧JPanel 上线条的良好移动,添加一个将显示的JTextArea(在JPanel上)图形的协调.
谢谢!!!
(下图,移动线或只是运行代码)
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import javax.swing.JFrame;
public class Test extends JFrame implements Runnable
{
private Line2D line;
public Test()
{
super("testing");
this.setBounds( 500, 500, 500, 500 );
this.setVisible( true );
}
public void paint( Graphics g )
{
Graphics2D g2 = (Graphics2D) g;
g2.draw(line);
}
@Override
public void run()
{
int x=50;
while (true)
{
try
{
Thread.sleep( 50 );
line = new Line2D.Float(100+x, 100+x, 250-x, 260+x%2);
x++;
repaint(); …Run Code Online (Sandbox Code Playgroud) 让我先说我知道我在这个凌乱的代码中违反了一些基本的Java原则,但是我很想在周二之前完成一个社交科学实验的程序,我不懂Java,所以我'我现在基本上只是摸索它.
有了这个免责声明,我有一个单独的程序工作,其中一个圆圈在屏幕上移动,用户必须点击它.它在它自己独立的类文件中工作正常,但是当我将代码添加到我的主程序时,它不再有效.我甚至不明白为什么repaint()调用我的paint()函数 - 就我而言,它是神奇的,但我注意到repaint()在我的测试程序中调用paint(),但不是更复杂的实际程序,我认为这就是为什么圆圈不再在我的程序上绘画.
整个代码如下:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import javax.swing.*;
import java.awt.event.*;
import java.awt.geom.Ellipse2D;
import java.io.FileReader;
import java.io.IOException;
import java.util.Calendar;
public class Reflexology1 extends JFrame{
private static final long serialVersionUID = -1295261024563143679L;
private Ellipse2D ball = new Ellipse2D.Double(0, 0, 25, 25);
private Timer moveBallTimer;
int _ballXpos, _ballYpos;
JButton button1, button2;
JButton movingButton;
JTextArea textArea1;
int buttonAClicked, buttonDClicked;
private long _openTime = 0;
private long _closeTime = 0;
JPanel thePanel = new JPanel();
JPanel thePlacebo = …Run Code Online (Sandbox Code Playgroud)