2012-08-25 40 views
2

即時通訊想知道jcomponent如何被繪在屏幕上,它是從繪圖paintComponent()內繪?或者是單獨繪製。我問這是因爲它奇怪的jbutton在mousehover上如何改變顏色,即使repaint()永遠不會被調用。java - jcomponents如何繪製?

謝謝你的時間。

+0

1)*「我想知道jcomponent如何得到..」*我想知道你的鍵盤是否有shift鍵。如果是這樣,請在句子開始時使用它,並在適當情況下使用「JComponent」。它使文本更易於閱讀。 2)將Swing標籤添加到Swing相關問題是一個好主意。 –

+0

但是'repaint()'當然*被調用,儘管可能不像你想象的那樣。它可能是JButton的委託人重新調用它。請閱讀[在AWT和Swing中繪畫](http://java.sun.com/products/jfc/tsc/articles/painting/index.html)瞭解繪畫機制的一些細節。 –

+1

對不起,我在kindle的火上,所以我很難做到這一點,但生病盡我所能。 – Ewen

回答

6

Component s用他們的paint方法塗漆。 repaint只是一個有用的方法,將在Event Dispatch Thread的不久將來某個時間點撥打paint


當鼠標進入JButton,下面的方法被調用(對於JButton s的默認UI):

public void mouseEntered(MouseEvent e) { 
    AbstractButton b = (AbstractButton) e.getSource(); 
    ButtonModel model = b.getModel(); 
    if (b.isRolloverEnabled() && !SwingUtilities.isLeftMouseButton(e)) { 
     model.setRollover(true); 
    } 
    if (model.isPressed()) 
      model.setArmed(true); 
} 

ButtonModel.setRollover將會觸發ChangeEvent,通過AbstractButton在下面的處理方式:

public void stateChanged(ChangeEvent e) { 
    Object source = e.getSource(); 

    updateMnemonicProperties(); 
    if (isEnabled() != model.isEnabled()) { 
     setEnabled(model.isEnabled()); 
    } 
    fireStateChanged(); 
    repaint(); 
} 

所以repaint當鼠標進入JButton時調用。

+1

好的,重繪()只適用於JButton本身或所有其他JComponents和paintComponent()? – Ewen

+0

@Ewen'repaint'是所有「組件」的一種方法。 'repaint'將會調用'paint',它會在其他繪畫方法中調用'paintComponent'。 – Jeffrey

+0

謝謝,我相信這是最好的答案。 – Ewen

5

..a jbutton在mousehover上改變顏色,即使repaint()永遠不會被調用。

當然可以。而這個代碼就是這方面的證據。當然,這並不是Kindle Fire上最可能沒有JRE的證據,但是,然後,Kindle Fire是一個完全不恰當的工具,用於與站點進行通信,同時討論編程語言的技術要點不在設備上運行。

import javax.swing.*; 

public class ButtonRepaint { 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       JButton b = new JButton("Hover Over Me!") { 
        @Override 
        public void repaint() { 
         super.repaint(); 
         System.out.println("Repaint"); 
        } 
       }; 
       JOptionPane.showMessageDialog(null, b); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
} 
+0

+1,討論移動設備上的技術點通常不是最好的想法。 – Jeffrey

+0

好的代碼是什麼? – Ewen

+0

@Hover我回應了確切的說法*「即使repaint()永遠不會被調用,jbutton會在mousehover上改變顏色。」*不可否認,我將'mousehover'讀爲'鼠標懸停',因爲Kindle打字讓我的眼睛變得水潤。是否有一些特定的「paintComponent(Graphics)」我應該考慮?順便說一句 - 喜歡你的評論,爲什麼這種類型的問題不應該從Kindle問。這一系列問題似乎正在佔用我們很多時間。 –

3

注意,paint()方法被調用屬於按鈕的UI委託,通常由BasicButtonUI的。有一個例子here使用MetalButtonUI