Разве Swan's JPanel не очень похожа на панель AWT? Виджет первого не появляется - PullRequest
4 голосов
/ 04 октября 2009

Я меняю программу с AWT на Swing, как предложено во второй главе книги Java Swing, и панель просто исчезает, когда я делаю переход с Panel на JPanel. То же самое не происходит, когда я перехожу с кнопки на JButton.

Кажется, это ошибка, так как это кажется тривиально простым - просто добавив дополнительный J к имени - но я не уверен, где проблема - с моей виртуальной машиной (Sun JDK), с мой WM (xmonad) или с тем, как я программирую (поддержка Java Clojure). Есть идеи?

Как уже говорилось ранее, я пишу это на Clojure (похожий на шутку язык для JDK). Вот мой код:

(defn main []
  (let [toolbar-frame (Frame. "Toolbar Example (Swing)")
        cut-button (JButton. "Cut")
        copy-button (JButton. "Copy")
        paste-button (JButton. "Paste")
        java-button (JButton. "Java")
        windows-button (JButton. "Windows")
        mac-button (JButton. "Mac")
        motif-button (JButton. "Motif")
        <b>lnf-panel (JPanel.)</b>
        toolbar-panel (Panel.)
        print-listener (proxy [ActionListener] []
          (actionPerformed [evt]
            (.getActionCommand evt)))
        ]
      (.addWindowListener toolbar-frame
        (proxy [WindowAdapter] []
          (windowClosing [e]
            (System/exit 0))))
    ;(doto windows-button (.addActionListener lnf-listener))
    ;(doto motif-button (.addActionListener lnf-listener))
    ;(doto mac-button (.addActionListener lnf-listener))
    ;(doto java-button (.addActionListener lnf-listener))
    (doto cut-button (.addActionListener print-listener))
    (doto copy-button (.addActionListener print-listener))
    (doto paste-button (.addActionListener print-listener))
    (doto lnf-panel
      (.add windows-button)
      (.add java-button)
      (.add mac-button)
      (.add motif-button)
      (.setLayout (FlowLayout. FlowLayout/LEFT)))
    (doto toolbar-panel
      (.add cut-button)
      (.add copy-button)
      (.add paste-button)
      (.setLayout (FlowLayout. FlowLayout/LEFT)))
    (doto toolbar-frame
      (.add toolbar-panel BorderLayout/NORTH)
      (.add lnf-panel BorderLayout/SOUTH)
      (.setSize 450 250)
      (.setVisible true))))

Спасибо

1 Ответ

4 голосов
/ 04 октября 2009

Я заметил, что вы добавляете дочерние компоненты до настройки макета. Попробуйте сначала установить макет. Проблема может заключаться в том, что информация об ограничениях по умолчанию теряется при изменении макета. Если JPanel невидим, это может быть связано с тем, что он не был автоматически изменен для соответствия его дочерним элементам.

Также попробуйте (.pack) вместо (.setSize 450 250) в кадре.

...