【问题标题】:how to call the method repaint() after a certain time如何在一定时间后调用方法 repaint()
【发布时间】:2014-04-28 18:05:02
【问题描述】:

我想更新工具提示,所以我想使用重绘方法,每 30 秒重绘一次框架,但它不起作用。谁能帮帮我..

GrphicsTut 方法

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;
import javax.swing.ImageIcon;
import javax.swing.JFrame;

public class GrphicsTut extends JFrame{
    Timer timer; 
    Image image;
    Image image2;
    int x1,y1,x2,y2;
    Font fonte = new Font("TimesRoman ",Font.BOLD,100);

    public GrphicsTut(){
        MouseListenerJ bkg = new MouseListenerJ();
        this.setTitle("Remember g for Graphics");
        this.setSize(600,500);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        this.addMouseMotionListener(bkg);
        this.addMouseListener(bkg);
        this.add(bkg);
    }

    public void paint(Graphics gr){ 
        gr.setFont(fonte);
        gr.setColor(Color.black);
        gr.drawLine(35,35, 410, 110);
        gr.drawLine(410,110, 310, 410);
        ImageIcon i=new ImageIcon("image/1005511030.jpg");
        image=i.getImage();
        gr.drawImage(image, 35, 35,null);
        gr.drawImage(image, 400, 100,null);
        gr.drawImage(image, 300, 400,null);
        repaint();
    }

    public static void main(String[] args) {
        new GrphicsTut();
    }
}

这里是 MouseListner 的方法

package Carte;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class MouseListenerJ extends JPanel implements MouseListener, MouseMotionListener {
    public MouseListenerJ(){}
    public void paint(Graphics g){}

    @Override
    public void mouseClicked(MouseEvent me) {
        // TODO Auto-generated method stub
        if(me.getX()>=35 && me.getX()<=70 && me.getY()>=35 &&me.getY()<=70){
            //JOptionPane.showMessageDialog(null,"Que voulez vous faire");
            new Carte1();
        }       
    }

    @Override
    public void mouseEntered(MouseEvent me) {
        // TODO Auto-generated method stub
        //System.out.println("Entered at x "+me.getX());
    }

    @Override
    public void mouseExited(MouseEvent me) {
        // TODO Auto-generated method stub
        //System.out.println("Exited"); 
    }

    @Override
    public void mousePressed(MouseEvent me) {
        // TODO Auto-generated method stub
        System.out.println("Pressed at : "+me.getX()+" "+me.getY());
    }

    @Override
    public void mouseReleased(MouseEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("released");
    }

    @Override
    public void mouseDragged(MouseEvent arg0) {
        // TODO Auto-generated method stub  
    }

    @Override
    public void mouseMoved(MouseEvent me) {
        // TODO Auto-generated method stub
        if(me.getX()>=35 && me.getX()<=70 && me.getY()>=35 && me.getY()<=70){
            //JOptionPane.showMessageDialog(null,"Que voulez vous faire");
            this.setToolTipText("text");
            System.out.println(me.getX()+"  "+me.getY());
        }
        else if(me.getX()>=400 && me.getX()<=470 && me.getY()>=100 && me.getY(<=170){
            this.setToolTipText("Text 2");
            System.out.println(me.getX()+"  "+me.getY());
        }
    }   
}

【问题讨论】:

  • 1) 考虑告诉我们您的初衷,因为这看起来......很糟糕 2) 永远不要在其中一个 paint() 方法中调用 repaint(),这会创建一个无限循环 3) 总是调用 super。 paintXXX() 方法中的paintXXX() 4) 考虑覆盖paintComponent 而不是paint() 5) 不要在您的paint() 方法中创建ImageIcon,而是预先创建它并始终重用相同的变量(您甚至可以在这种情况下使其成为常数)
  • 感谢您的回答。我的目标是将一些图标放在图形界面中,然后使用 mouseEvent 获取这些图标的工具提示或传递给其他界面(如果我点击它)。

标签: java eclipse swing graphics repaint


【解决方案1】:

考虑使用本机 Swing 组件来实现您的目标。它们提供您想要的所有功能:

  • 处理鼠标点击
  • 显示工具提示
  • 显示图片

这里有一个小sn-p,教你如何使用JButton

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class TestButtons {

    protected void initUI() throws MalformedURLException {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel(new GridLayout(2, 2, 20, 20));
        panel.add(createButton("https://pbs.twimg.com/profile_images/378800000534649369/489a1e058bea59b62fd73c56f4bcb6c7.jpeg"));
        panel.add(createButton("https://pbs.twimg.com/profile_images/378800000714838591/ebbde1563faae6da2be79df945a7a02b.jpeg"));
        panel.add(createButton("https://pbs.twimg.com/profile_images/3477392906/f1907df0bd76668deac4a5e31a22fbe7.jpeg"));
        panel.add(createButton("https://pbs.twimg.com/profile_images/2718799802/9567ed3c3299f6f6ab1ffcbcbfd93da5.jpeg"));
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    private JButton createButton(final String url) throws MalformedURLException {
        final JButton button = new JButton(new ImageIcon(new URL(url)));
        button.setToolTipText("You are looking at image located at " + url);
        button.setBorderPainted(false);
        button.setContentAreaFilled(false);
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(button,
                        "You clicked on image located at " + url);
            }
        });
        return button;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    new TestButtons().initUI();
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                }
            }
        });
    }

}

【讨论】:

  • 这种方法的问题是我不能画线,这就是我选择在java中使用Graphics的原因。因为我需要一些网络设备的地图之类的东西。 link_italic_ 粗体 code。当我将鼠标悬停在图像或链接(线)上时,它会显示一些信息,如 IP 地址、端口等。
  • @aziz 这个方法的问题是我不能画线 ??? :-? ???让我告诉你我对这种说法的惊讶:1)这仍然是完全可能的。 2) 为什么不首先提到这一点?
  • 因为当我使用方法 drawImage(图形)绘制图像时。我确切地知道它的坐标。所以我将使用它们通过drawLine(x1,y1,x2,y2)链接两个图像。但在这种情况下,您使用了 GridLayout ..(或其他)..这是我想要绘制的 Example。 (我在上一条评论中提到过)为什么不首先提及:因为我的问题在于方法重绘(我想自己学习;))谢谢。
  • @Aziz 您可以完美地找到图像的坐标,您只需将按钮存储在某处,然后只需 wuery button.getBounds()。然后,您可以决定覆盖panelpaint() 方法并在调用super.paint() 之后绘制线条(这将确保您实际绘制在子按钮上)。
猜你喜欢
  • 2013-12-25
  • 2015-03-20
  • 1970-01-01
  • 2016-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-13
相关资源
最近更新 更多