2010-05-27 78 views
3

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

在一个窗口
  • 点击确定,当我给数据包络处理,尺寸从
  • 的名单中还设置字体类型,在同一窗口或下一个窗口,我得到的包络线会是什么样子与给定的名称预览以及用于选择字体大小

应该同样期待:

alt text http://img15.imageshack.us/img15/7355/lab10aa.gif

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

回答

0

如果您需要使用的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

这里是一样的东西,当这是可能的时候不需要扩展JFrame:JFrame frame = new JFrame(); .. 。; frame.getContentPane()。add(mainPanel);继承是最强的耦合形式 – OscarRyz 2010-05-28 01:45:26

+0

我建议在owca的建议前7小时使用JOptionPane,我看你希望是勺子喂代码,很高兴知道我不会为什么人们在完全没有必要的时候继续使用喂食代码呢?发生的一切就是,迈克没有必要自己做任何思考,现在正在花费我们的宝贵时间和后续工作问题:stackoverflow.com/questions/2926182/...这是当你喂简单的代码时会发生什么。没有学习的动力 – camickr 2010-05-28 02:34:32

0

您将需要使用JDialog。 JOptoinPane没有什么意思 - 它并不意味着收集的不仅仅是一个简单的字符串。此外,请使用MigLayout,TableLayoutJGoodies forms - 它将帮助您获得一个易于编码的漂亮布局。

0

如果允许使用GUI构建器,我会建议你IntelliJ IDEA's

您可以创建在约5类似的东西 - 10分钟。

如果这是不可能的(也许你想实践学习,或某事,其他人)我会用一个代替的JFrame)与CardLayout

不应该是很难做到的。

2

这应该让你去。

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

    // ... 
} 

结果:

enter image description here

+0

+1但是,如果你不加入新的行为(即重新implment的'paintComponent'方法),你应该不会继承一个类和简单的组成足够。即'JDialog d =新的JDialog(帧,“信封寻址”); d.add(new JLabel(“Name”); ... etc' – OscarRyz 2010-05-27 18:25:41

+0

这是一个很好的观点! – aioobe 2010-05-27 18:27:22

0

可以使用的JOptionPane。您可以添加任何Swing组件。

使用除按钮之外的所有组件创建一个面板,然后将该面板添加到选项窗格。这种方法唯一的问题是,默认情况下焦点将放在按钮上。要解决此问题,请参阅Dialog Focus提供的解决方案。