我是一些JComponent擴展的作者。我寫了一些示例組件。
在一個示例組件中,我只是用預定義的子組件填充它們:
public class JSwingExample02 extends JComponent {
public JSwingExample02() {
populate();
}
private void populate() {
setLayout(new BorderLayout());
JLabel jLabel = new JLabel("Hello World!");
add(jLabel, BorderLayout.CENTER);
}
在其他組件中,我從頭開始繪制它們
@Override protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.fillOval(10, 10, 100, 100);
}
現在,我的組件通過第三方代碼(IDEA 插件)使用,并為其應用顏色主題:盡管我沒有任何顏色代碼行,但我的組件以“深色主題”顯示。
例如

即文本是白色的。
我怎么能聽這些顏色,即事先知道它們,例如,如果我想用它們畫一些明確的東西?
uj5u.com熱心網友回復:
有多種方法可以獲取和設定顏色。這里有一些。這將創建一個簡單的框架/面板組合來顯示背景顏色。您也可以在paintComponent方法中設定顏色。根據您正在繪制的內容,它將是前景或背景。
為用戶提供選擇顏色的一個好方法是JColorChooser. 它可以接受默認顏色并回傳選擇的任何顏色。
如果您真的想知道顏色何時發生變化,您需要為組件建立一個監聽器并監聽屬性的變化。該示例顯示了demo監聽前景色和背景色變化的面板。您的每個組件都必須注冊一個屬性偵聽器來處理事件。
注意: Demo 類實際上是在監聽它自己的變化。不必如此。任何實作該PropertyChangeListener介面的類都可以偵聽來自觸發屬性更改的任何其他類的屬性更改事件。只需確保在注冊事件時使用特定的類實體。
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class ColorDemo extends JPanel implements PropertyChangeListener{
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ColorDemo demo = new ColorDemo();
demo.setPreferredSize(new Dimension(200,200));
// listen for these properties
demo.addPropertyChangeListener("background", demo );
demo.addPropertyChangeListener("foreground", demo );
frame.add(demo);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
demo.setBackground(Color.CYAN);
System.out.println(
"back ground color is : " demo.getBackground());
demo.setVisible(true);
// use color chooser
Color newColor = JColorChooser.showDialog(null,
"Color Chooser", demo.getBackground());
System.out.println(
"Retrieved new color from chooser " newColor);
System.out.println(
"default foreground color is :" demo.getForeground());
demo.setForeground(Color.RED);
demo.repaint();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.println(
"Graphics context color : " g.getColor());
}
public void propertyChange(PropertyChangeEvent pce) {
String name = pce.getPropertyName();
System.out.println(name " change caught");
System.out.println("old " name " was " pce.getOldValue());
System.out.println("new " name " is " pce.getNewValue());
System.out.println();
}
}
uj5u.com熱心網友回復:
嘗試設定 LAF 并收聽 LAF 更改:
class JSwingExample02 extends JComponent {
public JSwingExample02(PropertyChangeListener listener) {
//set LAF
try {
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
} catch (UnsupportedLookAndFeelException | ClassNotFoundException | InstantiationException | IllegalAccessException ex) {
ex.printStackTrace();
}
//listen to LAF changes
UIManager.addPropertyChangeListener(listener);
populate();
}
private void populate() {
setLayout(new BorderLayout());
JLabel jLabel = new JLabel("Hello World!");
add(jLabel, BorderLayout.CENTER);
}
//returns active LAF
public LookAndFeel lookAndFeel(){
return UIManager.getLookAndFeel();
}
}
LAF 更改時會觸發“lookAndFeel”屬性更改。
有關其他屬性的串列,請參閱此問答。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/374392.html
上一篇:如何支持和繪制多種演算法
下一篇:java復選框和函式的問題
