1

JPanelでポップアップ画像を作成したい。

今、私はこのようなものを持っています:

ここに画像の説明を入力してください

しかし、次のようなものを取得する必要があります:

ここに画像の説明を入力してください

X1を押した後です。Javaでこれを行う方法は?Thnx。

4

2 に答える 2

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://の後に、Linuxファイルシステムにイメージへのパスを配置します。Windows / Macでそれをテストすることはできませんが、ブラウザで画像を開き、ブラウザのアドレスバーから正しくフォーマットされたパスを読み取ることができます。

EDIT ^ 2:このソリューションは、提供した画像とまったく同じようには見えないため、ニーズに適合しません。バルーン画像がメニュー項目になり、メニューが表示されます。

編集^3:

JPopupMenuをインスタンス化する代わりに、次のクラスをインスタンス化して、すばやくハックします。

public class CustomPopUpMenu extends JPopupMenu {

    @Override
    protected void paintComponent(Graphics g) {}

}

JMenuItemをインスタンス化する代わりに、このクラスをインスタンス化します。

public class CustomMenuItem extends JMenuItem {

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

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

}

そして、あなたはほとんどあなたが望むものを手に入れるでしょう。これは「ハック」(ハックではなく「ハック」)であることに注意してください。これは、意図された方法ではありません。それを行う正しい方法は、JPopUpMenuUIをカスタマイズすることです(おそらく、そのクラスの独自のサブクラスを作成することと組み合わせて)。

方法はお見せできませんが、時間があればすぐに習得します。こちらもご覧ください。

興味深い質問のために+1します:)

于 2012-10-09T15:44:31.757 に答える
2

出発点として、このようなものがあなたのために働くかもしれません。(非常にすばやくまとめて、優しくしてください。)GlassPaneアプローチが最もきれいに見えると思います。メソッドの情報バブルにポインタを追加するのはあなたに任せますpaintComponent()

ここに画像の説明を入力してください

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

}
于 2012-10-09T22:23:36.693 に答える