Moduł powiększania zdjęcia moduł

0

Stworzyłem niewielki prosty moduł gdzie można wczytać zdjęcie powiększyć oraz będzie jeszcze opcja zapisu. Problem na obecnym etapie tworzenia jest
tylko w tym iż z wielkim trudem powiększa fotkę przesuwając kontrolkę JSlider. Nie wiem czy to jest kwestia obiektu zwanego ,,img" czy też obiektu ,,ico".

Gdyby komus nie chciało sie rozpakować rar załaczam kod :

package practise_use_slider;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JSlider;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;

public class ResizeSelectedPhoto extends JFrame {

private JPanel contentPane;
BufferedImage img = null;
ImageIcon ico;
JLabel image;
int width, height, imageH2,imageW2;
public JSlider slider;

/**
 * Launch the application.
 */
public void openSource()
{
	JFileChooser choose = new JFileChooser();
	int result = choose.showOpenDialog(null);
	if(result == JFileChooser.APPROVE_OPTION){
		File f = choose.getSelectedFile();
		try{
			
			img = ImageIO.read(f);
			width = img.getWidth();
			height = img.getHeight();
			/*
			if(width >= 500){
				JFrame window2 = new JFrame();
				JPanel p2 = new JPanel();
				window2.getContentPane().add(p2);
				window2.setVisible(true);
				window2.setDefaultCloseOperation(window2.EXIT_ON_CLOSE);
				window2.setSize(300, 100);
				JLabel command = new JLabel("Zdjecie jest zbyt duze wybierz inne");
				p2.add(command);
			}else{*/
			
			
			int a = img.getWidth() - image.getWidth() / 2;
			imageW2 = img.getWidth() - a;
			
			int b = img.getHeight() - image.getHeight() / 2;
			imageH2 = img.getHeight() - b;
			ico = new ImageIcon(img.getScaledInstance(200,150,Image.SCALE_DEFAULT));
			
			image.setIcon(ico);
			
		}catch(IOException ea){
			ea.printStackTrace();
		}
	}
}

public void changeImageMeasure()
{
	slider.addChangeListener(new ChangeListener() {
		public void stateChanged(ChangeEvent e) {
			
			JSlider slider = (JSlider)e.getSource();
			ImageIcon ico2 = new ImageIcon(img.getScaledInstance(ico.getIconWidth()+slider.getValue(), ico.getIconHeight()+slider.getValue(), Image.SCALE_DEFAULT));
			System.out.println(ico.getIconWidth()+slider.getValue()+ "" + ico.getIconHeight()+slider.getValue());
			image.setIcon(ico2);
		}
	});
	
}

public static void main(String[] args) {
	EventQueue.invokeLater(new Runnable() {
		public void run() {
			try {
				ResizeSelectedPhoto frame = new ResizeSelectedPhoto();
				frame.setVisible(true);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	});
}

/**
 * Create the frame.
 */
public ResizeSelectedPhoto() {
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	setBounds(100, 100, 544, 382);
	contentPane = new JPanel();
	contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
	contentPane.setLayout(new BorderLayout(0, 0));
	setContentPane(contentPane);
	
	JPanel panel = new JPanel();
	contentPane.add(panel, BorderLayout.CENTER);
	panel.setLayout(null);
	
	image = new JLabel("",JLabel.CENTER);
	image.setOpaque(true);
	image.setBounds(10, 11, 480, 220);
	panel.add(image);
	
	JButton btnNewButton = new JButton("Open Browser");
	btnNewButton.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			
			openSource();
		}
	});
	btnNewButton.setBounds(204, 242, 107, 23);
	panel.add(btnNewButton);
	
	slider = new JSlider();
	slider.setMaximum(50);
	slider.setMajorTickSpacing(10);
	slider.setMinorTickSpacing(5);
	slider.setPaintLabels(true);
	slider.setPaintTicks(true);
	slider.setValue(0);
	slider.addChangeListener(new ChangeListener() {
		public void stateChanged(ChangeEvent e) {
			
			slider.addChangeListener(new ChangeListener() {
				public void stateChanged(ChangeEvent e) {
					
					changeImageMeasure();
				}
			});
		}
	});
	slider.setBounds(45, 276, 394, 47);
	panel.add(slider);
}

}

0

Podejrzewam, że problemem jest wielokrotna zmiana rozmiaru. Slider generuje wiele zdarzeń podczas przesuwania i każde jest obsługiwanie poprzez wykonanie operacji na obrazie. A powinno być to zrobione tylko dla pozycji slidera po zatrzymaniu. Zdaje się, że jest tam taka metoda, która pozwala w listenerze sprawdzić, czy użytkownik zakończył przesuwanie.
Dodaj jakiś log do stateChanged albo do changeImageMeasure i zobacz ile razy się wypisuje, bo powinien tylko raz.

1 użytkowników online, w tym zalogowanych: 0, gości: 1