窗口刷新时,怎么才能保留repaint()中画的东西呢? 我写的一个类K继承了JPanel,当最大化最小化或移出屏幕后,我用repaint()画的东西就不见了,只剩下paint()中的背景了,怎么才能保留repaint()中画的东西呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这说明你没用到JPanel中的双缓冲.在paintComponent(...)这个函数中调用super.paintComponent(...)就行了,但是在开始调用还是在这个函数结束处调用,对于不同的情况下可能有些不同,但大多数情况下是在函数结束处调用。 paintComponent(Graphics g)方法具体怎么用呢?是不是还得把paint() 中的代码重写一遍呢?我还不太清楚,谢谢! 不用重写,而且有一点要注意,当你使用的是JPanel后,以后的图形绘制都应该在paintComponent(...)这个函数中进行,因为这个函数系统直接给我们实现了双缓冲,而从JPanel从Panel继承过来的paint(...)函数没有双缓冲这个功能,如果要用这个函数,得我们自己去实现双缓冲,就是在paint中先把所以要画的东西画到一个imageBuffer上,然后再一次直接调用draw函数,把这个imageBuffer一下子全部画到屏幕上去。paintComponent的用法:protected void paintComponent(Graphics g) {...//你的绘制代码super.paintComponent(g); //这个函数调用是让系统为我们实现双缓冲} 我的程序是棋盘上画棋子。我在鼠标点击棋盘时,就调用repaint(0,column*40,row*40,40,40)方法绘棋子我把paint(Graphics g) 改成了paintComponent(Graphics g),但是就棋盘也显示不出来了。是不是还得改repaint()方法呢? 用paintComponent都能显示了,但最大化后,棋子又不见了,super.paintComponent(g);这一句我写在绘制代码的前边。 这还是说明双缓冲还没实现,super.paintComponent(g);这一句写在绘制代码的后面才行。 import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.awt.geom.*;public class JF extends JFrame { public JF() { Container container = this.getContentPane(); container.add(new MyPanel()); this.setSize(400, 400); this.setDefaultCloseOperation(EXIT_ON_CLOSE); } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub JF jf = new JF(); jf.setVisible(true); }}class MyPanel extends JPanel { double x, y, w, h; int x1, y1, x2, y2; Ellipse2D ellipse; Ellipse2D selectedShape; Rectangle2D boundingRec; int count = 0; public MyPanel() { x = 20; y = 20; w = 100; h = 75; setBackground(Color.white); } protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2D = (Graphics2D) g; ellipse = new Ellipse2D.Double(x, y, w, h); g2D.draw(ellipse); System.out.println(count++); //super.paintComponent(g); }}很久都没写Java程序了,现在一直在用OpenGL,所以写了一个很烂的程序,但是能够很好的式作,在最大化和最小化后图形都能正常显示。 public void paintComponent(Graphics g) { super.paintComponent(g); //绘制棋盘 for(int row=0;row<8;row++) { for(int column=0;column<8;column++) { g.setColor(knight[row][column].backColor); g.fillRect(knight[row][column].x, knight[row][column].y, 40, 40); } } //绘制棋子 if(column2>=0 && column2<8 && row2>=0 && row2<8) { if(step==0 //判断走棋是否为马字形 || ((java.lang.Math.abs(column2-stepX[step-1])+java.lang.Math.abs(row2-stepY[step-1]))==3) && (column2!=stepX[step-1]) && (row2!=stepY[step-1]) ) { stepX[step]=column2; stepY[step]=row2; step++; knight[row2][column2].setNotEmpty(); //标记该处已走过棋子 g.setColor(Color.WHITE); g.fillOval(knight[row2][column2].x+10, knight[row2][column2].y+10, 20, 20); } }} 如果实现 jsp 滚屏显示 word 文档! 请指教(求):一个swt的图形窗口怎样通过tomcat服务器调用sqlserver2000中的数据? 关于i++的问题! java路径问题 在java中怎样使字符和asc码相互转换? 请问谁有用JDBC连接MySQL的样例程序? 一个类可以实现多个接口 请问用DBuitls框架插入数据显示错误怎么解决 为什么这里没有人讨论junit 请实现一个函数用来判断字符串是否表示数值(包括整数和小数) 第一个号没分了,又注册了一个,100分问几个小问题 我想在一个程序里面创建30多个线程,这样会不会很影响效率啊?
我还不太清楚,谢谢!
protected void paintComponent(Graphics g) {...//你的绘制代码super.paintComponent(g); //这个函数调用是让系统为我们实现双缓冲
}
就调用repaint(0,column*40,row*40,40,40)方法绘棋子我把paint(Graphics g) 改成了paintComponent(Graphics g),但是就棋盘也显示不出来了。是不是还得改repaint()方法呢?
super.paintComponent(g);这一句我写在绘制代码的前边。
import java.awt.event.*;
import javax.swing.*;
import java.awt.geom.*;public class JF extends JFrame { public JF() {
Container container = this.getContentPane();
container.add(new MyPanel()); this.setSize(400, 400);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
} /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
JF jf = new JF();
jf.setVisible(true);
}}class MyPanel extends JPanel {
double x, y, w, h;
int x1, y1, x2, y2;
Ellipse2D ellipse;
Ellipse2D selectedShape;
Rectangle2D boundingRec;
int count = 0; public MyPanel() {
x = 20;
y = 20;
w = 100;
h = 75;
setBackground(Color.white);
} protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2D = (Graphics2D) g;
ellipse = new Ellipse2D.Double(x, y, w, h);
g2D.draw(ellipse);
System.out.println(count++); //super.paintComponent(g);
}
}
很久都没写Java程序了,现在一直在用OpenGL,所以写了一个很烂的程序,但是能够很好的式作,在最大化和最小化后图形都能正常显示。
{
super.paintComponent(g);
//绘制棋盘
for(int row=0;row<8;row++)
{
for(int column=0;column<8;column++)
{
g.setColor(knight[row][column].backColor);
g.fillRect(knight[row][column].x, knight[row][column].y, 40, 40);
}
}
//绘制棋子
if(column2>=0 && column2<8 && row2>=0 && row2<8)
{
if(step==0 //判断走棋是否为马字形
|| ((java.lang.Math.abs(column2-stepX[step-1])+java.lang.Math.abs(row2-stepY[step-1]))==3)
&& (column2!=stepX[step-1])
&& (row2!=stepY[step-1])
)
{
stepX[step]=column2;
stepY[step]=row2;
step++; knight[row2][column2].setNotEmpty(); //标记该处已走过棋子
g.setColor(Color.WHITE);
g.fillOval(knight[row2][column2].x+10, knight[row2][column2].y+10, 20, 20);
}
}
}