2013-06-18 117 views
3

我試圖改變我的JButton的外觀,以便按鈕沒有達到狀態。無狀態JButton

目前,我有這樣的事情: what i currently have

,我想是這樣的:NetBeans example(從NetBeans中正在添加)

換句話說,我只想按鈕的圖像可見當按鈕沒有任何焦點時。但是,當用戶點擊或翻轉它時,它應該與常規按鈕完全相同。

多個例子:

沒有焦點

DONT WANT no focusDO WANT no focus

翻轉

roll overroll over

點擊

clickclick

我使用了一個內部類爲我的按鈕。它看起來像這樣:

private class CustumJButton extends JButton 
{ 

    public CustumJButton(Icon icon) 
    { 
     super(icon); 
     int size = 30; 
     setPreferredSize(new Dimension(size, size)); 
     setFocusable(false); 
    } 
} 

謝謝ayoye。

+0

我想這涉及到很好的例子,如何[變化的JButton的外觀(http://stackoverflow.com/a/7877817/1057230)由@mKorbel,是你找什麼爲:-) –

回答

3

你可以做到這一點使用setBorderPainted()setContentAreaFilled()方法。這裏是你正在尋找的簡短演示。我希望它會給你粗略的數字來說明如何實現你的任務。:

enter image description here

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

class CustomJButton extends JButton 
{ 

    public CustomJButton(String icon) 
    { 
     super(icon); 
     /*int size = 30; 
     setPreferredSize(new Dimension(size, size));*/ 
     addFocusListener(new ButtonFocusAdapter()); 
     addMouseListener(new ButtonMouseAdapter()); 
     setContentAreaFilled(false); 
     setBorderPainted(false); 
     //setFocusable(false);//Don't use this method. This would avoid the focus event on JButton 
    } 
    private void decorateButton() 
    { 
     setContentAreaFilled(true); 
     setBorderPainted(true); 
    } 
    private void unDecorateButton() 
    { 
     setContentAreaFilled(false); 
     setBorderPainted(false); 
    } 
    private class ButtonFocusAdapter extends FocusAdapter 
    { 
     @Override 
     public void focusGained(FocusEvent evt) 
     { 
      decorateButton(); 
     } 
     @Override 
     public void focusLost(FocusEvent evt) 
     { 
      unDecorateButton(); 
     } 
    } 
    private class ButtonMouseAdapter extends MouseAdapter 
    { 
     @Override 
     public void mouseEntered(MouseEvent evt) 
     { 
      decorateButton(); 
     } 
     @Override 
     public void mouseExited(MouseEvent evt) 
     { 
      unDecorateButton(); 
     } 
    } 
} 
public class ButtonFrame extends JFrame 
{ 
    public void createAndShowGUI() 
    { 
     Container c = getContentPane(); 
     c.setLayout(new FlowLayout()); 
     for (int i = 0; i < 4 ; i++) 
     { 
      CustomJButton cb = new CustomJButton("Button "+i); 
      c.add(cb); 
     } 
     pack(); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
    } 
    public static void main(String st[]) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       ButtonFrame bf = new ButtonFrame(); 
       bf.createAndShowGUI(); 
       bf.setLocationRelativeTo(null); 
      } 
     }); 
    } 
} 
+0

這幾乎是我一直在尋找的感謝!只是爲了讓你知道,重點並不需要它的工作。如果啓用了焦點,則焦點按鈕周圍會出現可怕的點邊框。 – AyoyeSnif

+0

'如果啓用了焦點,則焦點按鈕周圍會出現可怕的點邊框。你的意思是'JButton'上'icon'的可怕行嗎?如果是這種情況,那麼你可以在'CustomJButton'的構造函數中使用'setFocusPainted(false)'。 –

3

我猜你需要使用這兩個東西,使其工作,setBorderPainted(boolean)setContentAreaFilled(boolean)

buttonObject.setBorderPainted(false); 
buttonObject.setContentAreaFilled(false); 

在這個例子中列舉了changing appearance of JButton通過@mKorbel

import java.awt.*; 
import java.awt.event.*; 
import java.net.URL; 
import javax.imageio.ImageIO; 
import javax.swing.*; 

public class ButtonDemo 
{ 
    private JButton demoButton; 
    private ImageIcon buttonImage; 

    private void displayGUI() 
    { 
     JFrame frame = new JFrame("Button Demo Example"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     JPanel contentPane = new JPanel(); 
     try 
     { 
      //buttonImage = new ImageIcon(ImageIO.read(
      // getClass().getResource("/image/bulb.gif"))); 
      buttonImage = new ImageIcon(ImageIO.read(
       new URL("http://gagandeepbali.uk.to/" 
           + "gaganisonline/swing/downloads/" 
           + "images/bulb.gif")));    
     } 
     catch(Exception e) 
     { 
       e.printStackTrace(); 
     } 
     demoButton = new JButton(buttonImage); 
     setExceptionalState(demoButton); 
     demoButton.addMouseListener(new MouseAdapter() 
     { 
      @Override 
      public void mouseEntered(MouseEvent me) 
      { 
       setNormalState(demoButton); 
      } 

      @Override 
      public void mouseExited(MouseEvent me) 
      { 
       setExceptionalState(demoButton); 
      } 
     }); 

     contentPane.add(demoButton); 
     frame.setContentPane(contentPane); 
     frame.setSize(300, 100); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    private void setExceptionalState(JButton button) 
    { 
     button.setBorderPainted(false); 
     button.setContentAreaFilled(false); 
    } 

    private void setNormalState(JButton button) 
    { 
     button.setBorderPainted(true); 
     button.setContentAreaFilled(true); 
    } 

    public static void main(String[] args) 
    { 
     Runnable runnable = new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       new ButtonDemo().displayGUI(); 
      } 
     }; 

     EventQueue.invokeLater(runnable); 
    } 
} 
+0

這只是禁用所有的油漆。當你點擊或翻轉沒有顯示。 – AyoyeSnif

+0

我認爲你可以用自己的努力工作,但鑑於邏輯部分,很高興知道你已經對它進行了排序。也用代碼更新了答案。 –

2

你會設置默認狀態爲:

button.setBorderPainted(false); 

T母雞你需要使用的MouseListener:上的mouseEntered

你會使用

button.setBorderPainted(true); 

和鼠標離開你會用

button.setBorderPainted(false); 
+0

+1(以前,太急於發佈此評論)不同意,永遠不會使用MouseListener按鈕組件所有這些事件都在JButton API中實現,secon選項相當簡單,添加ChangeListener並監聽ButtonModel中的鼠標/按鍵事件 – mKorbel

+1

@注意與upvote相同,與錯誤的答案相同,[我的觀點](http://stackoverflow.com/a/14627663/714968),特別是對於JMenuXxx – mKorbel