gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:32:26 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com