Tag: repaint

使用.setPaint(渐变)时resize时不重绘

一旦我在我的代码中使用渐变,重新调整就不会在resize时完成resize时resize(resize的黑色矩形,请参阅下面链接中的图像)。 当我停止resize时,一切都会被重新绘制,但只有这样。 如果我不使用g2d.setPaint(gradient); 我有一个快速重绘 http://gui-builder.com/C41142775162.rar public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D)g; //sample of the code GradientPaint gradient = new GradientPaint(startX, startY, greyColor1, endX, endY, new Color(120,120,120)); g2d.setPaint(gradient); g.drawLine(i, startY, i, endY); } 我尝试在resize上repaint() ,我试图repaint()鼠标被拖动但没有。 这里有一些SSCCE(对不起,我之前没有发布): BufferedImage aa; @Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics gr = aa.getGraphics(); Graphics2D g2d = […]

如何在向JFrame添加组件之间添加时间延迟?

我创建了一个JFrame,它包含一个JPanel。 我创建了许多JLabel。 我可以将JLabel添加到JPanel,并正确显示它们。 但我想实现它们,因为它们按顺序显示 ; 要显示的每个JLabel之间的时间延迟。 在搜索StackOverfLow之后,我尝试了一些代码,但它没有效果! 那么如何使用计时器通过设置时间延迟使组件(标签)一个接一个地显示。 我不希望修复我的代码,特别是在答案中。 只是 展示如何以延迟的方式显示任何类型的组件,每个组件在一段时间后显示。 就这些。 我提供了我的代码,以显示我努力解决问题。 首先,这是JLabel的子类使用:(没有问题) import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import javax.swing.BorderFactory; import javax.swing.JLabel; public class DLabel extends JLabel { Dimension size = new Dimension(70, 75); Font font = new Font(Font.SANS_SERIF, 12, 35); public DLabel(String t) { this.setPreferredSize(size); this.setBorder(BorderFactory.createBevelBorder(1, […]

Java Swing – 编写一个Ui,它将根据对自定义数据对象的更改重新绘制自身

首先要做的事情 – 我之前发过一个问题,其中我曾要求帮助解释为什么我的代码不能正常工作,而这个问题是根据我在该问题中得到的建议行事。 我的用例就是这个。 我正在编写一个MethodEditor模块,其中每个Method都由一个有2个数据成员的自定义数据对象表示 – 输入变量名称列表 String(此方法设置的结果变量的名称)。 这些Method对象是在JDialog上填写一些数据的结果。 这些Method对象存储在一个容器中,该容器有一个数据成员,它是List容器驻留在一个控制器JPanel ,调用上述JDialog 。 从UI的角度来看,我想以Jbutton的forms显示每个Method对象,点击其中JDialog将打开并允许用户编辑它。 MethodEditor作用于List并为List每个Method生成一个MethodEditor的垂直排列,1。 该List从前面提到的控制器JPane传递给JPane 。 我在之前的问题中将MethodEditor实现为JPanel ,它将PropertyChangeListener添加到List并且每次有PropertyChange事件时都会自行repaint但我的方法不起作用,重绘不会发生。 有没有其他方法来实现我的用例,或者我可以对我之前的问题中发布的代码做什么修复?

行没有出现在JDesktopPane上

我想在两个JPanel之间画线,但是line不出现在layeredPane上。 这就是我所做的,请仔细阅读,编译。请尝试更正此代码。 我试过这种方式在内部框架上绘制线条,但它不适用于JPanels。 package build; import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import javax.swing.JFrame; import javax.swing.JLayeredPane; import javax.swing.JPanel; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.border.LineBorder; public class LinkLayerPane1 { public static void main(String[] args) { new LinkLayerPane1(); } public LinkLayerPane1() { EventQueue.invokeLater(new Runnable() […]

如果显示器关闭,AWT / Swing是否取消绘画操作?

我遇到Swing问题,只有在计算机显示器电源关闭时才会出现,但我的Swing应用程序继续在后台运行。 似乎每当显示器关闭时,Swing / AWT都会取消所有绘画操作,导致GUI中的一些显示问题在显示器重新打开后立即可见。 例如,当我使用自定义JNI函数关闭监视器并随后打开一个简单的消息对话框时,当监视器重新打开时,消息对话框为空: 但它在下次重绘后正确绘制: 这是Swing的预期行为吗? 有没有办法指示Swing即使显示器电源关闭也能继续绘制到屏幕上? 编辑:这是一个SSCCE: package test; import javax.swing.JOptionPane; import javax.swing.SwingUtilities; public class App { public static void main(String[] args) throws Throwable { System.out.println(“***** Please turn off the monitor in the next 70 seconds *****”); Thread.sleep(1000L * 70); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JOptionPane.showMessageDialog(null, “Test”); } }); } […]

在Java 7+中,在EDT之外使用Swing repaint()方法是否仍然安全?

我知道,即使使用Swing的线程模型,从任何线程调用repaint()和其他一些选定的方法也是安全的,但是我最近在评论中告诉我,事实并非如此。 谷歌发现很多旧的讨论说它是安全的,但最近没什么。 所有以前说它安全的官方参考文献似乎已经消失了,我在各个论坛上发现了一些人讨论它是如何不再安全的。 我找不到任何正式的东西来确认它是否存在 – 而且我真的希望看到一些解释改变逻辑的东西,如果它已被改变的话。 考虑到破坏现有应用程序的风险有多严重,这似乎是一个非常奇怪的function。 我真的在寻找一个官方参考(即Javadoc,oracle教程或源代码链接)的链接,说明这些方法是否从任何线程调用都是安全的。 这里提到这个问题: 在EDT之外安全使用Component.repaint()? 从一个现已消失的Sun页面中引用一句话: 从任何线程调用以下JComponent方法都是安全的:repaint(),revalidate()和invalidate()。 repaint()和revalidate()方法将事件派发线程的请求分别调用paint()和validate()。 这符合我的理解,但我现在找不到那个页面或任何类似的页面,我看到几个人的未经证实的谣言说它不再安全。 但另一方面,我找不到任何明确的说这个function已经改变。 改变笔记 可能有助于解决这个问题的是Oracle关于Swing线程处理变化的官方声明。 我找到了“Java 7中的更改”页面,但根本没有提到它,这些页面都没有提到任何方式的线程或EDT: http://docs.oracle.com/javase/7/docs/technotes/guides/swing/enhancements-7.html http://docs.oracle.com/javase/7/docs/technotes/guides/awt/enhancements-7.html

在不重新绘制树的情况下更新JTree中的ImageIcon?

基本上我在DefaultTreeNode()的UserObject()中编辑属性private string status=”OK” 。 我有一个CustomRenderer implements DefaultCellRenderer ,它通过呈现TreeNode的UserObject的“OK”属性来设置Icon。 最初,当我选择一个节点时,图标会发生变化。 我正在使用Tree.revalidate()和Tree.repaint() ,并且正在反映更改。 但是,我不确定这是否非常有效。 这样做的正确方法是什么? 我尝试了TreeModel.nodesChanged(new DefaultMutableTreeNode(myUserObject))但TreeNodeChanged event不会触发。 因此,每次更改TreeNode的用户工具以查看图形更新时,我是否坚持使用重新绘制整个树?

JLayeredPane和绘画

我正在编写一个应用程序,它有一个JLayeredPane(称之为图层),包含两个不同层的JPanel。 我覆盖了底部JPanel的paintComponent方法(称之为grid_panel),因此它绘制了一个网格,并在顶部绘制了一个paintComponent方法(称之为circuit_panel),因此它绘制了一个电路。 以下是结构摘要: layers – |-circuit_panel (on top) |-grid_panel (at bottom) 我希望grid_panel保持静态,即不进行任何重绘(除了初始的重绘),因为它不会改变。 麻烦的是, 每当我调用circuit_panel.repaint()时,grid_panel也会被重新绘制! 这绝对不是有效的。 我认为这是由于JLayeredPane的热切绘画行为。 有没有办法在JLayeredPane中禁用此function? 如果你有兴趣看到上述效果,我写了一个小的演示程序: public class Test2 extends JFrame { public Test2() { JLayeredPane layers = new JLayeredPane(); layers.setPreferredSize(new Dimension(600, 400)); MyPanel1 myPanel1 = new MyPanel1(); MyPanel2 myPanel2 = new MyPanel2(); myPanel1.setSize(600, 400); myPanel2.setSize(600, 400); myPanel1.setOpaque(false); myPanel2.setOpaque(false); myPanel2.addMouseListener(new MyMouseListener(myPanel2)); layers.add(myPanel1, new […]