即時通訊想知道jcomponent如何被繪在屏幕上,它是從繪圖paintComponent()內繪?或者是單獨繪製。我問這是因爲它奇怪的jbutton在mousehover上如何改變顏色,即使repaint()永遠不會被調用。java - jcomponents如何繪製?
謝謝你的時間。
即時通訊想知道jcomponent如何被繪在屏幕上,它是從繪圖paintComponent()內繪?或者是單獨繪製。我問這是因爲它奇怪的jbutton在mousehover上如何改變顏色,即使repaint()永遠不會被調用。java - jcomponents如何繪製?
謝謝你的時間。
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
時調用。
..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);
}
}
注意,paint()
方法被調用屬於按鈕的UI委託,通常由BasicButtonUI
的。有一個例子here使用MetalButtonUI
。
1)*「我想知道jcomponent如何得到..」*我想知道你的鍵盤是否有shift鍵。如果是這樣,請在句子開始時使用它,並在適當情況下使用「JComponent」。它使文本更易於閱讀。 2)將Swing標籤添加到Swing相關問題是一個好主意。 –
但是'repaint()'當然*被調用,儘管可能不像你想象的那樣。它可能是JButton的委託人重新調用它。請閱讀[在AWT和Swing中繪畫](http://java.sun.com/products/jfc/tsc/articles/painting/index.html)瞭解繪畫機制的一些細節。 –
對不起,我在kindle的火上,所以我很難做到這一點,但生病盡我所能。 – Ewen