2016-07-18 10 views
0

나중에 향상시킬 테스트 응용 프로그램을 빌드 중입니다. 게임 루프 (업데이트, 렌더링)를 사용하여 캔버스에 그려진 Java 그래픽 요소가 있습니다. 그것은 마우스가 그것의 위에 놓일 때 그것의 색깔을 바꾸는 빨간 공이다.그래픽 요소 위쪽에 마우스를 놓은 캔버스 위에 JPanel을 추가하는 방법은 무엇입니까?

마우스가 볼 위에있을 때 JPanel을 만드는 방법을 알아 내려고 볼 안에 일종의 "숨겨진 정보"를 표시하려고합니다. 내 원래의 생각은 JFreeChart API로 만든 히스토그램을 "Hiden 정보"로 표시하는 것입니다. 따라서이 JPanel을 만든다면 나중에 JPanel에 히스토그램을 추가 할 수 있습니다.이 http://www.bitjuice.com.au/research/#hierarchicalclassificationexample과 유사합니다. 링크에서 언제든지 사각형 위에 마우스, 당신은 추가 정보를 표시

를 지금까지 내가있어이 코드 :.

* 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); 
} 
} 

애니메이션 .java (게임 루프)

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); 
} 
} 

나는 도움을 주셔서 감사합니다.

답변

0

중량이 적고 가벼운 구성 요소는 혼합되지 않습니다. JPanel은 가벼운 구성 요소이며 Canvas는 중량급입니다. 중량 구성 요소는 항상 경량 구성 요소 위에 그려집니다.

대신 마우스 오버 부분을 캔버스에 직접 그려 볼 수도 있습니다. FontMetrics를 사용하여 필요한 경우 문자열을 그릴 수 있습니다.

+0

감사합니다. 다만 문자열 만 사용하고 싶지는 않습니다. JFreeChart (http://i1-scripts.softpedia-static.com/screenshots/JFreeChart--17035.png)에서 차트를 표시하고 싶습니다. 요소를 클릭하여 다른 JFrame을 열면 어떻게됩니까? –

+0

예. CharPanel을 JFrame에 추가 한 다음 JFrame을 표시 할 수 있습니다. 새 차트 JFrame이 커서가있는 영역과 겹치지 않는 한 커서가 열린 영역 밖으로 이동하면 JFrame을 숨길 수도 있습니다. – markbernard

+0

좋아, 그걸 시도해 보겠다. 고맙습니다! –