图形-java的repaint()没有重绘,怎么回事呀。

问题描述

java的repaint()没有重绘,怎么回事呀。

package chapter17;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class showRadioButton extends JFrame{

/**
 * @param args
 */
showRadioButton(){
    creatButtonPanel bp =new creatButtonPanel();
    messagePanel mp = new messagePanel();

    setLayout(new BorderLayout());
    add(bp,BorderLayout.SOUTH);
    add(mp,BorderLayout.CENTER);

    messagePanel  messagepanel = new messagePanel();
    setSize(800,600);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
}
public static void main(String[] args) {
    // TODO 自动生成的方法存根
    showRadioButton srb = new showRadioButton();

}
//生成String,并操作String
class messagePanel extends JPanel{
    private String s = "Welcome to Java";
    private boolean bl = true;
    private int x ;
    private int y ;

    // 第一次绘制图形
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        // 设置string的位置
        if(bl == true){
            FontMetrics fm = g.getFontMetrics();
            int sw = fm.stringWidth(s)/2;
            int sh = fm.getAscent()/2;
            x = getWidth()/2 - sw;
            y = getHeight()/2 - sh;
            //开始绘制sting并且设置布尔值
            g.drawString(s,x,y);
            bl = false;
        }else{
            g.drawString(s,x,y);
        }
    }
    //重绘方法
    protected  void left(){
        x = x - 50;
        repaint();
    }
    public void right() {
        x = x + 50;
        repaint();
    }
}

//绘制button按钮并出册事件

class creatButtonPanel extends JPanel{
    public creatButtonPanel(){
    JButton jbtl = new JButton("left");
    JButton jbtr = new JButton("rigtht");
    jbtl.setMnemonic('L');
    jbtr.setMnemonic('R');
    //showRadioButton srb = new showRadioButton();

    add(jbtl);
    add(jbtr);
    jbtl.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            messagePanel mp = new messagePanel();
            mp.left();                    // 重要   外部类调用内部类
        }
    });
    jbtl.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            new messagePanel().right();
        }
    });
    //return buttonPanel;
    }
}

}


解决方案

你对象是内部类的,超出这个作用域之后会直接销毁,那么你每次重绘的都是不一样的对象,而不是同一个,每次都新建对象,你将这个对象设置为全局的看一下

解决方案二:

java中panel.repaint()没有实时重绘的问题

解决方案三:

package chapter17;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class showRadioButton extends JFrame{

/**
 * @param args
 */
showRadioButton(){
    creatButtonPanel bp =new creatButtonPanel();
    messagePanel mp = new messagePanel();

    setLayout(new BorderLayout());
    add(bp,BorderLayout.SOUTH);
    add(mp,BorderLayout.CENTER);

    messagePanel  messagepanel = new messagePanel();
    setSize(800,600);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
}
public static void main(String[] args) {
    // TODO 自动生成的方法存根
    showRadioButton srb = new showRadioButton();

}
//生成String,并操作String
class messagePanel extends JPanel{
    private String s = "Welcome to Java";
    private boolean bl = true;
    private int xn ;
    private int yn ;
    private int q = 1;

    // 第一次绘制图形
    protected void paintComponent(Graphics g){
        System.out.println("a");
        super.paintComponent(g);
        if(bl == true){
            // 设置string的位置
            FontMetrics fm = g.getFontMetrics();
            int sw = fm.stringWidth(s)/2;
            int sh = fm.getAscent()/2;
            int x = getWidth()/2 - sw;
            int y = getHeight()/2 - sh;
            xn = x;
            yn = y;

            //开始绘制sting并且设置布尔值
            g.drawString(s,xn,yn);
            bl = false;
            System.out.println(q++);
        }else{
            g.drawString(s,xn,yn);
        }
    }
    //重绘方法
    protected  void left(){
        xn = xn - 50;
        repaint();
        System.out.println("left" + q++);
    }
    public void right() {
        xn = xn + 50;
        repaint();
    }
}

//绘制button按钮并出册事件

class creatButtonPanel extends JPanel{
    public creatButtonPanel(){
    JButton jbtl = new JButton("left");
    JButton jbtr = new JButton("rigtht");
    jbtl.setMnemonic('L');
    jbtr.setMnemonic('R');
    //showRadioButton srb = new showRadioButton();

    add(jbtl);
    add(jbtr);
    jbtl.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            new messagePanel().left();
                                // 重要   外部类调用内部类
        }
    });
    jbtl.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            new messagePanel().right();
        }
    });
    //return buttonPanel;
    }
}

}


时间: 2024-12-09 22:18:01

图形-java的repaint()没有重绘,怎么回事呀。的相关文章

请教一个重绘操作的做法,以zedGraph为背景做GDI画图,重绘事件怎么处理

问题描述 具体代码如下,已经实现图形平移,但是图形被覆盖时,重绘事件做不出来,有知道的吗,敬请指教usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingZedGraph;usingSystem.Drawing.Imaging;usingSys

java树的节点事件里调用repaint方法 不能实现重绘

问题描述 java树的节点事件里调用repaint方法 不能实现重绘 java树的节点事件里调用repaint方法 不能实现重绘 怎么解决......................... 解决方案 http://zhidao.baidu.com/link?url=_s3y58ND8LIk-TtWOqBE2sXSaX5vKISRuxgRbdlCvZ2TPcjjujnp85-84Xto3Pa3rh7GEZ8yJ5ctIOYQxF7wTq

Qt重绘之update,repaint详解

Qt重绘之update,repaint详解       Qt里面的重绘和Windows编程里面的重绘差不多.但是Qt的重绘更有特色,更加智能.   在讲之前,先说说paintEvent() paintEvent()是一个虚函数槽(slot),子类可以对父类的paintEvent进行重写.当调用update(),repaint()的时候,paintEvent()会被调用,另外,当界面有任何改变的时候,paintEvent()也会被调用,这种界面的改变包括界面从隐藏到显示,界面尺寸改变,当然还包括界

怎么让java的Jframe在调整窗口大小时不重绘?

问题描述 建了一个JFrame,在jframe上添加了一个jpanel,在jpanel上面画东西,且调用了repaint(),但发现每次调整jframe窗口大小时jpanel上的东西就重绘一次,有没有什么方法在调整窗口大小时禁止调用repaint()函数呢? 解决方案 解决方案二:还有就是怎么实现JFrame不响应鼠标的拖放?就是不能通过鼠标拖放来改变jframe的大小?解决方案三:不使用布局即可

java ondraw重绘有哪些方法可以使用

问题描述 java ondraw重绘有哪些方法可以使用 安卓开发中要用到ondraw重绘机制,不知道有哪些方法可以用,最好举个例子,谢谢~ 解决方案 invalidate和postinvalidate,当然,也可以通过发消息实现重绘界面咯

关于重绘(repaint)和回流(reflow)的理解

  今天谈谈重绘和回流是怎么回事 一.什么是页面的重绘与回流 当页面中的部分或者全部元素改变宽度和高度.或者位置发生变化.删除或者增加某个或者某些元素时.某个元素影藏或者显示时,这时页面就需要重新加载了,这就叫做回流. 当页面的中的可见性发上变化时,比如:背景颜色吗,文字颜色等,这样就形成了重绘.  注:从上面可以看出,回流必将引起重绘,而重绘不一定会引起回流. 二.怎么减少重绘和回流呢 使用cssText属性,后在各浏览器中测试都通过了.一行代码即可,实在很妙.如 1 2 var head=

graphics-急求怎么实现单击按钮重绘面板啊

问题描述 急求怎么实现单击按钮重绘面板啊 就是我写了一个jframe类 里面定义了a1,a2,a3等几个面板,然后我又写了一个JPanel类,jpanel类写了一个paint()方法,主要是实现画一条曲线的功能,然后我在jframe类里面定义a1=new jpanel():然后运行jframe 的时候a1面板就自动加载了一天曲线,我现在想实现的是 在jframe里面加上一个按钮,单击按钮,给jpanel传参--也就是传入两个数组分别作为x.y轴的数据 然后重绘,同时单击按钮后,要面板的曲线重绘成

JPanel重绘问题

问题描述 拼图游戏原样是这个样子的点击4ROwAndColumn之前是这样的想要实现的功能是把三行拼图换成4行点击之后成了这个样子没有重绘,当我最小化窗口再恢复的时候就可以了,不知道原因,因为我已经在点击事件方法里面添加了重绘代码(repaint())了部分代码如下privatevoidjMenuItem5ActionPerformed(java.awt.event.ActionEventevt){if(imagePanel12.getSonPanelNumbers()==16){return;

用SetStyle方法重绘你的窗体

鲜为人知的SetStyle方法可以让你控制重绘一个窗体的方式. by Ken Getz 注:Ken Getz在Orlando的VSLive!上同Brian Randell一起举办了一个主题为"Build a Rich Client App with Visual Studio .NET"的研讨会.本篇技巧选自该研讨会的资料.运用GDI+和Windows窗体,我们可以很容易地创建一个渐变色(gradient)来填充一个区域.运用.NET Framework提供的简单的方法,你可以创建li