5

JLabelのサブクラスpaintComponent(Graphics)を作成し、メソッドをオーバーライドしてグラデーションの背景色を作成しました。

これはJLabelのサブクラスです。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.BorderFactory;
import javax.swing.JLabel;

public class DLabel extends JLabel
{

    Dimension size = new Dimension(70, 80);

    public DLabel()
    {
        this.setPreferredSize(size);
        this.setBorder(BorderFactory.createBevelBorder(TOP, Color.white, Color.black));
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        Color color1 = new Color(226, 218, 145);
        Color color2 = color1.brighter();
        int w = getWidth();
        int h = getHeight();
        GradientPaint gp = new GradientPaint(
                0, 0, color1, 0, h, color2);
        g2d.setPaint(gp);
        g2d.fillRect(0, 0, w, h);
    }

}

このラベルのインスタンスを作成すると正しく表示されますが、使用setText(String)するとテキストは何もレンダリングされません。

DLabel label = new DLabel();
label.setText("I am"); //No text displayed.

テキストを設定した後、これらのメソッドのさまざまなコンパイルを試しました。

label.setOpaque(true);
label.revalidate();
label.repaint();

しかし、何も起こらなかった

4

3 に答える 3

7

メソッドの最後でsuper.paintComponent(g)を呼び出して、ラベルがグラデーションを描画したにテキストを描画するようにするとどうなりますか。

public void paintComponent(Graphics g) {
  // super.paintComponent(g);  // *** commented
  Graphics2D g2d = (Graphics2D) g;
  Color color1 = new Color(226, 218, 145);
  Color color2 = color1.brighter();
  int w = getWidth();
  int h = getHeight();
  GradientPaint gp = new GradientPaint(0, 0, color1, 0, h, color2);
  g2d.setPaint(gp);
  g2d.fillRect(0, 0, w, h);
  super.paintComponent(g); // *** added
}

また、無関係なことはさておき、私はこれを変更することを好みます:

Dimension size = new Dimension(70, 80);

public DLabel()
{
    this.setPreferredSize(size);
    this.setBorder(BorderFactory.createBevelBorder(TOP, Color.white, 
         Color.black));
}

これに:

public static final Dimension PREF_SIZE = new Dimension(70, 80);

public DLabel()
{
    this.setBorder(BorderFactory.createBevelBorder(TOP, Color.white, 
         Color.black));
}

@Override
public Dimension getPreferredSize() {
  Dimension superDim = super.getPreferredSize();
  int width = Math.max(superDim.getWidth(), PREF_SIZE.getWidth());
  int height = Math.max(superDim.getHeight(), PREF_SIZE.getHeight()); 
  return new Dimension(width, height);
}
于 2013-01-12T20:09:47.927 に答える
4

JLabelメソッド内でテキストコンテンツをレンダリングしますpaintComponent

あなたは正しく、電話をかけsuper.paintComponentていますが、すぐにそれを塗りつぶしています。fillRect

super.paintComponent呼び出しをメソッドの最後(fillRect呼び出し後)に移動し、ラベルを透明のままにしてみてください

于 2013-01-12T20:11:46.683 に答える
4

あなたがペイントをしたとき、それはテキストの上にペイントしました。SwingXプロジェクトを見てください。それはあなたが望むことを正確に行うJxLabelクラスを持っています。

于 2013-01-12T20:13:33.703 に答える