当前位置: 首页 > 面试题库 >

如何将jpanel与油漆一起使用 (or repaint)

霍建柏
2023-03-14
问题内容

我是绘画/图形的新手,想知道如何以一种方式将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();
            if (x==5000)
                break;

        } catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }
}

public static void main (String args[])
{
    Thread thread = new Thread (new Test());
    thread.start();
}
}

enter image description here


问题答案:

与其实施Runnable,不如建立一个ActionListener调用repaint()。从Swing调用它Timer。
有两种方法可以做到这一点。
扩展一个JComponent或JPanel
1. 在中绘制,BufferedImage然后将其添加到ImageIcon中JLabel。
2. 如果扩展组件,JComponent则在不需要添加更多子项的情况下使用,或者JPanel在需要添加子项的情况下使用。对于任3. 何一种,请覆盖paintComponent(Graphics)而不是paint(Graphics)。
4. BufferedImage可能是这个用例是更好的选择,因为它似乎是一个动画(据说有意持续性)系列线。
5. Swing GUI应在EDT上启动。
6. 不要打电话setBounds!而是,为自定义组件设置首选大小,为文本区域的构造函数使用合理的值,然后将它们与布局(以及适当的填充和边框)结合使用,然后pack()在添加所有组件之后调用框架。
7. 如果JRErepaint()在Thread启动之前调用,则存在NPE 。
..什么问题?哦,对,如果可以推断出问题是
“如何将其他组件与自定义绘制的组件结合在一起?” -使用
嵌套布局。请参见“嵌套布局”
示例

如果使用BufferedImage后备存储,则可以
将该示例放置在该示例中的图像上,只是要忽略JTable上面的内容
以及JSplitPane。



 类似资料:
  • 问题内容: 对不起,我进行了大量搜索,以查找这3个功能(绘画,重绘,paintComponent)之间如何相互作用,但我不知道。您能准确解释一下它们何时被调用(因为有时java会在没有我问他的情况下调用它),它们到底在做什么,它们之间有什么区别。谢谢 问题答案: 我不确定“ paint”,但是我可以解释repaint()和paintComponent()之间的关系。 根据我在Java方面的有限经验

  • 本章介绍Canvas组件,用它来生成简单的二维(2D)图形,目标是创建一个PaintPot(油漆桶)应用,让用户在手机屏幕上绘制图画,并让用户用手机给自己拍照,然后在自己的照片上绘图。回顾历史,早在20世纪70年代,PaintPot是最早运行在个人电脑上的应用之一,目的是为了证明个人电脑的潜力。那时候,开发这样一款简单的绘图应用是一项极其复杂的工作,而且绘图效果也略显粗糙。但现在,使用App In

  • 我试图编写一个小迷宫运行程序,遇到了一些与绘图组件()相关的麻烦。我已经完成了调试,出于某种原因,我的绘图组件()从未被调用,即使是由我的计时器调用的重新绘制()。 这些是我的frame和jpanel init方法。 这是我的paintComponent,图像确实已缓冲并已存储。 这就是我的ActionExecuted,它是用我的计时器调用的,默认设置为5秒的间隔。 } 如果你感兴趣,这是我的完整

  • 我在Ubuntu 14.04中安装了phpbrew以使用PHP5.4。它工作得很好,但当我尝试使用composer时除外,composer会忽略phpbrew并安装与PHP5.5相关的依赖项。 有没有办法强制composer与phpbrew config兼容?我试图在我的作曲家中添加:php:“5.4”。json,但是它说这个要求在我的php版本中是不可能的。

  • 我是Micronaut框架的新手,我正在尝试使用entitymanager创建我的存储库。我这样创建了我的存储库 我使用这个类实现接口并注入entitymanager 问题是我一直有这个错误: PS:我已经启用了注释处理

  • 我正在尝试将composer与我的WampServer一起使用。 我所有文件的路径都是,但当我运行composer时,它会将供应商文件和其他东西安装到其他地方。 我甚至不知道我的项目在哪里,我也不能改变我的项目在哪里的路径。我已经尝试了所有的方法,但它似乎仍然没有在我的项目文件夹中安装供应商文件。