【问题标题】:How to add image background to JTable in clojure如何在clojure中将图像背景添加到JTable
【发布时间】:2012-06-11 09:32:10
【问题描述】:

我在 clojure 中编写了这个程序来将背景图像添加到 JTable。我坚持使用prepareRenderer 功能。似乎 clojure 无法处理第一个参数 rd(等效于 Java TableCellRenderer rd)。我可能在这里做错了,如果有人可以帮助我解决这个问题,我将非常感激。要运行程序,只需将其保存到 tabletest.clj 文件并在 clojure 提示符下键入:

(load-file "tabletest.clj")

如果你注释掉prepareRenderer函数你可以成功运行代码而不会看到背景图片。

请为 JTable 背景提供您自己的图像文件。程序如下:

    (import '(javax.swing JFrame JTable JPanel JScrollPane)
            '(javax.swing.table DefaultTableModel TableCellRenderer)
            '(java.awt Component BorderLayout Dimension Image))
    (import javax.imageio.ImageIO)
    (import java.io.File)

    (defn tabletest []
         (let [tableData (to-array-2d [
                       ["numbers" "67890" "This"]
                               ["mo numbers" "2598790" "is"]
                               ["got Math" "2598774" "a"]
                               ["got Numbers" "1234567" "Column"]
                               ["got pi" "3.1415926" "Apple"]
                                  ])
               colNames (to-array ["Col Labels" "Go" "Here"])
               frame (JFrame. "Table Example")
               panel (JPanel.)
               sP (JScrollPane.)
               dataModel (DefaultTableModel. tableData colNames)
               table (proxy [JTable] [dataModel]
                 (prepareRenderer [rd row col] ; problem starts here
                      (proxy-super rd row col) ; Don't know how to translate
                                                       ; Java code below to clojure:
                  (.setOpaque this false)  ;if (c instanceof JComponent)
                                ; ((JComponent)c).setOpaque(false);

                  this
                 )
                 (paintComponent [g2d]
                  ;(proxy-super paintComponent g2d)
                  (def image (ImageIO/read (File. "GreenCar.png")))
                  (.drawImage g2d image 0 0 this)
                  (proxy-super paintComponent g2d)
                         )
                    )
              ]

              (.setCellSelectionEnabled table true)
              (.setOpaque table false)
              (.setPreferredSize sP (Dimension. 300 150))
              (.setView (.getViewport sP) table)
              (.add panel sP)
              (doto frame
                  (.setLayout (BorderLayout.))
                  (.add panel BorderLayout/CENTER)
                  (.setSize 400 200)
                  (.setVisible true)
              )
          )
      )

      (tabletest)

【问题讨论】:

    标签: java clojure clojure-java-interop


    【解决方案1】:

    错误是一行:

     (proxy-super rd row col)
    

    正确的编码方式是:

     (def c (proxy-super prepareRenderer [rd row col]))
    

    还有几行:

     (.setOpaque this false)
     this
    

    替换为:

     (if (instance? JComponent c)
         (.setOpaque c false))
     c
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-23
      • 2016-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-19
      • 1970-01-01
      相关资源
      最近更新 更多