我有以下类,构建我的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的图像。显示更改的标签文本,但更改的图像不显示。
如何解决这个问题?