Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建Java对话框_Java_User Interface_Dialog - Fatal编程技术网

创建Java对话框

创建Java对话框,java,user-interface,dialog,Java,User Interface,Dialog,创建对话框的最简单方法是什么: 在一个窗口中,我给出了信封地址的数据,还从大小列表中设置了字体类型 单击“确定”后,在同一窗口或下一窗口中,我可以预览信封在给定名称下的外观,并使用选定的字体大小 它应该类似于: 我应该使用Jdialog吗?或者JOptionPane就足够了?下一步是选择字体和背景的颜色,所以我必须记住这一点。您需要使用JDialog。在JOptoinPane上乱搞毫无意义——它不仅仅是为了收集一个简单的字符串。此外,使用或-它将帮助您获得易于编码的良好布局。如果允许使用G

创建对话框的最简单方法是什么:

  • 在一个窗口中,我给出了信封地址的数据,还从大小列表中设置了字体类型
  • 单击“确定”后,在同一窗口或下一窗口中,我可以预览信封在给定名称下的外观,并使用选定的字体大小
它应该类似于:


我应该使用Jdialog吗?或者JOptionPane就足够了?下一步是选择字体和背景的颜色,所以我必须记住这一点。

您需要使用JDialog。在JOptoinPane上乱搞毫无意义——它不仅仅是为了收集一个简单的字符串。此外,使用或-它将帮助您获得易于编码的良好布局。

如果允许使用GUI生成器,我建议您使用

你可以在5-10分钟内创建类似的东西

如果这是不可能的(也许你想练习学习或其他东西),我会使用JFrame来代替)


应该没那么难做

这应该能让你走了

class TestDialog extends JDialog {

    private JButton okButton = new JButton(new AbstractAction("ok") {
        public void actionPerformed(ActionEvent e) {
            System.err.println("User clicked ok");
            // SHOW THE PREVIEW...
            setVisible(false);
        }
    });
    private JButton cancelButton = new JButton(new AbstractAction("cancel") {
        public void actionPerformed(ActionEvent e) {
            System.err.println("User clicked cancel");
            setVisible(false);
        }
    });

    private JTextField nameField = new JTextField(20);
    private JTextField surnameField = new JTextField();
    private JTextField addr1Field = new JTextField();
    private JTextField addr2Field = new JTextField();
    private JComboBox sizes = new JComboBox(new String[] { "small", "large" });

    public TestDialog(JFrame frame, boolean modal, String myMessage) {
        super(frame, "Envelope addressing", modal);

        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
        getContentPane().add(mainPanel);

        JPanel addrPanel = new JPanel(new GridLayout(0, 1));
        addrPanel.setBorder(BorderFactory.createTitledBorder("Receiver"));
        addrPanel.add(new JLabel("Name"));
        addrPanel.add(nameField);
        addrPanel.add(new JLabel("Surname"));
        addrPanel.add(surnameField);
        addrPanel.add(new JLabel("Address 1"));
        addrPanel.add(addr1Field);
        addrPanel.add(new JLabel("Address 2"));
        addrPanel.add(addr2Field);
        mainPanel.add(addrPanel);

        mainPanel.add(new JLabel(" "));

        mainPanel.add(sizes);
        JPanel buttons = new JPanel(new FlowLayout());
        buttons.add(okButton);
        buttons.add(cancelButton);

        mainPanel.add(buttons);

        pack();
        setLocationRelativeTo(frame);
        setVisible(true);
    }


    public String getAddr1() {
        return addr1Field.getText();
    }

    // ...
}
结果:


您可以使用JOptionPane。您可以向其中添加任何Swing组件


创建一个包含除按钮外所需的所有组件的面板,然后将该面板添加到选项窗格中。这种方法唯一的问题是,默认情况下,焦点将集中在按钮上。若要解决此问题,请参阅。

提供的解决方案,如果需要使用JOptionPane:

import java.awt.*;
import javax.swing.*;

public class Main extends JFrame {

    private static JTextField nameField = new JTextField(20);
    private static JTextField surnameField = new JTextField();
    private static JTextField addr1Field = new JTextField();
    private static JTextField addr2Field = new JTextField();
    private static JComboBox sizes = new JComboBox(new String[] { "small", "medium", "large", "extra-large" });

    public Main(){
        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
        getContentPane().add(mainPanel);

        JPanel addrPanel = new JPanel(new GridLayout(0, 1));
        addrPanel.setBorder(BorderFactory.createTitledBorder("Receiver"));
        addrPanel.add(new JLabel("Name"));
        addrPanel.add(nameField);
        addrPanel.add(new JLabel("Surname"));
        addrPanel.add(surnameField);
        addrPanel.add(new JLabel("Address 1"));
        addrPanel.add(addr1Field);
        addrPanel.add(new JLabel("Address 2"));
        addrPanel.add(addr2Field);
        mainPanel.add(addrPanel);
        mainPanel.add(new JLabel(" "));
        mainPanel.add(sizes);

        String[] buttons = { "OK", "Cancel"};

        int c = JOptionPane.showOptionDialog(
                null,
                mainPanel,
                "My Panel",
                JOptionPane.DEFAULT_OPTION,
                JOptionPane.PLAIN_MESSAGE,
                null,
                buttons,
                buttons[0]
         );

        if(c ==0){
            new Envelope(nameField.getText(), surnameField.getText(), addr1Field.getText()
                    , addr2Field.getText(), sizes.getSelectedIndex());
        }

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        new Main();
    }
}

+1但是如果没有添加新行为(即重新实现
paintComponent
方法)并且简单的组合就足够了,那么就不应该继承类。ie
JDialog d=新的JDialog(帧,“信封寻址”);d、 在此处添加(新JLabel(“Name”);…等
相同的内容。如果可能,则无需扩展JFrame:JFrame frame=new JFrame();…;frame.getContentPane().add(主面板);继承是最强大的耦合形式。在owca提出建议前7个小时,我建议使用JOptionPane。我知道你期望得到填鸭式的代码。很高兴知道,我以后不会费心帮忙了。为什么人们在完全不必要的情况下继续填鸭式地输入代码?所发生的一切是Mike不必考虑n他自己的,现在用一个后续问题占用了我们宝贵的时间:stackoverflow.com/questions/2926182/…这就是当你输入简单代码时会发生的情况。没有学习的动机