2011-07-13 14 views
1

私は絶対的な位置付けが必要な小さなアプリケーションを作成しています - 私は一見醜い回避策で欲しいものを得ることができますが、このコードを同じように維持する方法を知りたいのですが機能性。Clojure + Swingアブソリュート位置決めの問題

問題は、(.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))) 
+1

で.contentPaneを交換し、私が探していた機能を提供しますか? "frame"という名前の関数と、 "frame"と呼ばれるlet内のローカルも定義しています。それがあなたの意図ですか? – clartaq

+0

@clartaq私はそれに何か悪いことは表示されません。 – amalloy

+1

@amalloy:うん、何も間違っていない。その行動について混乱があったかどうかだけ疑問に思った。 – clartaq

答えて

2

このコードは、リストにタイプミスがあります.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))) 
0

うーん...私はあなたのコードは動作させることができませんでした。モッズを動かすために改造をしたとき、私はフレームをしっかりと包み込んだ。

大きな枠の真ん中にトップパネルを置き、すべての面に空白があることを前提としています。これを行う通常の方法は、あなたが望むフレームのサイズを持つメインパネルを作成することです。次に、BorderLayoutのようなレイアウトマネージャを使用して、JPanelをメインパネルに追加します。トップパネルには希望の寸法が与えられ、周囲のパネルには「パディング」が施されます。周囲のパネルが空の枠で作成されている場合は、トップパネルが空白の領域に囲まれているように見えるはずです。

EDIT

はここにあなたの意図に少し近いかもしれ何か。 BorderLayoutは、おそらくあなたが望むパネルのサイジングの優先順位を与えません。たぶんGridBagLayout?

(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)) 
+0

これに取り組んでくれてありがとう、私はスイングについての本を読んで始めました。私は問題が.contentPaneを乱用していたと思います。 – ChrisR