Метод paintComponent ничего не отображает на JLabel? - PullRequest
1 голос
/ 31 марта 2012

Я пытаюсь показать гистограмму изображения в jlabel, но она не работает.

//hist : array containing histogram values
//wid: width of image
//ht: height of image
mylabel.add(new showData(hist,wid,ht));

Код, который я использую для отображения гистограммы:

class showData extends JLabel{
int w,h;
int hist[] = new int[256];
int max_hist=0;
public showData(int[] histValue,int w, int h) {
    System.arraycopy(histValue, 0, hist, 0, 256);
    this.w = w;
    this.h = h;
    for (int i = 0; i < 256; i++) {
        if(hist[i]>max_hist)
            max_hist=hist[i];
    }
}


@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);

int x = (w - 256) / 2;
int lasty = h - h * hist[0] / max_hist;
for (int i=0; i<256; i++, x++) {
  int y = h - h * hist[i] / max_hist;
  g.setColor(new Color(i, i, i));
  g.fillRect(x, y, 1, h);
  g.setColor(Color.red);
  g.drawLine(x-1,lasty,x,y);
  lasty = y;
}
}
}

При отладке я обнаружил, что вызывается метод showData (), а paintComponent () - нет. Почему это так? Jlabel 'mylabel' ничего не показывает?

Ответы [ 3 ]

2 голосов
/ 31 марта 2012

Следующий код работает для меня.Обратите внимание на настройку предпочитаемого размера в конструкторе:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JLabel;

class ShowData extends JLabel {
    int w, h;
    int hist[];
    int max_hist = 0;

    public ShowData(int[] histValue, int w, int h) {
        hist = new int[histValue.length];
        System.arraycopy(histValue, 0, hist, 0, histValue.length);
        this.w = w;
        this.h = h;
        setPreferredSize(new Dimension(w, h * 2));
        for (int i = 0; i < hist.length; i++) {
            if (hist[i] > max_hist) {
                max_hist = hist[i];
            }
        }
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        int x = (w - hist.length) / 2;
        int lasty = h - h * hist[0] / max_hist;
        for (int i = 0; i < hist.length; i++, x++) {
            int y = h - h * hist[i] / max_hist;
            g.setColor(new Color(i, i, i));
            g.fillRect(x, y, 1, h);
            g.setColor(Color.red);
            g.drawLine(x - 1, lasty, x, y);
            lasty = y;
        }
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ShowData data = new ShowData(new int[] { 1, 2, 3, 4, 5, 6, 7 }, 100,
             100);
        frame.add(data);
        frame.pack();
        frame.setVisible(true);    
    }
}
2 голосов
/ 31 марта 2012

Если метка непрозрачная, вам может потребоваться вызвать repaint() in showData().

1 голос
/ 31 марта 2012

Посмотрите на это:

/**
 * 
 */
package org.test;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.image.ImageObserver;
import java.text.AttributedCharacterIterator;

import javax.swing.JFrame;
import javax.swing.JLabel;

/**
 * @author Sinisa
 *
 */
public class Test {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        JLabel jLabel = new JLabel();
        Test t = new Test();
//      jLabel.add();
        frame.add(t.new showData(new int[]{1, 2, 3},200,200));
        frame.setVisible(true);
        frame.setSize(new Dimension(800, 600));
    }


    class showData extends JLabel{
        int w,h;
        int hist[] = new int[256];
        int max_hist=0;
        public showData(int[] histValue,int w, int h) {
            System.arraycopy(histValue, 0, hist, 0, 3);
            this.w = w;
            this.h = h;
//          this.setText("sds");
            for (int i = 0; i < 256; i++) {
                if(hist[i]>max_hist)
                    max_hist=hist[i];
            }
        }


        /**
        * {@inheritDoc}
        */
        @Override
        protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        int x = (w - 256) / 2;
        int lasty = h - h * hist[0] / max_hist;
        for (int i=0; i<256; i++, x++) {
          int y = h - h * hist[i] / max_hist;
          g.setColor(new Color(i, i, i));
          g.fillRect(x, y, 1, h);
          g.setColor(Color.red);
          g.drawLine(x-1,lasty,x,y);
          lasty = y;
        }
        }
        }
}
...