簡體   English   中英

Java:為什么我的圖像沒有顯示?

[英]Java: Why doesn't my image show up?

我創建了2個類,它們通過單擊不同的按鈕共同顯示圖片。 在我EventEvent類我試圖讓這個當你按下"Picture 1"按鈕,變量ImageIcon xpic得到的值ImageIcon vpic (持有的圖像),之后xpic具有相同的值作為vpic我的框架應該以某種方式刷新,以便應用xpic的新值,然后顯示圖片。

即使按下按鈕重新繪制了圖像所在的JPanel,為什么我的圖像也沒有顯示?

主班:

import java.awt.*;
import javax.swing.*;

public class EventMain extends JFrame{
EventEvent obje = new EventEvent(this);


// Build Buttons

JButton picB1;
JButton picB2;
JButton picB3;
JButton picB4;
JButton picB5;

//Build Panels
JPanel row0;

//Build Pictures
ImageIcon xpic;
ImageIcon vpic;


public EventMain(){
    super("Buttons");
    setLookAndFeel();
    setSize(470, 300);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    GridLayout layout1 = new GridLayout(3,4);

    setLayout(layout1);

    picB1 = new JButton("Picture 1");
    picB2 = new JButton("Picture 2");
    picB3 = new JButton("Picture 3");
    picB4 = new JButton("Picture 4");
    picB5 = new JButton("Picture 5");


    vpic = new ImageIcon(getClass().getResource("Images/vanessa.png")); 

    // Set up Row 0
    row0 = new JPanel();
    JLabel statement = new JLabel("Choose a picture: ", JLabel.LEFT);
    JLabel picture = new JLabel(xpic);
    // Set up Row 1
    JPanel row1 = new JPanel();
    // Set up Row 2
    JPanel row2 = new JPanel();

    //Listeners

    picB1.addActionListener(obje);

    FlowLayout grid0 = new FlowLayout (FlowLayout.CENTER);
    row0.setLayout(grid0);
    row0.add(statement);
    row0.add(picture);
    add(row0);


    FlowLayout grid1 = new FlowLayout(FlowLayout.CENTER);
    row1.setLayout(grid1);
    row1.add(picB1);
    row1.add(picB2);
    add(row1);

    FlowLayout grid2 = new FlowLayout(FlowLayout.CENTER);
    row2.setLayout(grid2);
    row2.add(picB3);
    row2.add(picB4);
    row2.add(picB5);
    add(row2);

    setVisible(true);
}
private void setLookAndFeel() {
    try {
        UIManager.setLookAndFeel("com.sun.java.swing.plaf.NimbusLookAndFeel");
    } catch (Exception exc) {           
    }

}
public static void main(String[] args) {
    EventMain con = new EventMain();

}
}

包含事件的類:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class EventEvent implements ActionListener {

EventMain gui;

public EventEvent(EventMain in){
    gui = in;
}

public void actionPerformed(ActionEvent event) {
    String command = event.getActionCommand();
    if (command.equals("Picture 1")){
        gui.xpic = gui.vpic;
        gui.row0.repaint();
    }   
}
}

您正在將變量與對象混淆。 僅僅因為您更改了與xpic變量關聯的對象,所以不要以為這會更改JLabel持有的對象(圖標)。 Java中沒有魔術,更改變量引用的對象將不會影響先前的對象。

換句話說,這是:

    gui.xpic = gui.vpic;
    gui.row0.repaint();

對JLabel顯示的圖片的圖標沒有影響

要交換圖標,必須在JLabel上調用setIcon(...) 期。 您將需要使JLabel圖片成為一個字段,而不是局部變量,並為您的GUI類提供一個公共方法,該方法允許外部類更改JLabel圖標的狀態。

另外,您不應直接操作對象字段。 而是給您的gui公共方法提供事件對象可以調用的方法。


編輯
例如:

import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;
import javax.swing.*;

@SuppressWarnings("serial")
public class MyGui extends JPanel {
   public static final String IMAGE_PATH = "https://duke.kenai.com/cards/.Midsize/CardFaces.png.png";
   private static final int ROWS = 4;
   private static final int COLS = 13;
   private BufferedImage largeImg;
   private List<ImageIcon> iconList = new ArrayList<>();
   private JLabel pictureLabel = new JLabel();
   private JButton swapPictureBtn = new JButton(new SwapPictureAction(this, "Swap Picture"));
   private int iconIndex = 0;

   public MyGui() throws IOException {
      add(pictureLabel);
      add(swapPictureBtn);

      URL imgUrl = new URL(IMAGE_PATH);
      largeImg = ImageIO.read(imgUrl);
      for (int i = 0; i < ROWS; i++) {
         for (int j = 0; j < COLS; j++) {
            int x = (j * largeImg.getWidth()) / COLS;
            int y = (i * largeImg.getHeight()) / ROWS;
            int w = largeImg.getWidth() / COLS;
            int h = largeImg.getHeight() / ROWS;
            iconList.add(new ImageIcon(largeImg.getSubimage(x, y, w, h)));
         }
      }

      pictureLabel.setIcon(iconList.get(iconIndex));
   }

   public void swapPicture() {
      iconIndex++;
      iconIndex %= iconList.size();
      pictureLabel.setIcon(iconList.get(iconIndex));
   }

   private static void createAndShowGui() {
      MyGui mainPanel;
      try {
         mainPanel = new MyGui();
         JFrame frame = new JFrame("MyGui");
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         frame.getContentPane().add(mainPanel);
         frame.pack();
         frame.setLocationByPlatform(true);
         frame.setVisible(true);

      } catch (IOException e) {
         e.printStackTrace();
      }

   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

@SuppressWarnings("serial")
class SwapPictureAction extends AbstractAction {

   private MyGui myGui;

   public SwapPictureAction(MyGui myGui, String name) {
      super(name);
      this.myGui = myGui;
   }

   @Override
   public void actionPerformed(ActionEvent e) {
      myGui.swapPicture();
   }
}

在此處輸入圖片說明

請參見下面的createAction()方法及其如何創建AbstractAction。 另請參閱與通過按鈕使用動作有關的教程。 http://docs.oracle.com/javase/tutorial/uiswing/misc/action.html

import javax.swing.*;
import javax.swing.plaf.nimbus.NimbusLookAndFeel;
import java.awt.*;
import java.awt.event.ActionEvent;

public class EventMain {
    private static final ImageIcon PICTURE_1 = new ImageIcon(EventMain.class.getResource("images/v1.png"));
    private static final ImageIcon PICTURE_2 = new ImageIcon(EventMain.class.getResource("images/v2.png"));

    private JFrame frame;

    EventMain create() {
        setLookAndFeel();

        frame = createFrame();
        frame.getContentPane().add(createContent());

        return this;
    }

    void show() {
        frame.setSize(470, 300);
        frame.setVisible(true);
    }

    private JFrame createFrame() {
        JFrame frame = new JFrame("Buttons");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        return frame;
    }

    private Component createContent() {
        final JLabel picture = new JLabel();

        JButton picB1 = new JButton(createAction("Picture 1", picture, PICTURE_1));
        JButton picB2 = new JButton(createAction("Picture 2", picture, PICTURE_2));
        JButton picB3 = new JButton(createAction("Picture 3", picture, PICTURE_1));
        JButton picB4 = new JButton(createAction("Picture 4", picture, PICTURE_2));
        JButton picB5 = new JButton(createAction("Picture 5", picture, PICTURE_1));

        JLabel statement = new JLabel("Choose a picture: ", JLabel.LEFT);

        // Create rows 1, 2, 3
        JPanel panel = new JPanel(new GridLayout(3, 4));
        panel.add(createRow(statement, picture));
        panel.add(createRow(picB1, picB2));
        panel.add(createRow(picB3, picB4, picB5));

        return panel;
    }

    /**
     * Create an action for the button. http://docs.oracle.com/javase/tutorial/uiswing/misc/action.html
     */
    private Action createAction(String label, final JLabel picture, final Icon icon) {
        AbstractAction action = new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                picture.setIcon(icon);
            }
        };
        action.putValue(Action.NAME, label);

        return action;
    }

    private Component createRow(Component... componentsToAdd) {
        JPanel row = new JPanel(new FlowLayout(FlowLayout.CENTER));
        for (Component component : componentsToAdd) {
            row.add(component);
        }

        return row;
    }

    private void setLookAndFeel() {
        try {
            UIManager.setLookAndFeel(new NimbusLookAndFeel());
        } catch (UnsupportedLookAndFeelException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new EventMain().create().show();
            }
        });
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM