JPanel上没有显示的Java重绘图片

时间:2014-11-18 12:18:22

标签: java swing

我有以下类,构建我的UI:

import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class DebugFrame extends JFrame {

    private static final long serialVersionUID = 1L;

    GridBagConstraints constraints;

    public DebugFrame(String title) {

        this.setTitle(title);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setContentPane(new JPanel());
        this.getContentPane().setLayout(new GridBagLayout());

        constraints = new GridBagConstraints();
        constraints.gridwidth = 1;
        constraints.gridheight = 1;
        constraints.gridx = 0;
        constraints.gridy = 0;
        constraints.insets = new Insets(3, 3, 3, 3);

    }

    @Override
    public Component add(Component comp) {

        constraints.gridy++;
        super.add(comp, constraints);

        this.pack();
        this.setLocationRelativeTo(null);

        return null;

    }

}

下一步:

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.image.BufferedImage;

import javax.activation.UnsupportedDataTypeException;
import javax.swing.JPanel;

import org.opencv.core.Mat;

public class ProcessPanel extends JPanel {

    private static final long serialVersionUID = 1L;

    GridBagConstraints constraints;

    StepPanel[][] panels;

    public ProcessPanel(int rows, int cols, int innerPanelWidth, int innerPanelHeight) {

        this.setLayout(new GridBagLayout());

        constraints = new GridBagConstraints();
        constraints.gridwidth = 1;
        constraints.gridheight = 1;
        constraints.gridx = 0;
        constraints.gridy = 0;

        panels = new StepPanel[rows][cols];

        for (int j = 0; j < rows; j++) {
            for (int i = 0; i < cols; i++) {

                Dimension size = new Dimension(innerPanelWidth, innerPanelHeight);
                panels[j][i] = new StepPanel("", size);
                constraints.gridx = i;
                constraints.gridy = j;
                this.add(panels[j][i], constraints);

            }
        }

    }

    public void setLabelAndImage(int x, int y, String labelText, Mat mat) {

        panels[y][x].setTitle(labelText);

        BufferedImage buf = null;
        try {
            buf = Converter.matToBufferedImage(mat);
        } catch (UnsupportedDataTypeException e) {
            e.printStackTrace();
        }

        panels[y][x].setImage(buf);

    }

}

下一步:

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.image.BufferedImage;

import javax.swing.JLabel;
import javax.swing.JPanel;

public class StepPanel extends JPanel {

    private static final long serialVersionUID = 1L;

    GridBagConstraints constraints;

    private JLabel label;
    private ImagePanel panel;

    public StepPanel(String title, Dimension panelSize) {

        constraints = new GridBagConstraints();
        constraints.gridwidth = 1;
        constraints.gridheight = 1;
        constraints.gridx = 0;
        constraints.gridy = 0;
        constraints.insets = new Insets(3, 3, 3, 3);

        this.label = new JLabel();
        this.add(label, constraints);

        constraints.gridy = 1;
        this.panel = new ImagePanel(panelSize);
        this.add(panel, constraints);

    }

    public void setImage(BufferedImage image) {
        panel.setImage(image);
        panel.revalidate();
    }

    public void setTitle(String title) {
        label.setText(title);
    }

}

下一步:

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;

public class ImagePanel extends JPanel {

    private static final long serialVersionUID = 1L;

    private BufferedImage image;
    private Dimension dim;

    public ImagePanel(Dimension dim) {
        this.dim = dim;
        this.setPreferredSize(dim);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, dim.width, dim.height, null);
    }

    public void setImage(BufferedImage image) {
        this.image = image;
        this.repaint();
    }

}

DebugFrame应包含多个ProcessPanel。 ProcessPanel由JPanel和JLabel的StepPanels和StepPanels组成。在我的应用程序中,我尝试通过setImage方法动态更改StepPanel的图像。显示更改的标签文本,但更改的图像不显示。

如何解决这个问题?

0 个答案:

没有答案