Dro*_*ets 3 java swing repaint paintcomponent event-dispatch-thread
嗨,我已经google了,无法弄清楚为什么我的paintComp方法没有被调用
我有以下代码包com.vf.zepto.view;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import javax.imageio.ImageIO;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import com.vf.zepto.view.interfaces.ProcessorPanel;
public class CountryDetailsPanel extends JPanel implements ProcessorPanel, Runnable {
private GridBagConstraints c = new GridBagConstraints();
private String countryName;
private Properties prop = new Properties();
private BufferedImage image;
public CountryDetailsPanel() {
try {
prop.load(new FileInputStream("country.props"));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//this.setLayout(new GridBagLayout());
c.gridx = 0;
c.gridy = 0;
c.fill = GridBagConstraints.BOTH;
c.insets = new Insets(5, 5, 5, 5);
this.setPreferredSize(new Dimension(200, 200));
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
try {
if(countryName != null) {
String asset = prop.getProperty(countryName+".flag");
if(!asset.equals(null)) {
image = ImageIO.read(new File(asset));
g.drawImage(image, 0, 0, null);
}
}
}
catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void updateDetails(Object o) {
countryName = (String)o;
SwingUtilities.invokeLater(this);
}
@Override
public void run() {
this.repaint();
}
}
Run Code Online (Sandbox Code Playgroud)
并且在打电话时this.repaint()
期望调用该paintComponent
方法,但是对于爱情或金钱而言,它不是.
试图强迫它使用EDT incase是问题,但事实并非如此.
有任何想法吗?
不要不加载图像或其他硬或长期运行的代码paintComponent
将其Object
作为局部变量加载,并且只加载一次
paintComponent()
叫做
隐含地,当JComponent
需要重画时,或
显式地,例如在每个鼠标事件上,如果paintComponent()
要从a 调用MouseMotionListener
.
如果有动画,那么使用Swing Timer并调用repaint()
.
您永远不应该调用paintComponent()
该repaint()
方法合并所有更改组件的请求(屏幕刷新之间可能有多个重绘请求).它向GUI事件队列添加更新请求,以便更新将与其他GUI操作正确协调(Swing和AWT不是线程安全的).此更新请求在处理时会调用update()
,哪些调用paint()
会调用您的paintComponent()
为什么这样:
@Override
public void run() {
this.repaint();
}
Run Code Online (Sandbox Code Playgroud)它似乎没有任何使用(创建一个新线程重绘一次?且不说线程不上EDT而呼吁repaint()
的JPanel
实例(如果修改比你不应该甚至担心外部除外).但是要启动的modifeis一个线程UI组件使用s SwingTimer
/ SwingWorker
或SwingUtilities#invokeXXX()
这可能没有关系,但在你的代码中我看到了这个:
if(!asset.equals(null)) {
image = ImageIO.read(new File(asset));
g.drawImage(image, 0, 0, null);
}
Run Code Online (Sandbox Code Playgroud)不要equals()
用来比较一个null
值,因为这可能会抛出一个NullPointerException
因为你试图推测空指针,例如这段代码抛出一个NPE
:
String s=null;
if(!s.equals(null)) {//throws NPE
System.out.println("Here");//is never printed
}
Run Code Online (Sandbox Code Playgroud)
paintComponent()
声明你的Image
全局,在构造函数中分配它然后使用它paintComponent()
.网络连接而是做:
public class TestPanel extends JPanel {
private Image image;
public TestPanel() {
image = ImageIO.read(new File(asset));
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
if(asset!=null) {
g.drawImage(image, 0, 0, null);
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
663 次 |
最近记录: |