2012-06-20 2 views
2

У меня есть JFrame с некоторым JTextField и JButton. Я хочу, чтобы он вел себя как JOptionPane.showInputDialog(). В принципе, я хочу его построить, а затем вызвать .start() или что-то, что сделает его видимым, а затем дождитесь нажатия кнопки, а затем вернет содержимое JTextField. Я слышал, что wait()/notify() может это сделать, но я не знаю, подходит ли это для этого, и если да, могу ли я увидеть короткий пример того, как его использовать?Как подождать нажатия кнопки в Java

+1

Почему бы не использовать 'JDialog' вместо' JOptionPane'? –

+0

Кажется, что это может сработать. Может ли JDialog содержать больше информации, чем JOptonPane (чтобы он мог заменить JFrame?) – Fractaly

+0

На самом деле они оба имеют равную функциональность, похоже, что вы действительно не знаете, что может сделать JOptionPane в реальном выражении, Окно диалога пользователю. Вы можете манипулировать 'JOptionPane', чтобы показать, что вам нужно. Вот пример использования [JOptionPane] (http://stackoverflow.com/questions/10306901/how-to-change-highlighting-color-in-java-swing-textarea-and-also-change-the-be/ 10309277 # 10309277), посмотрите на это тоже :-) –

ответ

3

Вот попробуйте этот пример кода с помощью JDialog:

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

public class DialogExample extends JFrame 
{ 
    private JLabel nameLabel; 

    public DialogExample() 
    { 
     super("Dialog Example"); 
    } 

    private void createAndDisplayGUI() 
    {  
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel contentPane = new JPanel(); 
     nameLabel = new JLabel(); 
     contentPane.add(nameLabel); 

     setContentPane(contentPane); 
     setSize(200, 100); 
     setLocationByPlatform(true); 
     setVisible(true); 

     MyDialog dialog = new MyDialog(this, "Credentials : ", true); 
     dialog.createAndDisplayGUI(); 
    } 

    public void setName(String name) 
    { 
     if (name.length() > 0) 
      nameLabel.setText(name); 
     else 
      nameLabel.setText("Empty string received."); 
    } 


    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new DialogExample().createAndDisplayGUI(); 
      } 
     }); 
    } 
} 

class MyDialog extends JDialog 
{ 
    private JTextField nameField; 
    private JFrame frame; 

    public MyDialog(JFrame f 
      , String title, boolean isModal) 
    { 
     super(f, title, isModal); 
     frame = f; 
    } 

    public void createAndDisplayGUI() 
    { 
     JPanel contentPane = new JPanel(); 
     contentPane.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5)); 
     JLabel nameLabel = new JLabel("Please Enter your Name : "); 
     nameField = new JTextField(10); 
     JButton submitButton = new JButton("SUBMIT"); 
     submitButton.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent ae) 
      { 
       if (nameField.getDocument().getLength() > 0) 
        frame.setName(nameField.getText()); 
       else 
        frame.setName(""); 
       MyDialog.this.dispose();  
      } 
     }); 

     contentPane.add(nameLabel); 
     contentPane.add(nameField); 
     contentPane.add(submitButton); 

     add(contentPane); 
     pack(); 
     setVisible(true); 
    } 
} 
+0

Это было почти то решение, над которым я работал. Вы, вероятно, просто спасли меня полчаса. Спасибо – Fractaly

+0

ВЫ МОЖЕТ ДОБРО ПОЖАЛОВАТЬ И СОХРАНЯТЬ СМОТРЕТЬ :-). СЧАСТЛИВЫЙ, чтобы знать, что мой ответ помог вам где-то :-) –

+0

Одна вещь: могу ли я заставить его вернуть свое значение, например JOptionPane.showInputDialog, где ему не нужно обратный вызов на фрейме? – Fractaly

3

Также JDialog - это ваше решение для пользовательских диалоговых окон ввода, есть библиотека, которая может помочь ускорить вашу разработку. Он называется TaskDailog.

Более подробная информация на http://code.google.com/p/oxbow/wiki/TaskDialogIntroduction?tm=6

+0

+1, несомненно, 'JDialog' может решить эту задачу здесь. –

Смежные вопросы