2015-04-30 3 views
0

Впервые три случайных изображения, показанные на Jframe из трех разных массивов. метод MouseClicked запускается, но изображения не обновляются в кадре. Я хочу обновить три случайных изображения каждый раз, когда я нажимаю на рамку. Пожалуйста, помогитеИзображение не было свежее в рамке на мыши Нажмите на Java

import java.awt.*; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.util.Random; 

import javax.swing.*; 

public class Cards extends JFrame implements MouseListener { 

    public static void main(String[] args) { 
    JFrame frame = new Cards();  
     frame.setTitle("Cards"); 



     frame.setSize(500, 500); 

     frame.setLocationRelativeTo(null); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 


     new Cards(); 

    } 

    public Cards() { 

     this.getContentPane().addMouseListener(this); 

     cards1(); 
     cards2(); 
     cards3(); 

    } 

    public void cards1() { 

     ImageIcon[] images = new ImageIcon[10]; 
     for (int i = 1; i < images.length; i++) { 

      images[i] = new ImageIcon("Drawables//Images//" + i + ".png"); 

     } 

     int[] threeRandoms = new int[1]; 
     Random ran = new Random(); 

     for (int i = 0; i < threeRandoms.length; i++) { 

      threeRandoms[i] = ran.nextInt(10); 

     } 

     setLayout(new GridLayout(1, 4, 5, 5)); 

     add(new JLabel(images[threeRandoms[0]])); 

    } 


    public void cards2() { 

     ImageIcon[] images = new ImageIcon[10]; 
     for (int i = 1; i < images.length; i++) { 

      images[i] = new ImageIcon("Drawables//Images1//" + i + ".png"); 

     } 

     int[] threeRandoms = new int[1]; 
     Random ran = new Random(); 

     for (int i = 0; i < threeRandoms.length; i++) { 

      threeRandoms[i] = ran.nextInt(10); 

     } 

     setLayout(new GridLayout(1, 4, 5, 5)); 

     add(new JLabel(images[threeRandoms[0]])); 

    } 

    public void cards3() { 
     // this.getContentPane().addMouseListener(this); 
     ImageIcon[] images = new ImageIcon[10]; 
     for (int i = 1; i < images.length; i++) { 

      images[i] = new ImageIcon("Drawables//Images2//" + i + ".png"); 

     } 

     int[] threeRandoms = new int[1]; 
     Random ran = new Random(); 

     for (int i = 0; i < threeRandoms.length; i++) { 

      threeRandoms[i] = ran.nextInt(10); 

     } 

     // Labels with gridLayout 

     setLayout(new GridLayout(1, 4, 5, 5)); 

     add(new JLabel(images[threeRandoms[0]])); 

    } 

    public void mouseClicked(MouseEvent e) { 
     System.out.println("The frame was clicked."); 
     new Cards(); 
    } 

    public void mouseEntered(MouseEvent e) { 
     System.out.println("The mouse entered the frame."); 
    } 

    public void mouseExited(MouseEvent e) { 
     System.out.println("The mouse exited the frame."); 

    } 

    public void mousePressed(MouseEvent e) { 
     System.out.println("The left mouse button was pressed."); 

    } 

    public void mouseReleased(MouseEvent e) { 
     System.out.println("The left mouse button was released."); 

    } 

} 

ответ

1

Мне очень жаль, но я смущен код. С одной стороны, ваши методы cards1(), cards2() и cards3() выглядят одинаково, и если да, то почему 3 разных метода? Почему не только один метод? В этих методах вы пытаетесь добавить JLabels повторно. Вы пытаетесь добавить в графический интерфейс много JLabels? Или вы просто пытаетесь отобразить 3 изображения, которые изменяются случайным образом при действии мыши?

Я бы рекомендовал структурирование вещи немного по-другому:

  • Если возможно, прочитать все необходимые изображения в один раз в конструкторе вашего класса, поместить изображения в ImageIcons, а затем добавить их в ArrayList или в случае необходимости несколько ArrayLists быть.
  • Не добавляйте новые JLabels каждый раз, когда вызывается mouseClick.
  • Создайте JPanel, дайте ему GridLayout и в своем конструкторе класса добавьте к нему три JLabels, которые являются либо полями экземпляра, либо массивом или ArrayList.
  • Добавьте этот JPanel в свой JFrame.
  • Добавить MouseListener каждого JLabel
  • в mousePressed(MouseEvent e) методе, который MouseListener (а не mouseClicked) рандомизации своего номера и использовать этот номер для вызова setIcon(...) на источнике JLabel, позвонив по телефону getSource() на вашем параметре MouseEvent.

Например:

import java.awt.GridLayout; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class RandomImages extends JPanel { 
    private static final int LABEL_COUNT = 3; 
    private Random random = new Random(); 

    public RandomImages() { 
     setLayout(new GridLayout(1, 3)); 
     for (int i = 0; i < LABEL_COUNT; i++) { 
     final List<Icon> iconList = new ArrayList<>(); 

     // TODO: get images for the ith list 
     // and fill iconList with ImageIcons from the first grouping 

     // create JLabel and give it the first Icon from the List above 
     final JLabel label = new JLabel(iconList.get(0)); 
     label.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mousePressed(MouseEvent e) { 
       // get random number from random object using iconList.size() 
       // get random Icon from list 
       // set label's icon via setIcon(...) 
      } 
     }); 
     // add to GUI 
     add(label); 
     } 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("RandomImages"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new RandomImages()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

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

Конкретный пример 2:

import java.awt.GridLayout; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 
import javax.imageio.ImageIO; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class RandomChessMen extends JPanel { 
    // for this example I get a sprite sheet that holds several sprite images in it 
    // the images can be found here: http://stackoverflow.com/questions/19209650 
    private static final String IMAGE_PATH = "http://i.stack.imgur.com/memI0.png"; 
    private static final int LABEL_COUNT = 2; 
    private static final int ICON_COLUMNS = 6; 
    private Random random = new Random(); 

    public RandomChessMen() throws IOException { 
     URL url = new URL(IMAGE_PATH); 
     BufferedImage largeImg = ImageIO.read(url); 
     setLayout(new GridLayout(1, 0)); 

     // break down large image into its constituent sprites and place into ArrayList<Icon> 
     int w = largeImg.getWidth()/ICON_COLUMNS; 
     int h = largeImg.getHeight()/LABEL_COUNT; 
     for (int i = 0; i < LABEL_COUNT; i++) { 
     final List<Icon> iconList = new ArrayList<>(); 
     int y = (i * largeImg.getHeight())/LABEL_COUNT; 
     // get 6 icons out of large image 
     for (int j = 0; j < ICON_COLUMNS; j++) { 
      int x = (j * largeImg.getWidth())/ICON_COLUMNS; 
      // get subImage 
      BufferedImage subImg = largeImg.getSubimage(x, y, w, h); 
      // create ImageIcon and add to list 
      iconList.add(new ImageIcon(subImg)); 
     } 

     // create JLabel 
     final JLabel label = new JLabel("", SwingConstants.CENTER); 
     int eb = 40; 
     label.setBorder(BorderFactory.createEmptyBorder(eb, eb, eb, eb)); 

     // get random index for iconList 
     int randomIndex = random.nextInt(iconList.size()); 
     Icon icon = iconList.get(randomIndex); // use index to get random Icon 
     label.setIcon(icon); // set label's icon 
     label.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mousePressed(MouseEvent e) { 
       Icon secondIcon = label.getIcon(); 
       // so we don't repeat icons 
       while (label.getIcon() == secondIcon) { 
        int randomIndex = random.nextInt(iconList.size()); 
        secondIcon = iconList.get(randomIndex); 
       } 
       label.setIcon(secondIcon); 
      } 
     }); 
     // add to GUI 
     add(label); 
     } 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("RandomImages"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     try { 
     frame.getContentPane().add(new RandomChessMen()); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     System.exit(-1); 
     } 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

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

карта1() card2() card3() получение изображений из трех разных ресурсов. –

+0

@UsmanMalik: ОК, затем создайте только метод ** один ** и передайте параметр String в исходный код. Сам я бы даже не сделал этого, а скорее прочитал бы изображения в ArrayList или несколько 'ArrayList ' один раз в вашем конструкторе. –

+0

Я пытаюсь отобразить 3 изображения из трех разных ресурсов, которые изменяются случайным образом при щелчке мышью. Я новичок в java Пожалуйста, помогите мне сделать это, как я могу это сделать? –

0

Я сделал эти изменения в код:

  • Вместо того, три метода cards1() cards2() cards3(), я только что сделал один метод cards().
  • Каждый раз, когда вы нажимаете на рамку, загружаются три случайных изображения.
  • Я установил каждое изображение внутри JLabel, чтобы упростить его обновление.

Код ниже прекрасно работает в соответствии с вашими потребностями.

package example; 

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.util.Random; 

import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingConstants; 
import javax.swing.SwingUtilities; 


public class Cards extends JFrame implements MouseListener { 

    JPanel subPanel1; 
    JLabel label1, label2, label3; 

    static ImageIcon[] images ; 
    static Random ran ; 
    static int[] threeRandoms; 


    public Cards() { 

     super("Cards"); 

     subPanel1 = new JPanel(); 

     // Set up first subpanel   
     subPanel1.setPreferredSize (new Dimension(400, 400)); 
     //subPanel1.setBackground (Color.cyan); 
     label1 = new JLabel ("image 1",SwingConstants.CENTER); 
     label2 = new JLabel ("image 2", SwingConstants.LEFT); 
     label3 = new JLabel ("image 3", SwingConstants.CENTER); 

     subPanel1.add (label1); 
     subPanel1.add (label2); 
     subPanel1.add (label3); 

     add(subPanel1); 

     addMouseListener(this); 
     setSize(500, 500); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     pack(); 
     setLocationRelativeTo(null); 
     setVisible(true); 
     System.out.println("Success....."); 
    } 

    public void cards() { 


     for (int i = 0; i < threeRandoms.length; i++) 
      threeRandoms[i] = ran.nextInt(3); 


      label1.setIcon(images[threeRandoms[0]]); 
      label2.setIcon(images[threeRandoms[1]]); 
      label3.setIcon(images[threeRandoms[2]]); 


    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     System.out.println("mouseClicked"); 
     cards(); 
    } 

    @Override 
    public void mouseEntered(MouseEvent e) { 
     System.out.println("mouseEntered"); 
    } 

    @Override 
    public void mouseExited(MouseEvent e) { 
     System.out.println("mouseExited"); 
    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
     System.out.println("mousePressed"); 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     System.out.println("mouseReleased"); 
    } 

    public static void loadImages(){ 
     images = new ImageIcon[4]; 
     ran = new Random(); 
     threeRandoms = new int[3]; 
     for (int i = 1; i <= images.length; i++) { 

      images[i-1] = new ImageIcon("Drawables//Images//" + i + ".png"); 

     } 
    } 

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

} 
+0

Он показывает первые буксирные изображения карт1() и карт() Это не вызвало случайные образы –

+0

Вы предлагаете, чтобы он снова и снова добавлял новый JList? Зачем? –

+0

@UsmanMalik Ответ отредактирован. Я надеюсь, что это работает, но, пожалуйста, убедитесь, что путь к изображениям;) – MChaker

Смежные вопросы