Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPanel大小问题,当我调整大小时_Java_Image_Swing_Resize_Jpanel - Fatal编程技术网

Java JPanel大小问题,当我调整大小时

Java JPanel大小问题,当我调整大小时,java,image,swing,resize,jpanel,Java,Image,Swing,Resize,Jpanel,我有以下代码来显示和绘制带有缓冲图像的JPanel 我将其大小设置为缓冲图像的大小,但实际上并没有设置 当我调整大小时,它会显示滚动条,但当我调整JFrame的大小大于面板大小或buffereImage时,当我在面板大小之外单击时,仍然会收到鼠标事件 我省略了额外的代码 public class PaintFrame extends JFrame{ private JScrollPane paintScrollPane; private Paint

我有以下代码来显示和绘制带有缓冲图像的
JPanel

我将其大小设置为缓冲图像的大小,但实际上并没有设置

当我调整大小时,它会显示滚动条,但当我调整
JFrame
的大小大于面板大小或
buffereImage
时,当我在面板大小之外单击时,仍然会收到鼠标事件

我省略了额外的代码

    public class PaintFrame extends JFrame{    
        private JScrollPane paintScrollPane;
        private Painter painter;
        private JPanel paintPanel;
        private BufferedImage paintImage;
        private Color forgroundColor;

        public PaintFrame(){
            super("Paint");
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            setPreferredSize(new Dimension(800, 600));
            setLocationByPlatform(true);
            getContentPane().setBackground(Color.black);

            paintImage = new BufferedImage(700, 500, BufferedImage.TYPE_3BYTE_BGR);

            paintPanel = new JPanel(){
                @Override
                public void paint(Graphics g){
                    if(paintImage != null){
                        g.drawImage(paintImage, 0, 0, paintImage.getWidth(), paintImage.getHeight(), null);
                    }
                }
            };
            paintPanel.setBackground(Color.white);
            paintPanel.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent me){
                    mouseClickedOnPaint(me);
                }
            });
            paintPanel.setPreferredSize(new Dimension(paintImage.getWidth(), paintImage.getHeight()));
            paintScrollPane = new JScrollPane(paintPanel, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

            getContentPane().add(paintScrollPane);

            pack();
        }
}

正如Quillom所指出的,
LayoutManager
s可以根据实现的需要选择忽略
getPreferredSize

如果您所担心的只是鼠标事件,那么您可以通过确定鼠标事件是否在图像中单击来过滤掉它们

否则,您需要找到一个布局管理器,更好地满足您的需要

下面的示例仅确定鼠标事件是否在图像的范围内

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class ClickImage {

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

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

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

    public class ImagePane extends JPanel {

        private BufferedImage background;
        private List<Point> goodPoints;
        private List<Point> badPoints;

        public ImagePane() {
            try {
                background = ImageIO.read(new File("/Volumes/Disk02/Dropbox/MegaTokyo/url.jpg"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            goodPoints = new ArrayList<>(5);
            badPoints = new ArrayList<>(5);
            addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    if (getImageBounds().contains(e.getPoint())) {
                        goodPoints.add(e.getPoint());
                    } else {
                        badPoints.add(e.getPoint());
                    }
                    repaint();
                }
            });
        }

        @Override
        public void invalidate() {
            goodPoints.clear();
            badPoints.clear();
            super.invalidate();
        }

        public Rectangle getImageBounds() {
            Rectangle bounds = new Rectangle();
            if (background != null) {
                bounds.x = (getWidth() - background.getWidth()) / 2;
                bounds.y = (getHeight() - background.getHeight()) / 2;
                bounds.width = background.getWidth();
                bounds.height = background.getHeight();
            }

            return bounds;            
        }

        @Override
        public Dimension getPreferredSize() {
            return background == null ? super.getPreferredSize() : getImageBounds().getSize();
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (background != null) {
                Graphics2D g2d = (Graphics2D) g.create();
                Rectangle bounds = getImageBounds();
                g2d.drawImage(background, bounds.x, bounds.y, this);

                g2d.setColor(Color.GREEN);
                drawPoints(g2d, goodPoints);
                g2d.setColor(Color.RED);
                drawPoints(g2d, badPoints);

                g2d.dispose();
            }
        }

        protected void drawPoints(Graphics2D g2d, List<Point> points) {
            for (Point p : points) {
                g2d.drawLine(p.x - 4, p.y - 4, p.x + 4, p.y + 4);
                g2d.drawLine(p.x + 4, p.y - 4, p.x - 4, p.y + 4);
            }
        }
    }
}

导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Point;
导入java.awt.Rectangle;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.List;
导入javax.imageio.imageio;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共类ClickImage{
公共静态void main(字符串[]args){
新建ClickImage();
}
公共ClickImage(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
}
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的BorderLayout());
frame.add(新的ImagePane());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类ImagePane扩展了JPanel{
私有缓冲图像背景;
私人物品清单;
私人名单缺点;
公共图像窗格(){
试一试{
background=ImageIO.read(新文件(“/Volumes/Disk02/Dropbox/MegaTokyo/url.jpg”);
}捕获(IOEX异常){
例如printStackTrace();
}
goodPoints=新阵列列表(5);
坏点=新阵列列表(5);
addMouseListener(新的MouseAdapter(){
@凌驾
公共无效mouseClicked(MouseEvent e){
如果(getImageBounds().contains)(如getPoint()){
添加(例如getPoint());
}否则{
添加(例如getPoint());
}
重新油漆();
}
});
}
@凌驾
公共无效{
goodPoints.clear();
缺点。清除();
super.invalidate();
}
公共矩形getImageBounds(){
矩形边界=新矩形();
如果(背景!=null){
bounds.x=(getWidth()-background.getWidth())/2;
bounds.y=(getHeight()-background.getHeight())/2;
bounds.width=background.getWidth();
bounds.height=background.getHeight();
}
返回边界;
}
@凌驾
公共维度getPreferredSize(){
返回背景==null?super.getPreferredSize():getImageBounds().getSize();
}
@凌驾
受保护组件(图形g){
超级组件(g);
如果(背景!=null){
Graphics2D g2d=(Graphics2D)g.create();
矩形边界=getImageBounds();
g2d.drawImage(背景,bounds.x,bounds.y,this);
g2d.setColor(Color.GREEN);
提款点(g2d、goodPoints);
g2d.setColor(Color.RED);
提款点(g2d、坏点);
g2d.dispose();
}
}
受保护的空心绘图点(Graphics2D g2d,列表点){
对于(点p:点){
g2d.绘制线(p.x-4、p.y-4、p.x+4、p.y+4);
g2d.绘制线(p.x+4,p.y-4,p.x-4,p.y+4);
}
}
}
}

您可能还想看看

在添加导入并注释掉
Painter
之后,我仍然在
mouseClickedOnPaint(me)上遇到一个错误。为了更快地获得更好的帮助,请发布一条消息。@AndrewThompson您是否已将其粘贴在粘贴上?:P@Quirliom最后一部分?当然“什么,你觉得我胖吗?”安德烈·霍姆普森无意冒犯,只是一个有趣的观察。@Quilliom Andrew实际上是一个机器人,能自动响应所有标有Swing的帖子。我们很感激;)