2012-04-26 55 views
2

我將使用Swing UI增強應用程序,以允許用戶選擇顏色,使其不會與默認顏色選擇卡住。如何在JButton上繪製彩色矩形?

其他應用程序在每個按鈕上繪製陰影矩形以激活顏色選擇器是很常見的,當選擇新顏色時,矩形的顏色會相應改變。我試圖通過在按鈕上放置一個具有所選顏色的小JPanel來實現相同的效果,但這會導致按鈕中間有一個小方塊,而不是填充按鈕的大部分表面。

我想另一種方式是動態生成帶有顏色的矩形圖標,然後爲每個按鈕添加適當的圖標,但肯定必須有一個更簡單的方法?

+0

由於沒有莊家對按鍵的自定義渲染的方式,我不認爲這將是非常容易的。但我想你總是可以製作一個自定義按鈕(比如ColourButton)。否則你的解決方案與圖標似乎相當不錯。 – MarioDS 2012-04-26 13:02:29

+0

您是否嘗試過使用按鈕上的setBackground(Color)(確保按鈕與setOpaque(boolean)不透明)? – 2012-04-26 13:02:33

+0

是的,我已經嘗試過'setBackground()',但它只改變了圍繞按鈕的矩形的顏色,並沒有改變按鈕的表面顏色。 – Gigatron 2012-04-26 13:04:09

回答

3

放在那裏JButton.setIcon預計Rectangle,爲example

編輯

我試圖通過放置一個小的JPanel上的按鈕,選定的顏色來達到同樣的效果,但是這導致按鈕中間的小方塊,而不是填充按鈕的大部分表面。

JFrame (BorderLayout)JPanel (FlowLayout)已經得到前期實施LayoutManager,爲JComponents休息(添加一個JComponent到另一個JComponent),你必須定義LayoutManagerplease read this thread

+2

['ColorIcon'](http://stackoverflow.com/a/3072979/230513)是一個相關示例。 – trashgod 2012-04-26 13:13:58

+0

我認爲這種方法不僅比設置其他答案中建議的BG更強大,而且更像用戶體驗「OP最後的驚喜之路」。 @trashgod可愛的小增加,儘管我仍然在使用'Icon'和改變'BufferedImage'的'Graphics'之間未定。 – 2012-04-26 13:38:03

+0

@AndrewThompson:好點。當我想利用組件的文本對齊時,我會實現'Icon';一個'BufferedImage'方便合成。 – trashgod 2012-04-26 13:45:25

1

每個Swing組件使用JComponent的繪製。 drawComponent(...)方法,如果需要,可以覆蓋默認行爲。例如,製作一個像你所建議的面板。值得注意的是,您可以更改jpanels背景顏色以實現完全相同的效果。

JColorChooser chooser = new JColorChooser(Color.BLACK); 
    chooser.setVisible(true); 

    Color color = chooser.getColor(); 
    if (color!=null) { 
     colorPanel.setBackground(color); 
    } 

其中colorPanel將是您的JPanel指示您的顏色。

2

下面是一個例子使用的setBackground爲我的作品:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JColorChooser; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Test { 

    public static void main(String... args) { 
     JFrame frame = new JFrame(); 
     JPanel panel = new JPanel(); 
     final JButton button = new JButton("Hello"); 
     button.setOpaque(true); 
     panel.add(button); 
     button.setBackground(Color.RED); 
     button.setOpaque(true); 
     button.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       Color c = JColorChooser.showDialog(button, "Choose a color", button.getBackground()); 
       if (c != null) { 
        button.setBackground(c); 
       } 
      } 
     }); 
     frame.setContentPane(panel); 
     frame.setPreferredSize(new Dimension(800, 600)); 
     frame.pack(); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 
+0

儘管上面的代碼適用於默認的外觀,但使用Windows外觀和感覺,它不能按預期工作;它只在按鈕周圍顯示一個紅色的矩形,按鈕的表面顏色不會改變。 – Gigatron 2012-04-30 01:23:08