Tag: 绘画

如何让多个Threads绘制到AWT组件上?

编辑:解决了,看下面我的解决方案。 首先,这是我的第一个问题,所以如果我犯了任何错误,请告诉我。 我正在尝试用Java编写Mandelbrot分形程序,用于培训目的。 我想要的所有function的理想选择是Fractalizer( http://www.fractalizer.de/en/ ),但就目前而言,我会对在屏幕上绘制Mandelbrot Set的程序感到满意(而不是例如,将其写入图像文件)。 当然,我希望程序快速,所以我认为我可以将计算分成多个线程来利用我的多核处理器; 例如,在四核系统上,图像将被分成2×2 = 4个图像,每个图像由单独的线程计算。 所有这些线程都会传递一个Graphics对象,并在计算像素时绘制像素。 我的第一次尝试是让线程在BufferedImage.getGraphics()上绘制,并且只要图像没有完成,paint()方法就会不断调用repaint(): g.drawImage(tempImg, 0, 0, null); if (waiterThread.isAlive()) { try { Thread.sleep(10); } catch (InterruptedException e) { // do nothing } repaint(10); } (waiterThread一个接一个地连接所有计算线程,所以只要waiterThread存活,至少有一个计算线程尚未完成。) 这有效,但由于经常重新绘制,会在canvas上造成难看的闪烁。 然后,通过一个小的测试程序,我发现Graphics.draw *任何*在paint方法返回之前立即在屏幕上绘制,所以我当前的方法如下: 一个GridLayout包含2×2的面板(在<4核系统上,1×1)MandelbrotCanvas对象 每个MandelbrotCanvas对象将在第一次paint()调用时初始化一个计算Thread,将其自己的Graphics对象传递给它(实际上,我使用的是一个自定义的GroupGraphics类,它将一个Graphics调用传递给多个图形,以“备份”将图像转换为BufferedImage.getGraphics(),但这并不重要),并启动计算线程。 面板将在其paint()方法中从每个MandelbrotCanvases中获取计算线程并加入()它们。 不幸的是,这只会产生黑屏。 仅在计算完成时,才会显示图像。 将多个线程绘制到一个组件上的正确方法是什么? 编辑: 我不知道的事情:只允许事件调度线程在AWT组件上绘制(粗略说出),这意味着上面的最后一种方法不可行 – 显然,它应该抛出exception,但我没有’得到一个。 我的解决方案是使用第一种方法 – 将图像绘制到BufferedImage上并将其绘制到Canvas上 – 唯一的修改是我重载update()方法以调用paint()方法而不清除绘制区域 : public […]

Java Swing JScrollPane行号故障

我在JScrollPane中有一个简单的JEditorPane,它在左侧显示行号。 除非您将窗口移出屏幕并再次将其拉回,否则它会很有效,当您停止拖动时它会看起来像这样: 有任何想法吗? 我是否需要监听移动/拖动事件并在某处调用重绘/重新validation? 认为它可能是显而易见的,但这里有一些代码。 我正在使用JSyntaxPane。 public EditorPanel() { this.setLayout(new BorderLayout()); PythonSyntaxKit.initKit(); codeEditor = new JEditorPane(); JScrollPane scrPane = new JScrollPane(codeEditor); Dimension d = new Dimension(710,702); codeEditor.setPreferredSize(d); codeEditor.setContentType(“text/python”); codeEditor.setText(“Welcome to PhysUtil!”); this.add(scrPane, BorderLayout.CENTER); toolbar = new PhysUtilToolbar(); this.add(toolbar, BorderLayout.PAGE_START); this.repaint(); } //from MainFrame Class… public EditorPanel mainEditor; public MainFrame() { //Someone can figure out how […]

Java在组件中心之间画一条线

当用户点击一个标签时,我试图在两个JLabel的中心之间绘制一条线,拖动并释放另一个标签。 无论窗户的大小是多少都应该有效。 但线条不是中心,我该如何解决? 以下示例正在运行,但这些行似乎被JFrame的边界偏移,因此它们不是中心。 我不想尝试从点计算中删除JFrame边界,因为实际接口比给定的示例更复杂,并且JFrame中包含更多组件。 我认为点计算将与我正在使用的JPanel相关,所以我不会遇到JFrame边界问题,但似乎并非如此。 预先感谢您的任何帮助。 import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridLayout; import java.awt.Point; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class test extends JFrame implements MouseListener { private static JPanel panel = new JPanel(); private static test window = new test(); public test() { panel.setLayout(new […]

Java中的paint()和repaint()

我花了最近两个小时浏览和阅读这些方法和Graphics类,也许我很蠢,哈哈,但我只是不理解它们。 它们适用于什么? 我知道他们应该在屏幕上重新绘制或更新组件,但我从来没有理解为什么这是必需的(我是新手)。 例如,如果我在屏幕上移动JLabel,则调用setLocation()会将其移动得很好。 这是不需要repaint()的场景吗? 在哪些情况下有用,为什么? 如果您认为这是一个可以使用搜索function解决的问题,请道歉,但无论出于何种原因,我都没有得到它。