나중에 향상시킬 테스트 응용 프로그램을 빌드 중입니다. 게임 루프 (업데이트, 렌더링)를 사용하여 캔버스에 그려진 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);
}
}
나는 도움을 주셔서 감사합니다.
감사합니다. 다만 문자열 만 사용하고 싶지는 않습니다. JFreeChart (http://i1-scripts.softpedia-static.com/screenshots/JFreeChart--17035.png)에서 차트를 표시하고 싶습니다. 요소를 클릭하여 다른 JFrame을 열면 어떻게됩니까? –
예. CharPanel을 JFrame에 추가 한 다음 JFrame을 표시 할 수 있습니다. 새 차트 JFrame이 커서가있는 영역과 겹치지 않는 한 커서가 열린 영역 밖으로 이동하면 JFrame을 숨길 수도 있습니다. – markbernard
좋아, 그걸 시도해 보겠다. 고맙습니다! –