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的帖子。我们很感激;)