繁体   English   中英

如何使用jpanel与油漆(或重绘)

[英]how to use jpanel with paint (or repaint)

我是油漆/图形的新手,并想知道如何将JPanel添加到我的代码中,使得整个图形将在JPanel而不是JFrame上。

换句话说,我正在尝试创建一个允许我这样做的GUI:在右侧显示LEFT侧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();
}
}

在此输入图像描述

  1. 而不是实现Runnable ,建立一个调用repaint()ActionListener 从Swing Timer调用它。
  2. 有两种方法可以做到这一点。
    • 扩展JComponentJPanel
    • BufferedImage绘制并将其添加到JLabelImageIcon
  3. 如果扩展组件,则在不需要添加其他子项时使用JComponent如果需要则使用JPanel 对于其中一个, 重写paintComponent(Graphics)而不是paint(Graphics)
  4. BufferedImage可能是这个用例的更好选择,因为它似乎是动画(假设是故意持续的)一系列行。
  5. Swing GUI应该在EDT上启动。
  6. 不要调用setBounds 相反,将首选大小设置为自定义组件,为文本区域的构造函数使用合理值,并将它们与布局(以及适当的填充和边框)组合,然后在添加所有组件后在框架上调用pack()
  7. 如果JRE在Thread启动之前调用repaint()则会有一个NPE。

..问题是什么? 哦,对,如果可以推断出问题是“如何将其他组件与自定义绘制的组件结合起来?” - 使用嵌套布局。 请参阅嵌套布局示例

如果使用BufferedImage作为后备存储,您可以将其放置在该示例中的图像中,除了您将遗漏JTable以及JSplitPane

阅读自定义绘画的Swing教程,了解正确的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM