JButton的acction监听器(Jbutton acction listener)

2019-10-19 05:07发布

我想创建一个表单。 有一个按钮,点击该按钮时,其中指明了照片将会出现。 我的问题是,当我点击该按钮,画面弹出如果光标通过形式边界,图像中消失。 这里是我的代码:

import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import static java.lang.Math.abs;
import static java.lang.Math.min;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;

public class SeamCarving extends JFrame
{     
public static void main(String[] args) throws IOException {
    final BufferedImage input = ImageIO.read(new File("path"));

    final BufferedImage[] toPaint = new BufferedImage[]{input};
    final Frame frame = new Frame("Seams") {

        @Override
        public void update(Graphics g) {
            final BufferedImage im = toPaint[0];
            if (im != null) {
                g.clearRect(0, 0, getWidth(), getHeight());
                g.drawImage(im, 0, 0, this);
            }
        }
    };
    frame.setSize(input.getWidth(), input.getHeight());
    frame.setVisible(true);
    frame.add(startButton);

    startButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            BufferedImage out = input;
            out = deleteVerticalSeam(out);
            toPaint[0] = out;
            frame.repaint();
            System.out.println("Do Something Clicked");
        }
    });
 }
}

Answer 1:

不要忽略update ,这不是画是如何在Swing实现。 尝试直接画到像一个顶层容器JFrame是有问题的最好的。

相反,先从一个JPanel并使用它paintComponent方法来代替。 请务必与super.paintComponent为好。

事实上,你很可能只是使用JLabel来显示图像,而不是。

看一眼;

  • 执行自定义绘制
  • 如何使用标签

更多细节

已更新,例如

我仍然认为一个JLabel是简单的解决办法,但我怎么知道。

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class SeamCarving {

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

    public SeamCarving() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private BufferedImage input;
        private BufferedImage[] toPaint;

        public TestPane() {
            try {
                input = ImageIO.read(new File("C:\\hold\\thumbnails\\2005-09-29-3957.jpeg"));
                toPaint = new BufferedImage[1];
            } catch (IOException ex) {
                ex.printStackTrace();
            }

            setLayout(new GridBagLayout());
            JButton startButton = new JButton("Start");
            startButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    BufferedImage out = input;
                    out = input; //deleteVerticalSeam(out);
                    toPaint[0] = out;
                    repaint();
                    System.out.println("Do Something Clicked");
                }
            });
            add(startButton);
        }

        @Override
        public Dimension getPreferredSize() {
            return input == null ? new Dimension(400, 400) : new Dimension(input.getWidth(), input.getHeight());
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (toPaint[0] != null) {
                Graphics2D g2d = (Graphics2D) g.create();
                g2d.drawImage(input, 0, 0, this);
                g2d.dispose();
            }
        }
    }

}

与覆盖问题updatepaint子系统可以选择避免调用和最终调用paint直接绕过你的画。

绘画还涉及到绘画中的子组件(如您的按钮)和边界,这你方便地调用不丢弃super.update



文章来源: Jbutton acction listener