Java 如何在JDialog中添加完整图像此对话框由JOptionPane创建

Java 如何在JDialog中添加完整图像此对话框由JOptionPane创建,java,swing,Java,Swing,我的问题是,如果JDialog,这个JDialog是由JOptionPane创建的,我想添加完整的背景图像。此图像未覆盖整个对话框 如果你有任何解决办法,请告诉我 public class BrowseFilePath { public static final String DIALOG_NAME = "what-dialog"; public static final String PANE_NAME = "what-pane"; private static JD

我的问题是,如果
JDialog
,这个
JDialog
是由
JOptionPane
创建的,我想添加完整的背景图像。此图像未覆盖整个
对话框

如果你有任何解决办法,请告诉我

public class BrowseFilePath {

    public static final String DIALOG_NAME = "what-dialog";
    public static final String PANE_NAME = "what-pane";
    private static JDialog loginRegister;
    private static String path;
    private static JPanel Browse_panel = new JPanel(new BorderLayout());
    private static JLabel pathLbl = new JLabel("Please Choose Folder / File");  
    private static JTextField regtxt_file = new JTextField(30);

    private static JButton browse_btn = new JButton("Browse");
    private static JButton ok_btn = new JButton("Ok");
    private static JButton close_btn = new JButton("Cancel");

    /*public static void main(String [] arg){
        showFileDialog();
    }*/
    public static void showFileDialog() {

        JOptionPane.setDefaultLocale(null);
        JOptionPane pane = new JOptionPane(createRegInputComponent());
        pane.setName(PANE_NAME);
        loginRegister = pane.createDialog("ShareBLU");
       /* try {
        loginRegister.setContentPane(new JLabel(new ImageIcon(ImageIO.read(AlertWindow.getBgImgFilePath()))));
        } catch (IOException e) {
            e.printStackTrace();
        }*/

        loginRegister.setName(DIALOG_NAME);
        loginRegister.setSize(380,150);
        loginRegister.setVisible(true);
        if(pane.getInputValue().equals("Ok")){
            String getTxt = regtxt_file.getText();
            BrowseFilePath.setPath(getTxt);
        }
        else if(pane.getInputValue().equals("Cancel")){
            regtxt_file.setText("");
            System.out.println("Pressed Cancel Button =======********=");
            System.exit(0);
        }
    }
    public static String getPath() {
        return path;
    }


    public static void setPath(String path) {
        BrowseFilePath.path = path;
    }


    private static JComponent createRegInputComponent() {
        Browse_panel = new JBackgroundPanel();

        Browse_panel.setLayout(new BorderLayout());

        Box rows = Box.createVerticalBox();
         Browse_panel.setBounds(0,0,380,150);

         Browse_panel.add(pathLbl);
         pathLbl.setForeground(Color.white);
         pathLbl.setBounds(20, 20, 200, 20);

         Browse_panel.add(regtxt_file);
         regtxt_file.setToolTipText("Select File/Folder..");
         regtxt_file.setBounds(20, 40, 220, 20);
         Browse_panel.add(browse_btn);
         browse_btn.setToolTipText("Browse");
         browse_btn.setBounds(250, 40, 90, 20);
         Browse_panel.add(ok_btn);
         ok_btn.setToolTipText("Ok");
         ok_btn.setBounds(40, 75, 80, 20);
         Browse_panel.add(close_btn);
         close_btn.setToolTipText("Cancel");
         close_btn.setBounds(130, 75, 80, 20);
        ActionListener chooseMe = createChoiceAction();
        ok_btn.addActionListener(chooseMe);
        close_btn.addActionListener(chooseMe);
        browse_btn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JFileChooser fileChooser = new JFileChooser();
                int selection = JFileChooser.FILES_AND_DIRECTORIES;
                fileChooser.setFileSelectionMode(selection);
                fileChooser.setAcceptAllFileFilterUsed(false);
                int rVal = fileChooser.showOpenDialog(null);
                if (rVal == JFileChooser.APPROVE_OPTION) {
                    path = fileChooser.getSelectedFile().toString();
                    regtxt_file.setText(path);
                }
            }

        });
         rows.add(Box.createVerticalStrut(105));
         Browse_panel.add(rows,BorderLayout.CENTER);
        return Browse_panel;
    }

    public  static ActionListener createChoiceAction() {
        ActionListener chooseMe = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JButton choice = (JButton) e.getSource();

                // find the pane so we can set the choice.
                Container parent = choice.getParent();
                while (!PANE_NAME.equals(parent.getName())) {
                    parent = parent.getParent();

                }

                JOptionPane pane = (JOptionPane) parent;
                pane.setInputValue(choice.getText());

                // find the dialog so we can close it.
                while ((parent != null) && !DIALOG_NAME.equals(parent.getName()))
                { 
                    parent = parent.getParent();
                //parent.setBounds(0, 0, 350, 150);
                }

               if (parent != null) {
                    parent.setVisible(false);
                }
            }
        };
        return chooseMe;
    } 
}

不要使用
JOptionPane
,而是使用完整的
JDialog
。将内容窗格设置为覆盖
paintComponent()
并返回适当的
getPreferredSize()
JComponent

示例代码如下:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class TestBackgroundImage {

    private static final String BACKHGROUND_IMAGE_URL = "http://cache2.allpostersimages.com/p/LRG/27/2740/AEPND00Z/affiches/blue-fiber-optic-wires-against-black-background.jpg";

    protected void initUI() throws MalformedURLException {
        JDialog dialog = new JDialog((Frame) null, TestBackgroundImage.class.getSimpleName());
        dialog.setModal(true);
        dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        final ImageIcon backgroundImage = new ImageIcon(new URL(BACKHGROUND_IMAGE_URL));
        JPanel mainPanel = new JPanel(new BorderLayout()) {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.drawImage(backgroundImage.getImage(), 0, 0, getWidth(), getHeight(), this);
            }

            @Override
            public Dimension getPreferredSize() {
                Dimension size = super.getPreferredSize();
                size.width = Math.max(backgroundImage.getIconWidth(), size.width);
                size.height = Math.max(backgroundImage.getIconHeight(), size.height);

                return size;
            }
        };
        mainPanel.add(new JButton("A button"), BorderLayout.WEST);
        dialog.add(mainPanel);
        dialog.setSize(400, 300);
        dialog.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                try {
                    new TestBackgroundImage().initUI();
                } catch (MalformedURLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
    }

}

别忘了提供一个合适的父级
框架

我的问题是我想添加完整的背景图像如果JDialog,这个JDialog是由JOptionPane创建的。此图像未覆盖整个对话框。任何解决方案请允许我:不要使用JOptionPane!使用一个完整的JDialog和一个contentPane,该contentPane扩展JComponent,覆盖paintComponent()(在调用super.paintComponent后绘制图像)并返回一个适当的首选大小请参阅下面的我的答案(注释对于完整代码来说太小)hi这是一个很好的示例,但在这个示例中是一个主要问题,公共静态void main(字符串[]args){SwingUtilities.invokeLater(new Runnable(){@Override public void run(){try{new TestBackgroundImage().initUI();}catch(MalformedURLException e){//TODO自动生成的catch块e.printStackTrace()}}};System.out.println(“此行将在按下此错误按钮之前执行”);}System.out.println(“此行将在按下此错误按钮之前执行”);这一行在按下按钮之前执行,使用我们手中的按钮的joptionpane控件。@user1936089我不知道您试图实现的目标的上下文。但是,在大多数情况下,您不会在事件调度线程之外调用JDialog。因此调用
JDialog.setVisible(true)
将阻止调用并等待隐藏
JDialog
@user1936089的任何操作,以了解我的意思,在
对话框之后添加
System.err.println(“Hello”);
setVisible(true);
,将
ActionListener
添加到
JButton
并执行
对话框.setVisible(false)
actionPerformed(ActionEvent e)
中(您需要将对话框变量设置为final:
final dialog=…
),只有在按下按钮后,您才会在控制台中看到“Hello”。