Sadece birkaç BufferedImages görüntüleyebilecek ve birbirinizin üzerine koyabileceğiniz küçük bir başlangıç programı yazmaya çalışıyorum. Ancak ekrandaki görüntülerin doğru şekilde üst üste gelmesi için sorun yaşıyorum.BufferedImages'm neden doğru şekilde çakışmıyor?
Fare imlecinin bulunduğu konum içinde birkaç görüntü olsa bile, fare imleciyle seçilen görüntünün taşınan dosya olmasını istiyorum.
Yapmakta zorlandığım şey budur; Üstteki görüntüyü yalnızca 1 görüntü altında olduğunda seçer, bu nedenle yalnızca iki görüntü yığıldığında çalışır. Bununla birlikte, her biri bir konum paylaşan yığılmış veya daha fazla üç görüntü varsa ve görüntüyü üste taşımaya çalışırsam, seçili olanın ya da yalnızca (rastgele) herhangi bir şekilde göründüğü gibi yığının alt tarafındaki yığını seçer. görüntü ama hareket etmek için üst olanı. Bu neden? Birçoğu yığılmış olsa bile, üst tarafın tıklandığında seçili kalmasını istiyorum.
Bu
benim kodudur: Bu kod kötü iseimport javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
class Image {
private int x;
private int y;
private BufferedImage front, back;
private StringBuffer filepath;
private boolean isTurned;
public Image(int x, int y, String filepath) throws IOException {
this.filepath = new StringBuffer(filepath);
this.x = x;
this.y = y;
this.front = ImageIO.read(new File(String.valueOf(filepath)));
this.back = ImageIO.read(new File(String.valueOf("images/back.gif")));
}
public void draw(Graphics g){
g.drawImage(front, x, y, null);
}
public void undraw (Graphics g, Color c){
g.setColor(c);
g.fillRect(x,y, front.getWidth(), front.getHeight());
}
public boolean containsXY (int x, int y){
if ((this.x <= x) && (x <= (this.x+this.front.getWidth())) && (this.y <= y) && (y <= (this.y+this.front.getHeight())) ){
return true;
}
return false;
}
public void move (Graphics g, int x, int y) {
undraw(g, Color.WHITE);
this.x = x-(this.front.getWidth()/2);
this.y = y-(this.front.getHeight()/2);
draw(g);
}
public String getFilePath(){
return String.valueOf(filepath);
}
public int getX(){
return x;
}
public int getY(){
return y;
}
public void turn(Graphics g) throws IOException {
if (isTurned) {
undraw(g, Color.WHITE);
front = ImageIO.read(new File(String.valueOf(filepath)));
draw(g);
isTurned = false;
}
else {
undraw(g, Color.WHITE);
front = back;
draw(g);
isTurned = true;
}
}
}
class PaintSurface extends JLabel implements MouseListener, MouseMotionListener {
private int x, y;
private JButton browse;
private Collection<Image> images = new ArrayList<Image>();
private final JFileChooser fc = new JFileChooser();
private Image selected;
private boolean drawOnce;
private Image[] initialImages = new Image[8];
public PaintSurface(JButton b){
browse = b;
addMouseListener(this);
addMouseMotionListener(this);
browse.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int x = fc.showOpenDialog(browse);
if (x == JFileChooser.APPROVE_OPTION){
try {
buttonPressed(fc);
} catch (IOException e1) {
e1.printStackTrace();
}
}
else if (x ==JFileChooser.CANCEL_OPTION){
System.out.println("No file selected.");
}
}
});
}
public void paintComponent (Graphics g){
super.paintComponent(g);
if (!drawOnce) {
try {
drawStartUpImages();
} catch (IOException e) {
e.printStackTrace();
}
}
for (Image i: images){
i.draw(g);
}
drawOnce = true;
}
public void drawStartUpImages() throws IOException {
initialImages[0] = new Image(0, 100, "images/blab.gif");
initialImages[1] = new Image(100, 100, "images/fred.gif");
initialImages[2] = new Image(200, 100, "images/gira.gif");
initialImages[3] = new Image(300, 100, "images/katt.gif");
initialImages[4] = new Image(0, 300, "images/pear.gif");
initialImages[5] = new Image(100, 300, "images/peli.gif");
initialImages[6] = new Image(200, 300, "images/stef.gif");
initialImages[7] = new Image(300, 300, "images/stru.gif");
for (int i = 0; i<8; i++) {
addImage(initialImages[i]);
repaint();
}
}
public void addImage(Image i){
images.add(i);
Graphics g = getGraphics();
i.draw(g);
}
public void buttonPressed(JFileChooser fc) throws IOException {
File selectedFile = fc.getSelectedFile();
String filepath = String.valueOf(selectedFile.getAbsolutePath());
Image i = new Image(x, y, filepath);
selected = i;
addImage(i);
repaint();
}
public Image findImage(int x, int y){
for (Image i: images){
if (i.containsXY(x, y)){
return i;
}
}
return null;
}
public void moveImage (Image i, int x, int y) { //
i.move(getGraphics(), x, y);
}
public boolean removeImage(Image i){
Graphics g = getGraphics();
i.undraw(g, Color.WHITE);
return images.remove(i);
}
@Override
public void mouseClicked(MouseEvent e) {
x = e.getX();
y = e.getY();
//selected = findImage(e.getX(), e.getY());
if (selected != null && findImage(x,y) == selected) {
Graphics g = getGraphics();
try {
selected.turn(g);
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
@Override
public void mousePressed(MouseEvent e) {
if (findImage(e.getX(), e.getY()) != null){
selected = findImage(e.getX(), e.getY());
}
if ((findImage(e.getX(), e.getY()) != null && findImage(e.getX(), e.getY()) == selected)){
removeImage(selected);
addImage(selected);
}
if ((findImage(e.getX(), e.getY()) != null && findImage(e.getX(), e.getY()) != selected)) {
try {
selected = new Image(findImage(e.getX(), e.getY()).getX(), findImage(e.getX(), e.getY()).getY(), findImage(e.getX(), e.getY()).getFilePath());
removeImage(findImage(e.getX(), e.getY()));
addImage(selected);
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
@Override
public void mouseDragged(MouseEvent e) {
int x = e.getX();
int y = e.getY();
if (selected != null) {
moveImage(selected,x,y);
repaint();
}
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mouseMoved(MouseEvent e) {
}
}
class GUI extends JFrame {
public GUI(){
super("ImageApp");
JLabel instruction = new JLabel("Clicking on the screen will set the location for the next added image.");
JButton browse = new JButton("Add image");
JButton line = new JButton("Line up");
JPanel panel1 = new JPanel();
JLabel panel2 = new PaintSurface(browse);
panel1.setLayout(null);
panel2.setBackground(Color.WHITE);
instruction.setAlignmentX(CENTER_ALIGNMENT);
getContentPane().setBackground(Color.WHITE);
getContentPane().add("North", instruction);
getContentPane().add("South", browse);
add(panel2);
setBounds(300,0,800,800);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
setVisible(true);
}
}
public class PhotoApp extends GUI {
public static void main (String[] args){
GUI PhotoApplication = new GUI();
}
}
Affet beni, sadece düzgün çalışması için çakışma almaya çalışıyorum. Bence sorun PaintSurface sınıfında, Mouselistener MousePressed ve MouseDragged işlevleri içinde ortaya çıkıyor. Çok çalıştım ama üstteki resmi başka bir resim görüntülediğinde üst resmi seçmeye devam edemiyorum. Altından birini seçer ve en üstteki olarak yeniden çizer. Söylediğim gibi, sadece iki resim birbirinin üzerine yığıldığında çalışır, ancak o zaman tıklattığımda altındakileri seçmez. Çakışmayı nasıl doğru şekilde çalıştığımı bilen var mı?
Yardımlarınız için teşekkür ederiz, ancak hala çalışmıyor. Söylediğin yönteme söylediklerimi değiştirdim ve şimdi sadece 2 resim altta bir tane yığıldığında bile seçilen resmi değiştiriyor? – user5846939
Bunu yaptım: 'if (findImage (e.getX(), e.getY()) == null { dönüş; } eğer ((findImage (e.getX), e.getY()) == selected)) { removeImage (seçili); addImage (selected); Başka } { deneyin { seçilen = Yeni Resim (findImage (e.getX(), e.getY()). GetX(), findImage (e.getX(), e.getY()). getY(), findImage (e.getX(), e.getY()) getFilePath()); removeImage (findImage (e.getX(), e.getY())); addImage (selected); } catch (IOException e1) { e1.printStackTrace(); } } ' – user5846939
değişiklik findImage aşağıdaki yöntem konum: 'halka Resim findImage (int x, int y) {için (int i = images.size() - 1; i> = 0; i -) { (i.containsXY (x, y)) {ii dönüşü; } } dönüş null; } ' – Dimi