我是绘画/图形方面的新手,想知道如何将 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();
}
}
最佳答案
- 不是实现
Runnable
,而是建立一个调用repaint()
的ActionListener
。从 SwingTimer
调用它。 - 有两种方法可以做到这一点。
- 扩展一个
JComponent
或JPanel
- 绘制
BufferedImage
并将其添加到JLabel
中的ImageIcon
。
- 扩展一个
- 如果扩展一个组件,如果不需要添加更多子组件,请使用
JComponent
,如果需要,请使用JPanel
。对于任何一个,覆盖paintComponent(Graphics)
而不是paint(Graphics)
。 - 对于这个用例,
BufferedImage
可能是更好的选择,因为它似乎在动画化一系列(据说是故意持久的)线条。 - 应在 EDT 上启动 Swing GUI。
- 不要调用
setBounds
!相反,为自定义组件设置一个首选大小,为文本区域的构造函数使用合理的值,并将它们与布局(以及适当的填充和边框)结合起来,然后在框架上调用pack()
添加所有组件后。 - 如果 JRE 在
Thread
开始之前调用repaint()
,则存在 NPE。
..问题是什么?哦对了,如果可以推断出问题是“如何将其他组件与自定义绘制的组件结合起来?” - 使用嵌套布局。查看Nested Layout example .
如果使用 BufferedImage
作为后备存储,您可以像该示例中的图像一样放置它,只是您将省略上面的 JTable
,以及JSplitPane
。
关于java - 如何将 jpanel 与油漆一起使用(或重新油漆),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8631670/