2015-10-30 2 views
1

Когда пользователь нажимает «закрыть» в одном JFrame frame, я хочу, чтобы отображалось JFrame credits, показывая мое имя и прочее за 2,5 секунды до выхода программы. Теперь, credits показывает, но пуст без textArea и Button - не смог найти что-то не так.Содержимое JFrame, не показывающее

Heres мой код: Для операции закрытия frame

frame.addWindowListener(new java.awt.event.WindowAdapter() { 
        @Override 
        public void windowClosing(java.awt.event.WindowEvent windowEvent) { 
         int result = JOptionPane.showConfirmDialog(null, "Sind Sie sicher?", "Schließen", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); 
         if (result == JOptionPane.YES_OPTION){ 
          credits.setVisible(true); 
          try { 
           Thread.sleep(2500); 
          } catch(InterruptedException ex) { 
           Thread.currentThread().interrupt(); 
          } 
           System.exit(0); 
         } else { 
          //do nothing 
         } 
        } 
       }); 

Для credits (только класс инициализации кадра):

public class CreditsFrame extends JFrame { 

Positioner pos = new Positioner(); 

private JPanel contentPane; 
ImageIcon frameIcon = new ImageIcon("files/images/frameicon.png"); 
/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       CreditsFrame frame = new CreditsFrame(); 
       frame.setVisible(true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

/** 
* Create the frame. 
*/ 
public CreditsFrame() { 
    setIconImage(frameIcon.getImage()); 
    setAlwaysOnTop(true); 
    setResizable(false); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(pos.posX(pos.screenX, 441), pos.posY(pos.screenY, 210), 441, 210); 
    contentPane = new JPanel(); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    setContentPane(contentPane); 

    JTextArea txtarea = new JTextArea(); 
    txtarea.setBounds(10, 11, 415, 125); 
    txtarea.setEditable(false); 
    txtarea.setBackground(Color.WHITE); 
    txtarea.setWrapStyleWord(true); 
    txtarea.setLineWrap(true); 
    txtarea.append("created by & more here"); 
    contentPane.setLayout(null); 
    contentPane.add(txtarea); 

    JButton btnOk = new JButton("Ok"); 
    btnOk.setBounds(154, 147, 89, 23); 
    btnOk.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      dispose(); 
     } 
    }); 
    contentPane.add(btnOk); 
} 

}

Любые предложения для быстрого исправить? Благодарю.

+0

Вы могли бы отправить код, в котором вы создаете экземпляр переменной 'credits'? – javaguest

ответ

2

Любые предложения по быстрому устранению?

Да, не звоните Thread.sleep(...) в поток событий Swing, если вы не хотите, чтобы весь ваш графический интерфейс спал. Вместо этого используйте Swing Timer для обработки задержки. В принципе, ActionListener таймера будет вызываться после прохода миллисекунд.

например,

frame.addWindowListener(new java.awt.event.WindowAdapter() { 
    @Override 
    public void windowClosing(java.awt.event.WindowEvent windowEvent) { 
     int result = JOptionPane.showConfirmDialog(null, "Sind Sie sicher?", "Schließen", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); 
     if (result == JOptionPane.YES_OPTION){ 
      credits.setVisible(true); 
      new Timer(2500, new ActionListener() { 
       public void actionPerformed(ActionEvent evt) { 
        System.exit(); 
       } 
      }).start(); 
     } else { 
      //do nothing 
     } 
    } 
}); 

Кроме того, обратите внимание на The Use of Multiple JFrames, Good/Bad Practice?

Другие вопросы, которые будут кусать вас в будущем:

  • Вы надеетесь использовать пустые макеты и SetBounds. Хотя нулевые макеты и setBounds() могут показаться Swing новичками, как самый простой и лучший способ создания сложных графических интерфейсов, чем больше Swing GUI вы создадите более серьезные трудности, с которыми вы столкнетесь при их использовании. Они не будут изменять размеры ваших компонентов при изменении размера графического интерфейса, они являются королевской ведьмой для улучшения или поддержки, они полностью не выполняются при размещении в scrollpanes, они выглядят ужасно ужасно, если смотреть на всех платформах, отличных от исходных.
  • Никогда не устанавливайте границы JTextAreas, так как это приведет к полному сбою, если оно будет помещено в JScrollPane, и добавлено больше текста, чем можно отобразить, - полосы прокрутки, похоже, не сработают, поскольку вы искусственно ограничили размер текстовый компонент.
+0

Я знаю, что абсолютные макеты очень непоследовательны, но рамки не изменяются, поэтому, по крайней мере, это не беспорядок с ними. Спасибо за ваше предлагаемое решение, работал с некоторыми настройками. – Zi1mann

+0

@ Zi1mann: Не говорите, что я вас не предупреждал. Подождите, пока вы не создадите сложный графический интерфейс, а затем обнаружите, что вам нужно добавить еще один JRadioButton в середине. Если вы использовали вложенные JPanels с менеджерами макетов, это будет очень простое исправление. Если вы использовали нулевой макет, тогда вы должны вручную настроить позиции каждого компонента и надеяться, что он будет работать на всех платформах. Удача. –

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