Проблемы абсолютного позиционирования Clojure + Swing - PullRequest
1 голос
/ 13 июля 2011

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

Проблема в том, что если я опускаю s-выражения (.setBounds ..), тогда 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)))

Ответы [ 2 ]

2 голосов
/ 14 июля 2011

Этот код дает мне функциональность, которую я искал, заменив .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)))
0 голосов
/ 13 июля 2011

Хммм ... Я не смог заставить твой код работать. Когда я сделал моды для запуска, я плотно обернул панель рамой.

Я предполагаю, что вы хотите, чтобы верхняя панель находилась посередине большей рамки с пустым пространством со всех сторон. Обычный способ сделать это - создать главную панель с нужным вам размером рамки. Затем, используя менеджер макетов, такой как BorderLayout, добавьте дополнительные JPanels на главную панель. Верхняя панель будет иметь размеры, которые вы хотите, а окружающие панели обеспечат «заполнение». Если окружающие панели созданы с пустыми границами, это должно выглядеть так, как будто верхняя панель окружена пустой областью.

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...