2016-07-18 1 views
0

Je construis l'application de test pour améliorer plus tard. J'ai un élément graphique Java dessiné sur une toile en utilisant une boucle de jeu (mise à jour, rendu). C'est une boule rouge qui change de couleur lorsque la souris est placée dessus. J'essaie de trouver une méthode pour créer un JPanel lorsque la souris est au-dessus de la balle, pour montrer une sorte d '"informations cachées" à l'intérieur de la balle. Mon idée originale est d'afficher un histogramme fait avec l'API JFreeChart en tant qu '"information Hiden", donc je crois que si je crée ce JPanel, je peux ajouter plus tard l'histogramme au JPanel créé.Semblable à ceci: http://www.bitjuice.com.au/research/#hierarchicalclassificationexample. la souris au-dessus des rectangles, vous affichez des informations supplémentairesComment ajouter un JPanel au-dessus d'une toile en plaçant la souris sur le dessus d'un élément graphique?

jusqu'à présent, j'ai ce code.

* Window.java * (JFrame)

public class Window extends JFrame { 

JLabel title_label = new JLabel(); 

public Window(int width, int height, String title, Animation animation){ 

    setTitle(title); 
    setPreferredSize(new Dimension(width,height)); 
    setMaximumSize(new Dimension(width,height)); 
    setMinimumSize(new Dimension(width,height));   
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setResizable(false); 
    setLocationRelativeTo(null); 
    add(animation); 
    add(title_label, BorderLayout.SOUTH); 
    setVisible(true); 
    animation.start(); 
} 

public void update(){ 
    title_label.setText(Animation.mouseX + " " + Animation.mouseY); 
} 
} 

animation .java (Le jeu Boucle)

public class Animation extends Canvas implements Runnable { 

public static final int WIDTH = 1024, HEIGHT = WIDTH/12*9 ; 
private Thread thread; 
private boolean running = false; 
public static int mouseX,mouseY; 
public Window window; 
Button button = new Button(); 
public Animation(){ 
    window = new Window(WIDTH, HEIGHT,"Test", this); 
    addMouseMotionListener(new Handler(window)); 
    addMouseListener(new Handler(window)); 
} 

public void run() {    
    this.requestFocus(); 
    long lastTime = System.nanoTime(); 
    double amountOfTicks = 60.0; 
    double ns = 1000000000/amountOfTicks; 
    double delta = 0; 
    long timer = System.currentTimeMillis(); 
    int frames = 0; 


    while(running){   
     long now = System.nanoTime(); 
     delta += (now-lastTime)/ns; 
     lastTime = now;   
     while(delta >= 1){ 
      update();    
      delta--; 
     } 
     if(running) 
      render(); 
     frames++;   
     if(System.currentTimeMillis() - timer >1000){ 
      //System.out.println(frames); 
      timer += 1000; 
      frames = 0; 
     } 
    } 
    stop(); 
} 

public synchronized void start(){ 
     thread = new Thread(this); 
     thread.start(); 
     running = true; 
    } 

public synchronized void stop(){    
     try{ 
      thread.join(); 
      running = false;     
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 



public static int getMouseX(){ 
    return mouseX; 
} 

public static int getMouseY(){ 
    return mouseY; 
} 

public static void setMouseX(int x){ 
    mouseX = x; 
} 

public static void setMouseY(int y){ 
    mouseY = y; 
} 

private void update(){  
    window.update(); 
    button.update(); 
} 

private void render(){ 
    BufferStrategy bs = this.getBufferStrategy(); 
    if(bs == null){ 
     this.createBufferStrategy(4); 
     return; 
    }  
    RenderingHints rh = new RenderingHints(
      RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 
    rh.put(RenderingHints.KEY_RENDERING, 
      RenderingHints.VALUE_RENDER_QUALITY); 
    Graphics g = bs.getDrawGraphics(); 
    Graphics2D g2d = (Graphics2D)g; 
    g2d.setRenderingHints(rh); 
    g2d.setColor(Color.white); 
    g2d.fillRect(0, 0, WIDTH, HEIGHT);  
    button.render(g); 
    g.dispose(); 
    g2d.dispose(); 
    bs.show(); 
} 

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

} 

Handler.java

public class Handler extends MouseAdapter { 

int x,y; 

private Window window; 
public Handler(Window window){ 
    this.window = window; 
} 

public void mouseMoved(MouseEvent e){ 
    Animation.setMouseX(e.getX()); 
    Animation.setMouseY(e.getY()); 

} 
} 

Button.java

public class Button { 

Ellipse2D mask; 
boolean mouseIsOn = false; 

public Button(){ 
    mask = new Ellipse2D.Double(500,350,50,50); 
} 
public void update(){ 
    if(mask.contains(Animation.mouseX,Animation.mouseY)){ 
     mouseIsOn = true; 
    }else 
     mouseIsOn = false; 
} 

public void render(Graphics g){ 

    if(mouseIsOn) 
     g.setColor(Color.green); 
    else 
     g.setColor(Color.red); 
    g.fillOval(500,350, 50, 50); 
} 
} 

Je vous remercie de l'aide.

Répondre

0

Les composants lourds et légers ne se mélangent pas. JPanel est un composant léger et Canvas est un poids lourd. Les composants lourds sont toujours attirés par des composants légers.

Ce que vous pouvez faire à la place est simplement dessiner la partie de la souris directement sur votre toile. Vous pouvez utiliser FontMetrics pour dessiner des chaînes si c'est ce dont vous avez besoin.

+0

Merci, mais je ne veux pas utiliser seulement des chaînes. Je veux afficher un graphique de JFreeChart (http://i1-scripts.softpedia-static.com/screenshots/JFreeChart--17035.png) Que faire si j'ouvre un autre JFrame en cliquant sur l'élément? –

+0

Oui. Vous pouvez ajouter un CharPanel à un JFrame et ensuite afficher le JFrame. Vous pouvez même masquer le JFrame une fois que le curseur quitte la zone qui l'a ouvert tant que votre nouvelle carte JFrame ne chevauche pas la zone où se trouve le curseur. – markbernard

+0

Ok, je vais essayer ça. Je vous remercie! –