2012-09-01 25 views
5

Đây là JFrameChương trình không truy cập vào phương pháp paintComponent() của lớp JPanel mở rộng

package client.connection; 

import java.awt.Dimension; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import javax.swing.JFrame; 


class DrawFrameRemoteControl extends JFrame 
{ 
    private DrawPanelRemoteControl imagePanel; 
    private ClientRemoteControlConnection clientRemoteControlConnection; 
    private ObjectInputStream clientInputStream; 
    private ObjectOutputStream clientOutputStream; 
    private Dimension imageDimension; 
    private Dimension serverDimension; 

    public DrawFrameRemoteControl(Dimension imageDimension,ClientRemoteControlConnection clientRemoteControlConnection,ObjectInputStream clientInputStream,ObjectOutputStream clientOutputStream,Dimension serverDimension) 
    { 
     super("Remote Desktop Control"); 

     this.clientRemoteControlConnection=clientRemoteControlConnection; 
     this.clientInputStream=clientInputStream; 
     this.clientOutputStream=clientOutputStream; 
     this.imageDimension=imageDimension; 
     this.serverDimension=serverDimension; 

     imagePanel=new DrawPanelRemoteControl(imageDimension); 
     add(imagePanel); 


     setSize(imageDimension.width,imageDimension.height); 
     setResizable(false); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setVisible(true); 
     setLocationRelativeTo(null); 
    } 

    void drawNewImageGrayscale(byte[] array) 
    { 
     imagePanel.setNewImageGrayscale(array); 
     imagePanel.repaint(); 
    } 
} 

Và đây là JPanel mở rộng class-

package client.connection; 

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.Toolkit; 
import java.awt.Transparency; 
import java.awt.color.ColorSpace; 
import java.awt.image.BufferedImage; 
import java.awt.image.ColorModel; 
import java.awt.image.ComponentColorModel; 
import java.awt.image.DataBuffer; 
import java.awt.image.DataBufferByte; 
import java.awt.image.MemoryImageSource; 
import java.awt.image.Raster; 
import java.awt.image.SampleModel; 
import java.awt.image.WritableRaster; 
import javax.swing.ImageIcon; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

class DrawPanelRemoteControl extends JPanel 
{ 
    private byte[] byteArray=null; 
    private Image image; 
    private JLabel imageLabel=new JLabel(); 
    private Dimension imageDimension; 

    public DrawPanelRemoteControl(Dimension imageDimension) 
    { 
     this.imageDimension=imageDimension; 
     add(imageLabel); 
    } 

    @Override 
    protected void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     System.out.println("."); 
     if(byteArray!=null) 
     { 
      image=getGrayscaleImageFromArray(byteArray,imageDimension.width,imageDimension.height); 
      imageLabel.setIcon(new ImageIcon(image)); 
     } 
    } 

    private Image getGrayscaleImageFromArray(byte[] buffer, int width, int height) 
    { 
     ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY); 
     int[] nBits = { 8 }; 
     ColorModel cm = new ComponentColorModel(cs, nBits, false, true,Transparency.OPAQUE, DataBuffer.TYPE_BYTE); 
     SampleModel sm = cm.createCompatibleSampleModel(width, height); 
     DataBufferByte db = new DataBufferByte(buffer, width * height); 
     WritableRaster raster = Raster.createWritableRaster(sm, db, null); 
     BufferedImage result = new BufferedImage(cm, raster, false, null); 
     return result; 
    } 

    void setNewImageGrayscale(byte[] array) 
    { 
     this.byteArray=array; 
     this.intArray=null; 
    } 
} 

Tôi đã thử gỡ lỗi mã, mặc dù imagePanel.repaint() đang được thực hiện nhiều lần, chương trình không bao giờ đạt đến phương thức paintComponent() của lớp DrawPanelRemoteControl.

Ai đó có thể cho tôi biết tại sao điều này có thể xảy ra không? Nó có liên quan gì với đối tượng imageDimension không?

Thông tin bổ sung: Trong main() phương pháp, một đối tượng DrawFrameRemoteControl được tạo ra và nó drawNewImageGrayscale(byte[] arr) phương pháp đang được cập nhật từ main() mỗi giây.

+0

bạn có thể xin vui lòng gửi 'phương pháp main' của bạn. –

+0

Tôi đã thử mã của bạn hoạt động tốt ..., có thể có một số vấn đề khác .. –

+6

** không bao giờ thay đổi trạng thái của thành phần trong paintComponent (ở đây gián tiếp bằng cách đặt biểu tượng của một đứa trẻ) cũng không làm mọi tác vụ có khả năng dài (tải hình ảnh) – kleopatra

Trả lời

6

Không rõ tại sao bạn lại đi qua khoảng byte[], nhưng có vẻ như bạn muốn cập nhật thành phần Icon của thành phần bằng hình thu nhỏ màu xám. Ví dụ bên dưới tạo biểu tượng màu xám từ các biểu tượng mẫu hiện có và sử dụng setIcon() để thực hiện cập nhật. Cách tiếp cận tương tự cũng hoạt động với bất kỳ Image nào. Xem thêm điều này example đề xuất ColorConvertOp và điều này example cập nhật toàn bộ các thành phần thay vì biểu tượng.

Gray Icons Aqua

Gray Icons Nimbus

import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.Graphics2D; 
import java.awt.GraphicsConfiguration; 
import java.awt.GraphicsDevice; 
import java.awt.GraphicsEnvironment; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 
import java.awt.image.ColorConvertOp; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 
import javax.swing.Icon; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JToggleButton; 
import javax.swing.Timer; 
import javax.swing.UIManager; 

/** 
* @see https://stackoverflow.com/a/12228640/230513 
* @see https://stackoverflow.com/a/7935040/230513 
*/ 
public class GrayIcons extends JPanel { 

    private List<Icon> list = new ArrayList<Icon>(); 
    private List<JToggleButton> buttons = new ArrayList<JToggleButton>(); 
    private Timer timer = new Timer(1000, new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      update(); 
     } 
    }); 

    public GrayIcons() { 
     this.setLayout(new GridLayout(1, 0)); 
     list.add(getGray(UIManager.getIcon("OptionPane.errorIcon"))); 
     list.add(getGray(UIManager.getIcon("OptionPane.informationIcon"))); 
     list.add(getGray(UIManager.getIcon("OptionPane.warningIcon"))); 
     list.add(getGray(UIManager.getIcon("OptionPane.questionIcon"))); 
     for (Icon icon : list) { 
      JToggleButton jtb = new JToggleButton(icon); 
      buttons.add(jtb); 
      this.add(jtb); 
     } 
     timer.start(); 
    } 

    private void update() { 
     Collections.shuffle(list); 
     int index = 0; 
     for (JToggleButton b : buttons) { 
      b.setIcon(list.get(index++)); 
     } 
    } 

    /** 
    * @see https://stackoverflow.com/q/5830533/230513 
    * @see https://stackoverflow.com/a/3106550/230513 
    */ 
    private Icon getGray(Icon icon) { 
     final int w = icon.getIconWidth(); 
     final int h = icon.getIconHeight(); 
     GraphicsEnvironment ge = 
      GraphicsEnvironment.getLocalGraphicsEnvironment(); 
     GraphicsDevice gd = ge.getDefaultScreenDevice(); 
     GraphicsConfiguration gc = gd.getDefaultConfiguration(); 
     BufferedImage image = gc.createCompatibleImage(w, h); 
     Graphics2D g2d = image.createGraphics(); 
     g2d.setPaint(new Color(0x00f0f0f0)); 
     g2d.fillRect(0, 0, w, h); 
     icon.paintIcon(null, g2d, 0, 0); 
     BufferedImage gray = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_GRAY); 
     ColorConvertOp op = new ColorConvertOp(
      image.getColorModel().getColorSpace(), 
      gray.getColorModel().getColorSpace(), null); 
     op.filter(image, gray); 
     return new ImageIcon(gray); 
    } 

    private void display() { 
     JFrame f = new JFrame("GrayIcons"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new GrayIcons().display(); 
      } 
     }); 
    } 
} 
+0

+1 luôn rất hữu ích –

Các vấn đề liên quan