我正在将一个程序从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))))
由于
答案 0 :(得分:4)
我注意到您在设置布局之前添加了子组件。尝试先设置布局。问题可能是更改布局时默认约束信息丢失。如果JPanel不可见,可能是因为它没有自动调整大小以适合其子元素。
同时在框架上尝试使用(.pack)
代替(.setSize 450 250)
。