我写了两种方式来显示图像,当时一个JPanel阵列,但它没有显示图像。
这是我的代码:
public class Mutil_Image_2 implements MouseListener {
public JPanel [][]sub=new JPanel[10][10];
public JPanel screen = new JPanel();
public JFrame f = new JFrame("Draw on Panel");
public static int v1,v2;
public static int x1 =1,y1=1;
public Mutil_Image_2(String title)
{
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setExtendedState(JFrame.MAXIMIZED_BOTH); //Full Screen
screen.setBorder(BorderFactory.createLineBorder(Color.black));
screen.setLayout(new GridLayout(10,10));
int dem =0;
for (int i=0; i<=9;i++)
{
for (int j=0; j<=9;j++)
{
sub[i][j]= new JPanel();
sub[i][j].setBorder(BorderFactory.createLineBorder(Color.red));
screen.add(sub[i][j]);
v1=i;
v2=j;
sub[i][j].addMouseListener(this);
f.add(screen);
}
}
f.pack();
f.setVisible(true);
}
public static void main(String args[])
{
new Mutil_Image_2("Grid Layout");
}
public void mouseClicked(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
JPanel source = (JPanel) e.getSource();
BufferedImage img1;
if(e.getButton() == MouseEvent.BUTTON1)
{
x1=e.getX();
y1=e.getY();
//source.setBackground(Color.black);
source.setSize(500, 500);
try { // The first way to show Image
img1 = ImageIO.read(new File("D:\\Pict3.png"));
JLabel picLabel = new JLabel (new ImageIcon(img1));
source.add(picLabel);
} catch (IOException e1) {
e1.printStackTrace();
}
source.add(new draw_Image_in_MultiPanel()); //Second way to show Image
}
}
}
class draw_Image_in_MultiPanel extends JPanel {
Image img1,img2;
public draw_Image_in_MultiPanel() {
setBorder(BorderFactory.createLineBorder(Color.black));
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setSize(screenSize.width, screenSize.height);
}
public void paint(Graphics g) {
super.paintComponent(g);
int vt1 = Mutil_Image_2.x1;
int vt2 = Mutil_Image_2.y1;
try
{
img1 = ImageIO.read(new File("D:\\Pict3.jpg"));
g.drawImage(img1, vt1, vt2, img1.getWidth(this),img1.getHeight(this) , Color.darkGray, this);
g.drawString("Postion is:" + vt1 + " -" + vt2, vt1,vt2);
} catch (IOException e) {
e.printStackTrace();
}
} }
答案 0 :(得分:0)
首先尝试这个:
source.add(picLabel);
//Followed by
source.revalidate();
第二种方式:
source.add(new draw_Image_in_MultiPanel());
//Again followed by
source.revalidate();
一般来说,在将JFrame设置为可见后添加或更改组件时,应调用&#34; revalidate()&#34;在容器上。这告诉Java更新UI布局。我很确定这是你的问题。
<强> 修改 强>
在玩完你的代码之后,在我看来,调整JPanels的大小和编辑会让你很头疼。相反,我提出了一个使用JDialog在单击面板时显示图像的示例。 JDialog充当可以在任何地方绘制的面板,它将始终位于其他面板之上。这也意味着您的所有面板都可以保持相同的尺寸。当用户点击其他地方时,它还简化了关闭面板的过程。 您的所有代码都是相同的(减去我删除的内部类)我对您的代码所做的任何编辑或删除都被注释掉了,这样您就可以看到我更改的内容和原因。
public class Mutil_Image_2 implements MouseListener {
//A JDialog to show your image
public JDialog popup;
//A JPanel to store the last panel that was clicked.
public JPanel lastPane;
public JPanel[][] sub = new JPanel[10][10];
public JPanel screen = new JPanel();
public JFrame f = new JFrame("Draw on Panel");
public static int v1, v2;
public static int x1 = 1, y1 = 1;
public Mutil_Image_2(String title) {
//Popup that is owned by your JFrame f.
popup = new JDialog(f);
//Initial location
popup.setLocation(0, 0);
//Initial size same as source in your original code.
popup.setSize(500, 500);
//Removes the window controls from the popup to make it look like a JPanel
//Setting this to false will make the popup look like a JFrame.
popup.setUndecorated(true);
//Your original code for drawing all the JPanels
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setExtendedState(JFrame.MAXIMIZED_BOTH); // Full Screen
screen.setBorder(BorderFactory.createLineBorder(Color.black));
screen.setLayout(new GridLayout(10, 10));
int dem = 0;
for (int i = 0; i <= 9; i++) {
for (int j = 0; j <= 9; j++) {
sub[i][j] = new JPanel();
sub[i][j].setBorder(BorderFactory.createLineBorder(Color.red));
screen.add(sub[i][j]);
v1 = i;
v2 = j;
sub[i][j].addMouseListener(this);
f.add(screen);
}
}
f.pack();
f.setVisible(true);
}
public static void main(String args[]) {
new Mutil_Image_2("Grid Layout");
}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mousePressed(MouseEvent e) {
JPanel source = (JPanel) e.getSource();
BufferedImage img1;
if (e.getButton() == MouseEvent.BUTTON1) {
//Close the popup if the same panel was clicked twice
if(lastPane != null){
if(lastPane.equals(source)){
popup.setVisible(false);
lastPane = null;
return;
}
}
//If the above test was false we are clicking a different panel
//assign this panel to lastPane so we can close the popup if
//this pane is clicked again
lastPane = source;
//We now get the position of the click in the frames coordinates
//Using e.getX/Y will return the click in panel coordinates, we don't want
//that as we are positioning the popup relative to the JFrame.
x1 = f.getMousePosition().x;
y1 = f.getMousePosition().y;
//Position the popup on the mouse click
popup.setLocation(x1, y1);
//Old code
//x1 = e.getX();
//y1 = e.getY();
// source.setBackground(Color.black);
//source.setSize(500, 500);
try { // The first way to show Image
img1 = ImageIO.read(new File("D:\\Pict3.png"));
JLabel picLabel = new JLabel(new ImageIcon(img1));
//Remove any components in the popups content pane
//this essemntially gives up a fresh panel inside
//the popup.
popup.getContentPane().removeAll();
//add picture to popup
popup.add(picLabel);
//show popup
popup.setVisible(true);
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
尝试一下,我相信这是你正在寻找的,也是我能想到的最简单的方法。
回答您关于定位图片的其他问题: 您可以在弹出窗口的内容窗格中使用布局管理器,也可以将弹出窗口的布局管理器设置为null并在JLabel上使用set position。
如果您有任何其他问题,请不要犹豫,问:)