Как сделать подгрузку изображений к списку?

Вечер добрый.
Всех с наступающим!
Есть код:
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.AffineTransform;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

 
public class tests {
 
    private static TransformingCanvas canvas;
    
	public static void main(String[] args) {
        JFrame frame = new JFrame();
        JPanel toolbar = new JPanel();
        
        
        final String[] number = new String[] {"1044", "1045", "1046", "1054"}; 
		final JComboBox combo = new JComboBox(number);
		combo.setSelectedIndex(0);
		combo.setEditable(true);
			
        
		final JButton butGo = new JButton("GO");
			
		butGo.addActionListener(new ActionListener() {        
			public void actionPerformed(ActionEvent e) {            
				combo.getSelectedItem();
				
				}   
			});

		
		toolbar.add(combo);
		toolbar.add(butGo);
	
		
        
        
        canvas = new TransformingCanvas();
        TranslateHandler translater = new TranslateHandler();
        canvas.addMouseListener(translater);
        canvas.addMouseMotionListener(translater);
        canvas.addMouseWheelListener(new ScaleHandler());
        frame.setLayout(new BorderLayout());
        frame.getContentPane().add(toolbar, BorderLayout.PAGE_START);
        frame.getContentPane().add(canvas, BorderLayout.CENTER);
        frame.setSize(500, 500);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setVisible(true);
    }
 
    private static class TransformingCanvas extends JComponent {
    	
        private static final long serialVersionUID = 1L;
        private double translateX;
        private double translateY;
        private double scale;
 
        TransformingCanvas() {
            translateX = 0;
            translateY = 0;
            scale = 0.5;
            setOpaque(true);
            setDoubleBuffered(true);
        }
 
        @Override 
        public void paint(Graphics g) {
            AffineTransform tx = new AffineTransform();
            tx.translate(translateX, translateY);
            tx.scale(scale, scale);
            Graphics2D ourGraphics = (Graphics2D) g;
 
            ourGraphics.setColor(Color.WHITE);
            ourGraphics.fillRect(0, 0, getWidth(), getHeight());
 
            ourGraphics.setTransform(tx);
            ourGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            ourGraphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                    RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
 
            
            Image image = new ImageIcon("1.jpg").getImage();
            ourGraphics.drawImage(image, 100, 100, this);
        }
       
    }
 
    private static class TranslateHandler implements MouseListener,
            MouseMotionListener {
        private int lastOffsetX;
        private int lastOffsetY;
 
        public void mousePressed(MouseEvent e) {
            // Захват стартовой точки
            lastOffsetX = e.getX();
            lastOffsetY = e.getY();
        }
 
        public void mouseDragged(MouseEvent e) {
            
            // new x and y are defined by current mouse location subtracted
            // by previously processed mouse location
            int newX = e.getX() - lastOffsetX;
            int newY = e.getY() - lastOffsetY;
 
            // increment last offset to last processed by drag event.
            lastOffsetX += newX;
            lastOffsetY += newY;
 
            // update the canvas locations
            canvas.translateX += newX;
            canvas.translateY += newY;
            
            // schedule a repaint.
            canvas.repaint();
        }
 
        public void mouseClicked(MouseEvent e) {}
        public void mouseEntered(MouseEvent e) {}
        public void mouseExited(MouseEvent e) {}
        public void mouseMoved(MouseEvent e) {}
        public void mouseReleased(MouseEvent e) {}
    }
 
    private static class ScaleHandler implements MouseWheelListener {
        public void mouseWheelMoved(MouseWheelEvent e) {
            if(e.getScrollType() == MouseWheelEvent.WHEEL_UNIT_SCROLL) {
                
                // make it a reasonable amount of zoom
                // .1 gives a nice slow transition
                canvas.scale += (.02 * e.getWheelRotation());
                // don't cross negative threshold.
                // also, setting scale to 0 has bad effects
                canvas.scale = Math.max(0.00001, canvas.scale); 
                canvas.repaint();
            }
        }
    }
 
}

Хочется сделать, чтобы по нажатии на кнопочку GO, у меня подгружались разные изображения, в зависимости от выбранного пункта из выпадающего списка.
Как я понял, можно прописать в методе "paint":
String n = combo.getSelectedItem();
Image image = new ImageIcon(n + ".jpg").getImage();
ourGraphics.drawImage(image, 100, 100, this);


Но эклипс соотв выдает ошибку "combo cannot be resolved"...
Как я понял, потому, что слушатель находиться в другом методе(main).
Подскажите, люди добрые, как-то можно решить эту проблему или сделать под другому?

Заранее благодарю.
  • Вопрос задан
  • 2403 просмотра
Пригласить эксперта
Ответы на вопрос 3
По хорошему, с точки зрения архитектуры, вам не нужно прокидывать комбобокс в TransformingCanvas, потому что его задача заключается в отрисовке изображений. Но откуда изображения берутся это уже второй вопрос. Я бы ввел какой нибудь интерфейс, например:
public interface ImageProvider {
    Image getImage();
}


В TransformingCanvas завел бы поле ImageProvider и сеттер для него. При нажатии на кнопку вы устанавливаете через сеттер соответствующую реализацию ImageProvider
При отрисовке TransformingCanvas должен брать изображение из ImageProvider. Остается один вопрос: как оповестить TransformingCanvas об изменении изображения и о необходимости перерисовки? Способов решения много. Самый простой: в сеттере для ImageProvider явно вызывать перерисовку TransformingCanvas. Можно также через слушателя, регистрируемого в ImageProvider.

p.s. И еще. Я не знаю конечно специфики вашего TransformingCanvas, но в общем случае лучше переопределять не метод JComponent.paint(Graphics g), а JComponent.paintComponent(Graphics g) Метод paint определяет весь алгоритм рисования компонента, включая его границу и его дочерние компоненты, в то время как paintComponent рисует только сам компонент. Переопределив paint, вам придется самому заморачиваться с рисованием дочерних компонентов, если конечно это потребуется. Почитайте документацию в этим методам, там все описано.
Ответ написан
@j_wayne
Со Swing опыта почти нет, но может все же передать combo в конструктор TransformingCanvas, сохранить его в поле и вызвать у него то, что вы хотите?
Возможно, есть способ более штатный.
Ответ написан
@sqwartl Автор вопроса
Самый простой: в сеттере для ImageProvider явно вызывать перерисовку TransformingCanvas. Можно также через слушателя, регистрируемого в ImageProvider.

Все таки не понял(((
Мне же все равно как то надо обратиться к слушателю кнопки и выдернуть combo.getSelectedItem();
... я запутался(
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы