0

「次へ」と「前へ」の JButton を使用して表示できる小さな画像ギャラリーがあります。正しく動作します。

私がやりたいことは、クリックしたときに表示される画像に長方形(塗りつぶしなしのフレームのみ)をペイントすることです。たとえば、ポイント (230,150) をクリックすると、四角形が左下の角度でそのポイントに表示されます。

これは私のコードです。多くのことを試しましたが、何も機能しませんでした:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Rectangle2D;
import java.awt.Image;

public class rectOnGallery extends JFrame{

private static final long serialVersionUID = 1L;

private ImageIcon myImage1;
private ImageIcon myImage2;
private ImageIcon myImage3;
private ImageIcon myImage4;
JPanel ImageGallery = new JPanel();
private ImageIcon[] myImages = new ImageIcon[4];
private int curImageIndex=0;

int width;
int height;

public rectOnGallery(){

    double scale = 0.666667;
    width = (int) (scale * 612);
    height = (int) (scale * 792);

    myImage1 = new ImageIcon(((new ImageIcon("NewSign1.jpg")).getImage()).getScaledInstance(width, height, Image.SCALE_SMOOTH));
    myImage2 = new ImageIcon(((new ImageIcon("pdf2.jpg")).getImage()).getScaledInstance(width, height, Image.SCALE_SMOOTH));
    myImage3 = new ImageIcon(((new ImageIcon("pdfimg.jpg")).getImage()).getScaledInstance(width, height, Image.SCALE_SMOOTH));
    myImage4 = new ImageIcon(((new ImageIcon("images.jpg")).getImage()).getScaledInstance(width, height, Image.SCALE_SMOOTH));

    ImageGallery.add(new JLabel (myImage1));
    myImages[0]=myImage1;
    myImages[1]=myImage2;
    myImages[2]=myImage3;
    myImages[3]=myImage4;


     ImageGallery.addMouseListener(new MouseAdapter() {

         public void mouseClicked(MouseEvent evt) {
              if (myImages[curImageIndex] != null) {
                double x = (getWidth() - width) / 2;
                double y = (getHeight() - height) / 2;
                Rectangle2D.Double bounds = new Rectangle2D.Double(x, y, width, height);
                if (bounds.contains(evt.getPoint())) {
                  System.out.println("You clicked on " + evt.getX() + " x " + evt.getY());

                 **** HERE GOES SOMETHING THAT WRITES THE FRAME IN THE
                 **** POSITION (ent.getX() , evt.getY())

                }   
              }
         }
     });

     add(ImageGallery, BorderLayout.NORTH);

     JButton PREVIOUS = new JButton ("Previous");
     JButton NEXT = new JButton ("Next");

     JPanel buttons = new JPanel();
     buttons.setLayout(new GridLayout(1,4));
     buttons.add(PREVIOUS);
     buttons.add(NEXT);

     add(buttons, BorderLayout.SOUTH);

     //register listener
     PreviousButtonListener PreviousButton = new PreviousButtonListener ();
     NextButtonListener NextButton = new NextButtonListener ();

     //add listeners to corresponding componenets 
     PREVIOUS.addActionListener(PreviousButton);
     NEXT.addActionListener(NextButton);
}

private class PreviousButtonListener implements ActionListener {

    public void actionPerformed(ActionEvent e){

        if(curImageIndex>0 && curImageIndex <= 3){              
            ImageGallery.remove(0);
            curImageIndex -- ;
            ImageIcon TheImage= myImages[curImageIndex];
            ImageGallery.add(new JLabel (TheImage));
            ImageGallery.validate();
            ImageGallery.repaint(); 
        }
        else{
            ImageGallery.remove(0);
            ImageGallery.add(new JLabel (myImage1));
            curImageIndex=0;
            ImageGallery.validate();
            ImageGallery.repaint();
        }
    }
}

private class NextButtonListener implements ActionListener {

    public void actionPerformed(ActionEvent e){

        if(curImageIndex>=0 && curImageIndex < 3){
            ImageGallery.remove(0);
            curImageIndex ++ ;
            ImageIcon TheImage= myImages[curImageIndex];
            ImageGallery.add(new JLabel (TheImage));

            ImageGallery.validate();
            ImageGallery.repaint(); 
        }
        else{  
            ImageGallery.remove(0);
            ImageGallery.add(new JLabel (myImage4));
            curImageIndex=3;
            ImageGallery.validate();
            ImageGallery.repaint();
        }
    }
}

public static void main (String [] args){

    provaPosFirma frame = new provaPosFirma();

    frame.setSize(500, 600);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
}
}

別の方法として、他の画像に長方形の画像をペイントしようとしましたが、これはうまくいきませんでした。

私は何か間違ったことをしていることを知っています. 表示された上に四角形または別の長方形の画像を描画するのを手伝っていただければ、とにかく感謝します。

前もって感謝します

4

1 に答える 1

3

これを行うには、JPanel のカスタム サブクラスを作成し、「ImageGallery」の代わりにそれを使用します。次に、そのクラスで、paintComponent メソッドをオーバーライドして、必要な四角形を描画します。したがって、コードは次のようになります。

class ImageGalleryPanel extends JPanel{
    private Point rectPosition = null;
    private Dimension rectSize; //Set the size of the rect

    public void setRectPosition(Point p){
        rectPosition = p;
    }

    private void drawRect(Graphics g){
        if(rectPosition != null){
            g.drawRect(rectPosition.x, rectPosition.y, rectSize.width, rectSize.height);
        }
    }

    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        drawRect(g);
    }
}

JPanel の「ImageGallery」をこのクラスに置き換え、描画する四角形のサイズを割り当てます。長方形を描画するためのコメントがある場所に、これらの行を追加します-

ImageGallery.setRectPosition(evt.getPoint());
ImageGallery.repaint();

このコードはテストしていないので、タイプミスがあるかもしれませんが、JPanel に描画するときに必要な基本的な考え方です。パネルのペイント メソッドをオーバーライドします。次に、それに描画したい場合は、そのプロパティを本来あるべきものに変更し、repaint() を呼び出します。直接描画しようとすると、 repaint メソッドが自動的に呼び出され、行った変更が上書きされます。

編集 - 画像が四角形の上に描画されるのを避けるために、できることがいくつかあります。paintComponent メソッドを「paint」または「paintChildren」に変更し、それに合わせて super.paintComponent 関数呼び出しを変更できます。これは迅速かつ簡単ですが、悪い習慣と見なされます。JPanel の paintComponent をオーバーライドする代わりに、追加しようとしている JLabel をオーバーライドするのが有効だと私が考えるもう 1 つの方法です。コードはまったく同じで、代わりに JLabel に適用するだけです。

于 2013-06-20T15:28:48.497 に答える