小编典典

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

java

我是绘画/图形的新手,想知道如何以一种方式将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


阅读 212

收藏
2020-11-26

共1个答案

小编典典

与其实施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。

2020-11-26