2016-02-08 6 views
0

Я пытаюсь изменить изображение на панели при нажатии любой из кнопок JButtons. Я создал массив изображений и нуждаюсь в том, чтобы он изменился на следующее изображение в массиве после его нажатия. Вот мой код:Попытка изменить изображение при нажатии JButton

public class SimpleGui implements ActionListener { 
    JButton button = new JButton("Very Happy"); 
    JButton buttonTwo = new JButton("Happy"); 
    JButton buttonThree = new JButton("Neutral"); 
    JButton buttonFour = new JButton("Sad"); 
    JButton buttonFive = new JButton("Very Sad"); 
    static int[] ButtonArray = new int[5]; 
    private static String[] imageList = { "res/snow.jpg", "res/test-gm.jpg" }; 

    public int i = 0; 

    public static void main(String[] args) throws FileNotFoundException { 

     SimpleGui gui = new SimpleGui(); 
     gui.go(); 

     File file = new File("out.txt"); 
     FileOutputStream fos = new FileOutputStream(file); 
     PrintStream ps = new PrintStream(fos); 
     System.setOut(ps); 

     ButtonArray[0] = 0; 
     ButtonArray[1] = 0; 
     ButtonArray[2] = 0; 
     ButtonArray[3] = 0; 
     ButtonArray[4] = 0; 

    } 

    public void go() { 
     JFrame frame = new JFrame(); 
     JPanel panel = new JPanel(); 
     panel.setBackground(Color.darkGray); 

     panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 

     button.addActionListener(this); 
     buttonTwo.addActionListener(this); 
     buttonThree.addActionListener(this); 
     buttonFour.addActionListener(this); 
     buttonFive.addActionListener(this); 
     panel.add(button); 
     panel.add(buttonTwo); 
     panel.add(buttonThree); 
     panel.add(buttonFour); 
     panel.add(buttonFive); 

     frame.getContentPane().add(BorderLayout.EAST, panel); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(650, 600); 
     frame.setVisible(true); 

     ImageIcon image = new ImageIcon(imageList[i]); 
     ImageIcon image1 = new ImageIcon(imageList[i + 1]); 
     JLabel label = new JLabel("", image, JLabel.CENTER); 
     JPanel panel2 = new JPanel(new BorderLayout()); 
     panel2.add(label, BorderLayout.CENTER); 
     panel2.setLayout(new BoxLayout(panel2, BoxLayout.Y_AXIS)); 
     frame.add(panel2, BorderLayout.CENTER); 

     frame.setVisible(true); 
    } 

    public void actionPerformed(ActionEvent event) { 

     if (event.getSource() == button) { 
      ButtonArray[0] = 1; 
      ButtonArray[1] = 0; 
      ButtonArray[2] = 0; 
      ButtonArray[3] = 0; 
      ButtonArray[4] = 0; 
      System.out.println("Very Happy"); 

     } 
     // buttonTwo = (JButton) event.getSource(); 
     if (event.getSource() == buttonTwo) { 
      ButtonArray[0] = 0; 
      ButtonArray[1] = 1; 
      ButtonArray[2] = 0; 
      ButtonArray[3] = 0; 
      ButtonArray[4] = 0; 
      System.out.println("Happy"); 

     } 
     // buttonThree = (JButton) event.getSource(); 
     if (event.getSource() == buttonThree) { 
      ButtonArray[0] = 0; 
      ButtonArray[1] = 0; 
      ButtonArray[2] = 1; 
      ButtonArray[3] = 0; 
      ButtonArray[4] = 0; 
      System.out.println("Neutral"); 

     } 
     // buttonFour = (JButton) event.getSource(); 
     if (event.getSource() == buttonFour) { 
      ButtonArray[0] = 0; 
      ButtonArray[1] = 0; 
      ButtonArray[2] = 0; 
      ButtonArray[3] = 1; 
      ButtonArray[4] = 0; 
      System.out.println("Sad"); 

     } 

     // buttonFive = (JButton) event.getSource(); 
     if (event.getSource() == buttonFive) { 
      ButtonArray[0] = 0; 
      ButtonArray[1] = 0; 
      ButtonArray[2] = 0; 
      ButtonArray[3] = 0; 
      ButtonArray[4] = 1; 
      System.out.println("Very Sad"); 

     } 

     // System.out.println(Arrays.toString(ButtonArray)); 
     // ImageIcon image = (imageList[i]); 

    } 

} 
+0

Извините, это мой первый раз, используя этот сайт. Первоначально я имел i = i + 1; в конце каждого оператора if, надеясь, что он затем выберет изображение [1] для ImageIcon, как в строке ImageIcon image = new ImageIcon (imageList [i]); однако он не меняет изображение, когда я его запускаю –

+0

Ну, вы никогда не меняете изображение в кнопке ... также, какова цель этого массива 'ButtonArray'? –

+0

Нет никакой цели для этого, это был метод, который я использовал ранее, чтобы сохранить ввод пользователя, но сейчас я его удалил, извините. –

ответ

1

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

ImageIcon[] images = new ImageIcon[] { 
     new ImageIcon("foo.gif"), 
     new ImageIcon("bar.gif"), 
     new ImageIcon("blub.gif") 
}; 

JFrame frame = new JFrame("Test"); 
frame.getContentPane().setLayout(new FlowLayout()); 

JLabel label = new JLabel(images[0]); 
frame.getContentPane().add(label); 

JButton button1 = new JButton("Image 1"); 
button1.addActionListener(e -> label.setIcon(images[0])); 
frame.getContentPane().add(button1); 

JButton button2 = new JButton("Image 2"); 
button2.addActionListener(e -> label.setIcon(images[1])); 
frame.getContentPane().add(button2); 

frame.pack(); 
frame.setVisible(true); 

Обратите внимание, что это с помощью лямбда-функции (Java 8), но вы можете сделать то же самое с одним или более «реальных» ActionListener классов. Важная часть состоит в том, что вы вызываете label.setIcon(theImage); эта часть, кажется, отсутствует в вашем коде.


Если вместо этого вы хотите, чтобы перебрать список или массив изображений, вы можете сделать так:

AtomicInteger index = new AtomicInteger(0); 
JButton buttonCycle = new JButton("Cycle"); 
buttonCycle.addActionListener(e -> label.setIcon(images[index.getAndIncrement() % images.length])); 
frame.getContentPane().add(buttonCycle); 

Здесь AtomicInteger используется, так что я могу объявить его в качестве локальной переменной и используйте его в лямбда. Вы можете использовать обычный int, если вы сделаете его переменной-членом окружающего класса.

private int c = 0; 
... 
buttonCycle.addActionListener(e -> label.setIcon(images[c++ % images.length])); 

вынос является: Создание переменной счетчика, увеличиваем его каждый раз, когда кнопка называется и установить значок лейбла к элементу с этим подсчетам, модуль размер массива.

+0

Извините, я, кажется, задал вопрос в замешательстве. В принципе, я не хочу, чтобы каждая кнопка указывала на конкретный рисунок, я хочу сделать это, чтобы всякий раз, когда один из объявленных JButtons был нажат, изображение меняется на любое изображение следующего в массиве. Сейчас в массиве всего 2 изображения, на самом деле будет 100. –

+0

Большое спасибо Tobias! Я очень ценю это. –