kein Scrollen nach affinertransformation bei mouse dragged

pitsoft21

Mitglied
Hallo ich habe mit jdk8 ein JFrame darin ein JScrollPane und darin ein JPanel. Dafür habe ich die paint Methode überschrieben und mache folgendes:
ich lese vorher ein Bild ein .Dieses BufferedImage wird dann per affiner Transformation gedreht und verschoben. Dann will ich mit der Mouse einen Fangrahmen bilden um das Bild neu zuzuschneiden. Bis dahin geht es auch. Das Bild ist größer als das Panel und es hat in x und y Scrollbars. Ziehe ich aber den Fangrahmen über den Fensterrand scrollt das Bild nicht mit. Auch bei Vollbildanzeige ist das so. Leider kann ich z.Z. keinen Code angeben, da das Projekt auf einem Rechner ist, der jetzt nicht zugreifbar ist. Warum scrollt das Bild nicht mit, wenn die Mouse schon unterhalb des Fensters ist?
 
[CODE lang="java" title="Der Code zu meiner Frage - Wie kriege ich das Fangrect rechtwinklig dargestellt?"]package pitsoft.image_cutter;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Stack;

import javax.imageio.ImageIO;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;




/** Diese Klasse soll Images rotieren und zuschneiden
*
* @author prog
*
*/
public class ImageCutter extends JFrame implements WindowListener,MouseListener,MouseMotionListener,ActionListener
{

String[] args=null;
MediaTracker mt=new MediaTracker(this);
BufferedImage img=null;
JFileChooser fc=null;
String openSpec=null;
JPanel pnlTop=null;
JScrollPane spImage=null;
JPanel pnlImage=null;

JMenuBar menubar=null;
MenuListener menuListener=null;
JMenu menuDatei=null;

JMenuItem itemOpenImage=null;
JMenuItem itemSaveAs=null;
JMenuItem itemExit=null;

JMenu menuPicture=null;
JMenuItem itemPictureAtLinePrepare=null;
JMenuItem itemPictureAtLineDoit=null;

Point mouseClick=null;
Point mouseDrag=null;
AffineTransform atrRotate=null;
AffineTransform atrMove=null;
Stack pointStack=new Stack();
//Fang
JCheckBox cbFang=null;
JCheckBox cbMove=null;



public ImageCutter(String[] _args)
{
super();
this.args=_args;
createGui();
fc=new JFileChooser();


}

public void createGui()
{
Container cp=this.getContentPane();
cp.setLayout(new BorderLayout());
this.setSize(800,600);


pnlTop=new JPanel();
cbFang=new JCheckBox("Fang");
pnlTop.add(cbFang);

cbMove=new JCheckBox("Move");
pnlTop.add(cbMove);

spImage=new JScrollPane();

pnlImage=new JPanel()
{
public void paint(Graphics gr)
{
if (gr !=null)
{
Graphics2D gr2=(Graphics2D) gr;
super.paint(gr2);

if (img!=null)
{

// gr2.transform(atrZoom);

if (atrMove !=null)
{
gr2.transform(atrMove);
}
if (atrRotate !=null)
{
gr2.transform(atrRotate);
}
gr2.drawImage(img,0,0,Color.WHITE,null );

}
if (cbFang.isSelected() && mouseClick !=null && mouseDrag !=null)
{
gr2.setColor(Color.RED);
gr2.drawRect(mouseClick.x,mouseClick.y,mouseDrag.x-mouseClick.x,mouseDrag.y-mouseClick.y);
spImage.getVerticalScrollBar().setValue(spImage.getVerticalScrollBar().getMaximum());


}
}
}};

cp.add(pnlTop,BorderLayout.NORTH);
spImage.getViewport().add(pnlImage);
cp.add(spImage,BorderLayout.CENTER);

this.addWindowListener(this);
pnlImage.addMouseListener(this);
pnlImage.addMouseMotionListener(this);
createMenu();
setVisible(true);
}

private void createMenu()
{
//Menu
menubar=new JMenuBar();
menuListener=new MenuListener();
menuDatei=new JMenu("Datei");
itemOpenImage=new JMenuItem("Open a Image File");
// itemOpen=new JMenuItem("Open a Image File");
itemSaveAs=new JMenuItem("SaveAs");
itemExit=new JMenuItem("Exit");

menuDatei.add(itemOpenImage);
menuDatei.add(itemSaveAs);
menuDatei.add(itemExit);

menuPicture=new JMenu("Picture");
itemPictureAtLineDoit=new JMenuItem("Order On Line Doit");
itemPictureAtLinePrepare=new JMenuItem("Prepare Order On Line");
menuPicture.add(itemPictureAtLinePrepare);
menuPicture.add(itemPictureAtLineDoit);

menubar.add(menuDatei);
menubar.add(menuPicture);
this.setJMenuBar(menubar);
//Actions
itemOpenImage.addActionListener(menuListener);
itemSaveAs.addActionListener(menuListener);
/* itemOpen.addActionListener(menuListener);

itemLz.addActionListener(menuListener);
itemDelFang.addActionListener(menuListener);
itemAddPad.addActionListener(menuListener);
itemDelSelLz.addActionListener(menuListener);
itemGlueFang.addActionListener(menuListener);
itemGridX.addActionListener(menuListener);
itemGridY.addActionListener(menuListener);
itemInfo.addActionListener(menuListener);*/
itemPictureAtLinePrepare.addActionListener(menuListener);
itemPictureAtLineDoit.addActionListener(menuListener);
itemExit.addActionListener(menuListener);
// itemShowBe.addActionListener(menuListener);

}


private Image loadImage(String file)
{
Image img=null;
try
{
img =ImageIO.read(new File(file));
mt.addImage(img,0);
try
{
mt.waitForAll();
mt.checkAll(true);
System.out.println( "LoadImage" +file+ "x="+img.getWidth(null)+" y="+img.getHeight(null));

} catch (InterruptedException e) {e.printStackTrace(); }
}
catch (IOException e) { e.printStackTrace(); }
return img;
}

public double toRadiant(int inGrad )
{
//360 Grad =2 PI
double d= (inGrad*Math.PI*2)/360;
// System.out.println("Aus "+inGrad+" wird Bogenmass "+d);
return d;
}

private void saveImage(BufferedImage img,String name)
{
try {
boolean state=ImageIO.write(img, "jpg", new File(name));
} catch (IOException e) {

e.printStackTrace();
}
}




public static void main(String[] args)
{
new ImageCutter(args);

}

@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub

}

@Override
public void mouseDragged(MouseEvent me)
{
System.out.println("Mouse Dragged at "+me.getX()+"x"+me.getY());
this.mouseDrag=me.getPoint();
if (cbMove.isSelected())
{
atrMove=AffineTransform.getTranslateInstance(this.mouseDrag.x-mouseClick.x,this.mouseDrag.y-mouseClick.y);
}
repaint();
}

@Override
public void mouseMoved(MouseEvent arg0) {
// TODO Auto-generated method stub

}

@Override
public void mouseClicked(MouseEvent me)
{


}

@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub

}

@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub

}

@Override
public void mousePressed(MouseEvent me) {
this.mouseClick=me.getPoint();
System.out.println("Mouse Pressed at "+mouseClick.x+"x"+mouseClick.y);
pointStack.push(mouseClick);

}

@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub

}

@Override
public void windowActivated(WindowEvent arg0) {
// TODO Auto-generated method stub

}

@Override
public void windowClosed(WindowEvent arg0) {
// TODO Auto-generated method stub

}

@Override
public void windowClosing(WindowEvent arg0) {
// TODO Auto-generated method stub

}

@Override
public void windowDeactivated(WindowEvent arg0) {
// TODO Auto-generated method stub

}

@Override
public void windowDeiconified(WindowEvent arg0) {
// TODO Auto-generated method stub

}

@Override
public void windowIconified(WindowEvent arg0) {
// TODO Auto-generated method stub

}

@Override
public void windowOpened(WindowEvent arg0) {
// TODO Auto-generated method stub

}

//#########################################################################
/*
* Handelt alle Actionen der MenuBar
*/
private class MenuListener implements ActionListener
{


public void actionPerformed(ActionEvent menuEvent)
{
Object o=menuEvent.getSource();
if (o==itemOpenImage)
{
fc=new JFileChooser();
fc.setDialogTitle("Open a Image File");
fc.setFileSelectionMode(JFileChooser.FILES_ONLY);
fc.setCurrentDirectory(new File("."));
int erg=fc.showOpenDialog(ImageCutter.this);
if (erg==JFileChooser.APPROVE_OPTION)
{
openSpec=fc.getSelectedFile().getAbsolutePath();
img=(BufferedImage) loadImage(openSpec);
pnlImage.setSize(img.getWidth(null),img.getHeight(null));
pnlImage.setPreferredSize(new Dimension(img.getWidth(null),img.getHeight(null)));


}


}//
else if (o==itemSaveAs)
{
fc.setDialogTitle("Save Layout to File");
fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
fc.setCurrentDirectory(new File("."));
int erg=fc.showSaveDialog(ImageCutter.this);

if (erg==JFileChooser.APPROVE_OPTION)
{
String saveSpec=fc.getSelectedFile().getAbsolutePath();
saveImage(img,saveSpec);
}
}

else if (o==itemPictureAtLinePrepare)
{
pointStack.clear();
JOptionPane.showMessageDialog(ImageCutter.this, "Define Point 1 and 2");

}

else if (o==itemPictureAtLineDoit)
{
Point p1=null;
Point p2=null;
Point upper=null;
Point lower=null;

p1=(Point) pointStack.pop();
p2=(Point) pointStack.pop();


//waagerechtes Ausrichten der Linie
//den höheren Punkt finden
if (p1.y < p2.y)
{
upper=p1;
lower=p2;
}
else
{
upper=p2;
lower=p1;
}
double d1=upper.y-lower.y;
double d2=upper.x-lower.x;
double winkel=-1*Math.atan(d1/d2);

// rotation=45;
// double rad=toRadiant(30);
// atrRotate.transform(new Point(0,0), new Point(imgLs.getWidth()/2,imgLs.getHeight()/2));
atrRotate= AffineTransform.getRotateInstance(winkel,p1.getX(),p1.getY()); //Rotation um rad Grad um den Punkt x,y

repaint();





}
else if (o==itemExit)
{
dispose();
System.exit(0);
}
}
}
}
[/CODE]
 

Zurück
Oben