Swing Clojure+;摆动绝对定位问题

Swing Clojure+;摆动绝对定位问题,swing,clojure,Swing,Clojure,我正在写一个小应用程序,我想要绝对定位-我可以通过一个看似丑陋的解决方法得到我想要的,但是我想知道如何使代码更干净,保持相同的功能 问题是,如果我省略了(.setBounds..)s-exprs中的任何一个,那么JPanel将填充整个JFrame。提前感谢,以下是工作示例代码: ... (:import [javax.swing JFrame JPanel] [javax.swing.border LineBorder] [java.awt Color])

我正在写一个小应用程序,我想要绝对定位-我可以通过一个看似丑陋的解决方法得到我想要的,但是我想知道如何使代码更干净,保持相同的功能

问题是,如果我省略了(.setBounds..)s-exprs中的任何一个,那么JPanel将填充整个JFrame。提前感谢,以下是工作示例代码:

...
(:import [javax.swing JFrame JPanel]
         [javax.swing.border LineBorder]
         [java.awt Color])

(defn frame []
  (let [top-panel (doto (JPanel.)
                     (.setOpaque true) 
                     (.setVisible true)
                     (.setBounds 25 25 250 75)
                     (.setBorder (LineBorder. (Color. 255 0 0 255))))

        frame (doto (JFrame.)
                 (.setLayout nil)
                 (.setResizable false)
                 (.setSize 300 625)
                 (.setVisible true)
                 (.setContentPane top-panel))]

     (.setBounds top-panel 25 25 250 75)))

嗯。。。我无法让你的代码工作。当我制作mods使其运行时,我将面板紧紧地包裹在框架上

我假设你想要在大框架中间的顶部面板,在所有的边上都有空格。通常的方法是创建一个具有所需框架大小的主面板。然后,使用类似BorderLayout的布局管理器,将其他JPanel添加到主面板。顶部面板将提供您想要的尺寸,周围面板将提供“填充”。如果周围的面板是用空边框创建的,则顶部面板应该被空区域包围

编辑

这里有些东西可能更接近你的意图。BorderLayout可能没有提供所需的面板大小优先级。也许是网格布局

(ns com.so.abspos
 (:import (javax.swing JFrame JPanel)
      (java.awt BorderLayout))
 (:gen-class true))

(defn frame []
  (let [
    center-panel (doto (JPanel.)
      (.setOpaque true) 
      (.setVisible true)
      (.setSize 225 50)
      ;(.setBounds 25 25 250 75)
      (.setBorder (javax.swing.border.LineBorder. (java.awt.Color. 255 0 0 255))))

    top-panel (doto (JPanel.)
      (.setSize 625 25))

    left-panel (doto (JPanel.)
      (.setSize 25 75))

    bottom-panel (doto (JPanel.)
      (.setSize 625 300))

    right-panel (doto (JPanel.)
      (.setSize 250 75))

    main-panel (doto (JPanel.)
      (.setLayout (new BorderLayout))
      (.add left-panel BorderLayout/WEST)
      (.add top-panel BorderLayout/NORTH)
      (.add center-panel BorderLayout/CENTER)
      (.add right-panel BorderLayout/EAST)
      (.add bottom-panel BorderLayout/SOUTH))

    aframe (doto (JFrame.)
      (.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)
      (.setResizable false)
      (.setSize 300 625)
      (.setVisible true)
      (.setContentPane main-panel))]))

(defn -main
  "Just create the frame and show it."
  []
  (frame))

这段代码提供了我想要的功能,将.contentPane替换为.add

(defn frame []
  (let [top-panel (doto (JPanel.)
                     (.setBounds 25 25 250 75)
                     (.setVisible true)
                     (.setBorder (LineBorder. (Color. 255 0 0 255))))]

        (doto (JFrame.)
           (.setLayout nil)
           (.setSize 300 625)
           (.setVisible true)
           (.add top-panel)))

清单上有打字错误吗?您正在定义一个名为“frame”的函数以及let中名为“frame”的局部函数。这是你的意图吗?@clartaq我看不出有什么错。@amalloy:是的,没什么错。我只是想知道这个行为是否有任何混乱。感谢为此付出的努力,我开始阅读一本关于swing的书,我想问题是在我应该使用的时候弄乱了.contentPane。add,我将在下面发布代码