2010-05-27 108 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提供的解決方案。