Справка ImageIcon + закрыть панель JOption

Я пытаюсь заставить логотип PayPal всплыть, когда вы нажимаете "правая кнопка". К сожалению, все, что показывает, это логотип Java по умолчанию с чашкой кофе и ручкой.

Кроме того, как я могу сделать это так, когда вы нажимаете "ОК" или "Отмена", он закрывает панель JOptionPan, в настоящее время, когда вы нажимаете "ОК", ничего не происходит, он продолжает давать вам опции "ОК" / "Отмена".

rightbutton = new JButton("Right.");
add(rightbutton);
rightbutton.addActionListener(
        new ActionListener(){
            public void actionPerformed(ActionEvent event){
                //what do we want to happen when we
                //click the button
                final ImageIcon icon = new ImageIcon("C:\\Users\\Scr3am\\Desktop\\paypal.jpg");
                JOptionPane.showOptionDialog(null, "Congratulations, you clicked the button.", "Congrats", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, new Object[] { panel }, icon);
            }
        }
);

ПОЛНЫЙ КОД

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;


public class Password extends JFrame {

    JButton leftbutton;
    JButton centerbutton;
    JButton rightbutton;
    FlowLayout layout;
    Container container;




    Password(){
        super("Toolbar");
        layout = new FlowLayout();
        //get bulk of window, so it knows where to put the stuff
        container = getContentPane();
        setLayout(layout);

        //left stuff in here
        leftbutton = new JButton("Left");
        add(leftbutton);
        leftbutton.addActionListener(
                new ActionListener(){
                    public void actionPerformed(ActionEvent event){
                        //what do we want to happen when we
                        //click the button
                        layout.setAlignment(FlowLayout.LEFT);

                    }


                }

        );

        final JPanel panel = new JPanel();
        panel.add(new JButton("OK"));
        panel.add(new JButton("Cancel"));

        //center stuff in here
        centerbutton = new JButton("Center");
        add(centerbutton);
        centerbutton.addActionListener(
                new ActionListener(){
                    public void actionPerformed(ActionEvent event){
                        //what do we want to happen when we
                        //click the button
                        layout.setAlignment(FlowLayout.CENTER);
                        layout.layoutContainer(container);

                    }
                }
        );

        //right stuff in here
        rightbutton = new JButton("Right.");
        add(rightbutton);
        rightbutton.addActionListener(
                new ActionListener(){
                    public void actionPerformed(ActionEvent event){
                        //what do we want to happen when we
                        //click the button
                        try {
                            final ImageIcon icon = new ImageIcon(ImageIO.read(new File("paypalicon.gif")));

                            JOptionPane.showOptionDialog(
                                    null,
                                    "Congratulations, you clicked the button.",
                                    "Congrats",
                                    JOptionPane.OK_OPTION,
                                    JOptionPane.PLAIN_MESSAGE,
                                    icon,
                                    new Object[]{"Okay"},
                                    "Okay");
                        } catch (IOException exp) {
                            exp.printStackTrace();
                        }



                    }
                }
        );
    }


}

Ошибки:

javax.imageio.IIOException: Can't read input file!
at javax.imageio.ImageIO.read(ImageIO.java:1275)
at Password$3.actionPerformed(Password.java:79)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2028)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2351)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6414)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3275)
at java.awt.Component.processEvent(Component.java:6179)
at java.awt.Container.processEvent(Container.java:2084)
at java.awt.Component.dispatchEventImpl(Component.java:4776)
at java.awt.Container.dispatchEventImpl(Container.java:2142)
at java.awt.Component.dispatchEvent(Component.java:4604)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4618)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4279)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4209)
at java.awt.Container.dispatchEventImpl(Container.java:2128)
at java.awt.Window.dispatchEventImpl(Window.java:2492)
at java.awt.Component.dispatchEvent(Component.java:4604)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:717)
at java.awt.EventQueue.access$400(EventQueue.java:82)
at java.awt.EventQueue$2.run(EventQueue.java:676)
at java.awt.EventQueue$2.run(EventQueue.java:674)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:86)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:690)
at java.awt.EventQueue$3.run(EventQueue.java:688)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:86)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:687)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

2 ответа

Решение

Я думаю, что у вас неверные параметры

try {
    final ImageIcon icon = new ImageIcon(ImageIO.read(new File("paypalicon.gif")));

    JOptionPane.showOptionDialog(
            null,
            "Congratulations, you clicked the button.",
            "Congrats",
            JOptionPane.OK_OPTION,
            JOptionPane.PLAIN_MESSAGE,
            icon,
            new Object[]{"Okay"},
            "Okay");
} catch (IOException exp) {
    exp.printStackTrace();
}

JOptionPane объявляет showOptionDialog как имеющие следующие параметры (по порядку)

  • Component родительский компонент, связанный с диалогом
  • Object сообщение для отображения
  • String заголовок диалога
  • int тип параметров (если не указан), например JOptionPane.OKAY_CANCEL_OPTION
  • int тип сообщения, такой как JOptionPane.INFORMATION_MESSAGE, который может определить значок, который будет использовать диалог
  • Icon значок, отображаемый в диалоговом окне
  • Object[], опции, которые должны быть доступны пользователю (кнопки)
  • Object, начальный вариант, которому уделяется внимание

Кажется, вы проходите мимо...

  • null как родитель, хорошо.
  • "Congratulations, you clicked the button.", Хорошо
  • "Congrats", Хорошо
  • JOptionPane.DEFAULT_OPTION, Хорошо
  • JOptionPane.INFORMATION_MESSAGE наверное, хорошо, я бы использовал JOptionPane.PLAIN_MESSAGE, но это я
  • null... нет иконки?
  • new Object[] { panel }, не уверен, что это нормально, но, по крайней мере, это в нужном месте
  • icon... это даже не значение в параметрах параметров, которые вы передали... думаю, это упущенное место.

Проблема с кнопками сводится к тому, что они отключены от диалога. В диалоговом окне нет абсолютно никакой возможности узнать, что кнопки были нажаты, вам нужно будет предоставить эту функцию с помощью какого-либо ActionListener... если честно, это бы просто прошло String значения как options параметр и пусть JOptionPane визуализируйте их как кнопки, так как это будет иметь дело с закрытием диалогового окна, иначе это станет очень грязным, очень быстрым...

Для ImageIcon это потому, что у вас есть аргументы в неправильном порядке:

JOptionPane.showOptionDialog(
    null,
    "Congratulations, you clicked the button.",
    "Congrats",
    JOptionPane.DEFAULT_OPTION,
    JOptionPane.INFORMATION_MESSAGE,
    null,
    new Object[] { panel },
    icon
);

Итак, прямо сейчас вы предоставляете null для значка и значок для начального значения. Так должно быть:

JOptionPane.showOptionDialog(
    null,
    "Congratulations, you clicked the button.",
    "Congrats",
    JOptionPane.DEFAULT_OPTION,
    JOptionPane.INFORMATION_MESSAGE,
    icon,
    new Object[] { panel },
    null
);

Что касается другого вопроса, похоже, что вы предоставляете свои собственные опции в качестве какой-то панели. Я думаю, технически, что вы могли бы сделать, это использовать конструктор, чтобы у вас была ссылка на панель JOptionPane, которую вы можете программно отклонить, но вам не нужно это делать. Вместо этого я бы рекомендовал использовать обычные OK_CANCEL_OPTION который сделает это для вас.

int optionChosen = JOptionPane.showConfirmDialog(
    null,
    "Congratulations, you clicked the button.",
    "Congrats",
    JOptionPane.OK_CANCEL_OPTION,
    JOptionPane.INFORMATION_MESSAGE,
    icon
);

Изменить для вашего комментария:

  • Попробуйте заменить обратные косые черты в пути на прямые косые черты. В документе сказано, что путь преобразуется в URL и используется прямая косая черта. Смотрите также File.separator против Slash в путях.
  • Документ говорит, что изображение загружается в фоновом режиме. Другими словами, вы можете отображать изображение до загрузки данных. Есть две вещи, которые вы могли бы сделать. Во-первых, предварительно загрузив изображение в начале программы, сделав его статическим элементом, во-вторых, используя ImageIO, который сразу же загрузит изображение полностью.

Вы должны действительно предварительно загрузить изображение в любом случае. В противном случае вы читаете файл каждый раз, когда открываете диалоговое окно.

static final ImageIcon paypalIcon;
static {
    BufferedImage img = null;
    try {
        img = ImageIO.read(new File("your/path"));
    } catch(IOException ioe) {
        ioe.printStackTrace(System.err);
    }

    // set to null if the image failed to load
    // if you pass null to showXXXDialog it uses the Look & Feel default
    // this way the program still works if it can't find the file
    if(img == null) {
        paypalIcon = null;
    } else {
        paypalIcon = new ImageIcon(img);
    }
}
Другие вопросы по тегам