简体   繁体   中英

how to use jpanel with paint (or repaint)

I'm a newbie to the paint/graphics and wonder how to add a JPanel to my code in such way that the entire graphics will be on a JPanel and not on the JFrame.

In other words, I'm trying to create a GUI that will allow me to do this: on the RIGHT side show the nice movement of the lines on a JPanel on the LEFT side, add a JTextArea (on a JPanel) that will show the coordination of the graphics.

  • This is a simplification of a bigger problem but I guess the code here is easier to understand.

Thank you!!!

(picture below, moving lines or simply run the code)

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. Instead of implementing Runnable , establish an ActionListener that calls repaint() . Call it from a Swing Timer .
  2. There are 2 ways to do this.
    • Extend a JComponent or JPanel
    • Draw in a BufferedImage and add that to an ImageIcon in a JLabel .
  3. If extending a component, use JComponent if you do not need to add further children, or JPanel if you do. For either, override paintComponent(Graphics) instead of paint(Graphics) .
  4. The BufferedImage might be a better choice for this use-case, since it seems to be animating a (supposedly intentionally persistant) series of lines.
  5. Swing GUIs should be started on the EDT.
  6. Don't call setBounds ! Instead, set a preferred size to the custom component, use sensible values for the constructor of the text area, and combine them with layouts (and appropriate padding and borders), then call pack() on the frame after all components are added.
  7. There is an NPE if the JRE calls repaint() prior to the Thread starting.

..What was the question? Oh right, if it can be inferred that the question is "How to combine other components with a custom painted component?" - use a nested layout. see the Nested Layout example .

If using a BufferedImage as backing store, you might place it like the image in that example, except that you would leave out the JTable above that, as well as the JSplitPane .

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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