java - 如何将 jpanel 与油漆一起使用(或重新油漆)

标签 java swing jframe jpanel repaint

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

最佳答案

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

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

如果使用 BufferedImage 作为后备存储,您可以像该示例中的图像一样放置它,只是您将省略上面的 JTable,以及JSplitPane

关于java - 如何将 jpanel 与油漆一起使用(或重新油漆),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8631670/

相关文章:

swing - 阻止 GroupLayout 组件垂直拉伸(stretch)

java - 如何使用方法调用在另一个面板中显示特定面板?

java - JFrame和JPanel之间的通信

java - 如何从 Spring Boot 中的 Rest Controller 中的 REST 请求获取日历字段?

java - SQLException,参数 5 没有值

java - NetBeans 8 中的远程调试 GUI Java 应用程序 (swing)

Java 图形对象未更新?

javax.annotation.processing.AbstractProcessor : compiling generated code

java - 为什么 String.format ("%02x ", -1) 返回 ffffffff 而不是 ff?

Java 文本字段聚焦