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