2012-10-09 2 views
1

내 JPanel에서 팝업 이미지를 만들고 싶습니다.자바 스윙 팝업 이미지

는 지금은 이런 일이 :

enter image description here

을하지만,이 같은 것을 얻을 필요가 : 나는 X1을 누른 후

enter image description here

이 될 것입니다. Java에서이 작업을 수행하는 방법은 무엇입니까? Thnx.

+0

, 당신은, 파란색 원 X1 또는를 눌러 X를 클릭 뜻 키보드의 1을 눌러 다음? 또한 X1 이미지 또는 [JButton] (http://docs.oracle.com/javase/6/docs/api/javax/swing/JButton.html)의 하위 클래스 또는 다른 것이 있습니까? – linski

+0

X1, X1을 클릭하십시오 - 아이콘이있는 JLable입니다. – Val

+0

[GlassPane] (http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html) 또는 [JLayer/JXLayer] (http://docs.oracle.com/javase)와 같은 것을 사용할 수 있습니다. /tutorial/uiswing/misc/jlayer.html). 그러나 단순화를 위해 JPopupMenu 제안을 좋아합니다.) – MadProgrammer

답변

2

출발점으로, 이와 같은 것이 당신에게 도움이 될 수 있습니다. (아주 빨리 합치고, 부드럽게 말하십시오.) 글래스 패널 접근법이 가장 깨끗하게 보일 것이라고 생각합니다. paintComponent() 메서드에서 정보 풍선에 포인터를 추가하는 방법을 알려 드리겠습니다.보도 X1에 의해

enter image description here

static MyInfoBubble lastBubble; 


public static void main(String[] args) 
{ 
    JFrame frame = new JFrame(); 
    frame.setSize(new Dimension(500, 500)); 

    JPanel glassPane = new JPanel(); 
    glassPane.setOpaque(false); 
    glassPane.setLayout(null); 

    frame.setGlassPane(glassPane); 
    frame.getGlassPane().setVisible(true); 

    JPanel labelRowPanel = new JPanel(); 
    for (int ctr = 0; ctr < 7; ctr++) { 
     labelRowPanel.add(makeButton(frame, "Button " + ctr)); 
    } 

    frame.getContentPane().add(labelRowPanel); 
    frame.setVisible(true); 
} 



private static JButton makeButton(final JFrame frame, final String label) { 
    final JButton button = new JButton(label); 

    button.addActionListener(new ActionListener() { 

     public void actionPerformed(ActionEvent arg0) 
     { 
      if (lastBubble != null) 
      { 
       lastBubble.setVisible(false); 
       ((JPanel)frame.getGlassPane()).remove(lastBubble); 
       lastBubble = null; 
      } 

      Point loc = button.getLocation(); 
      MyInfoBubble mib = new MyInfoBubble(); 
      mib.setBounds(loc.x+10, loc.y+30, 100, 50); 
      ((JPanel)frame.getGlassPane()).add(mib); 
      lastBubble = mib; 

      ((JPanel)frame.getGlassPane()).validate(); 
      ((JPanel)frame.getGlassPane()).repaint(); 
     } 

    }); 

    return button; 
} 


static class MyInfoBubble extends JPanel 
{ 
    public MyInfoBubble() 
    { 
     setVisible(true); 
    } 


    public void paintComponent(Graphics g) 
    { 
     Graphics2D g2d = (Graphics2D)g; 
     g2d.setColor(Color.BLUE); 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     g2d.fillRoundRect(0, 0, getWidth(), getHeight(), 20, 20); 
    } 

} 
2

같은 메뉴 만들기 :

JPopupMenu popupmenu = new JPopupMenu(); 
JMenuItem jMenuItem = new JMenuItem(new ImageIcon(getClass().getResource("/topmostpackage/sub/package/s/img.png"))); 
popupmenu.add(jMenuItem); 

그런 다음 해당 버튼에 클릭 핸들러를 추가하고이 같은 메뉴를 보여줍니다 위의 예제가 작동하려면 :

MouseAdapter mouseAdapter = new MouseAdapter() { 

     @Override 
     public void mouseClicked(MouseEvent e) { 
      super.mouseClicked(e); 
      popupmenu.show(button, e.getXOnScreen(), e.getYOnScreen()); 
     } 

    }; 
    button.addMouseListener(mouseAdapter); 

편집을 그렇지 않다면 다음과 같이 읽을 수 있습니다.

URI uri = new URI("file:///home/linski/empty.png"); 
    ImageIcon imageIcon = new ImageIcon(uri.toURL()); 

그래서, file : // 나는 리눅스 파일 시스템에 이미지의 경로를 넣었다. 윈도우/맥에서 테스트 할 수는 없지만, 브라우저를 통해 이미지를 열고 브라우저 주소 표시 줄에서 올바른 형식의 경로를 읽을 수 있습니다.

EDIT^2 : 풍선 이미지가 메뉴 항목이되고 메뉴가 표시되는 것과 같이이 솔루션은 사용자가 제공 한 이미지와 정확하게 일치하지 않으므로 필요에 맞지 않습니다.

편집^3 :

내가 인스턴스를 대신 JPopupMenu의 인스턴스화, 당신에게이 클래스 빠른 해킹을주지 :

public class CustomMenuItem extends JMenuItem { 

    public CustomMenuItem(Icon icon) { 
     super(icon); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     getIcon().paintIcon(this, g, 0, 0); 
    }  

} 
대신 JMenuItem를이 클래스의 인스턴스를 인스턴스화

public class CustomPopUpMenu extends JPopupMenu { 

    @Override 
    protected void paintComponent(Graphics g) {} 

} 

그리고 원하는 것을 거의 얻을 수 있습니다. 이것은 "해킹"(해킹이 아니라 "해킹")입니다. 이 아니며이 수행되는 방법입니다. 이를 수행하는 올바른 방법은 JPopUpMenuUI를 커스터마이징하는 것입니다 (아마 그 클래스의 고유 한 서브 클래스를 만드는 것과 결합하여).

나는 당신에게 어떻게 보여줄 수는 없지만 시간이 있자 마자 나는 learn이 될 것이라고 알고있다. 또한 this을 참조하십시오.

+1 흥미로운 질문 : +1

+0

다음과 같은 내용이 있습니다. http://s017.radikal.ru/i408/1210/8f/b88723d1ae85.png 보이지 않는 배경 및 경계가있는 경우 – Val

+0

특정 구성 요소 전체가 아닌 [모양 및 느낌] (http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html)을 변경하려고합니다 . 그 정도까지는 결코하지 않았고 순수한 재원도 부족했습니다. 나는 현재 내가 그것을 무언가를 얻을 수 있다면 업데이트 할 클래스를 "해킹"하려고하고있다. – linski