Swing的JPanel不像AWT的Panel吗?前者的小部件没有显示出来

时间:2009-10-04 01:42:16

标签: java swing clojure awt jpanel

我正在将一个程序从AWT更改为Swing,正如Java Swing的书第二章所提议的那样,当我从Panel更改为JPanel时,面板就会消失。当我从Button更改为JButton时,情况不会发生。

这似乎是一个错误,因为这样做似乎很简单 - 只需在名称中添加额外的J - 但我不确定问题出在哪里 - 使用我的VM(Sun JDK),我的WM(xmonad)或我正在编程的方式(Clojure的Java支持)。有什么想法吗?

如前所述,我是用Clojure(JDK的类似lisp的语言)编写的。这是我的代码:

(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")
        lnf-panel (JPanel.)
        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 个答案:

答案 0 :(得分:4)

我注意到您在设置布局之前添加了子组件。尝试先设置布局。问题可能是更改布局时默认约束信息丢失。如果JPanel不可见,可能是因为它没有自动调整大小以适合其子元素。

同时在框架上尝试使用(.pack)代替(.setSize 450 250)