gpt4 book ai didi

java - 如果 JPanel 大于其父级,则调整其大小

转载 作者:太空宇宙 更新时间:2023-11-04 07:56:22 30 4
gpt4 key购买 nike

我有一个 JScrollPanel,我将一个包含图像的 JPanel 添加到 JScrollPanel 中,它可以工作,但如果 JPanel 中的图像在宽度、高度或两者上都大于 JScrollPanel,则面板的大小会调整为大约 20x20。它为什么要这么做?我在 JScrollPanel 的视口(viewport)上使用 GridBagLayout。我期望的是,如果 JPanel 大于 JScrollPanel 它会添加滚动条,但事实并非如此。有什么建议吗?

private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
WebFileChooser wfc = null;
if(wfc == null){
wfc = new WebFileChooser(this, "Open an Image");
wfc.setSelectionMode(SelectionMode.SINGLE_SELECTION);
wfc.setAvailableFilter(GlobalConstants.IMAGES_AND_FOLDERS_FILTER);
wfc.setChooseFilter(GlobalConstants.IMAGES_FILTER);
wfc.setCurrentDirectory("/Users/Ryan/Desktop");
}
wfc.setVisible(true);

if(wfc.getResult() == StyleConstants.OK_OPTION){
String file = wfc.getSelectedFile().getPath();
try{
imagePane.remove(canvas);
}catch(Exception e){
}
canvas = new Canvas();
canvas.setVisible(true);
canvas.setImage(file);
//imagePane.getViewport().setLayout(new GridBagLayout());
canvas.setSizeFromLoaded();
imagePane.getViewport().add(canvas);
imagePane.repaint();
imagePane.revalidate();
}
}

这是 Canvas 类:

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package pocketshop;

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import pocketshop.util.ImageSync;

/**
*
* @author Ryan
*/
public class Canvas extends CanvasShadow{

public static BufferedImage image = null, preview = null;
public static int width, height;

public void setImage(String filename){
try{
Canvas.image = ImageIO.read(new File(filename));
Canvas.width = image.getWidth();
Canvas.height = image.getHeight();
ImageSync.originalPixels = new int[width * height];
ImageSync.previewPixels = new int[width * height];
Canvas.image.getRGB(0, 0, width, height, ImageSync.originalPixels, 0, width);
}catch(IOException e){
}
}

public static void setImage(BufferedImage image){
Canvas.image = image;
Canvas.width = image.getWidth();
Canvas.height = image.getHeight();
ImageSync.originalPixels = new int[width * height];
ImageSync.previewPixels = new int[width * height];
Canvas.image.getRGB(0, 0, width, height, ImageSync.originalPixels, 0, width);
}

public static void setPreview(BufferedImage img, Container parent){
preview = img;
parent.repaint();
}

public static BufferedImage deepCopy(){
ColorModel cm = Canvas.image.getColorModel();
boolean isAlphaPremultiplied = cm.isAlphaPremultiplied();
WritableRaster raster = Canvas.image.copyData(null);
return new BufferedImage(cm, raster, isAlphaPremultiplied, null);
}

public void setSizeFromLoaded(){
try{
this.setPreferredSize(new Dimension(Canvas.width + 10, Canvas.height + 10));
this.setSize(Canvas.width + 10, Canvas.height + 10);
}catch(Exception e){
e.getMessage();
}
}

@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
if(Canvas.preview != null){
g.drawImage(Canvas.preview, 5, 5, width, height, Color.black, null);
}else{
g.drawImage(Canvas.image, 5, 5, width, height, Color.black, null);
}
}
}

这是 CanvasShadow 类:

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package pocketshop;

import java.awt.Color;
import org.jdesktop.swingx.JXPanel;
import org.jdesktop.swingx.border.DropShadowBorder;

public class CanvasShadow extends JXPanel{

public CanvasShadow(){
DropShadowBorder shadow = new DropShadowBorder();
shadow.setShadowColor(Color.BLACK);
shadow.setShowLeftShadow(true);
shadow.setShowRightShadow(true);
shadow.setShowBottomShadow(true);
shadow.setShowTopShadow(true);
this.setBorder(shadow);

float[] hsb = new float[3];

Color.RGBtoHSB(255, 255, 255, hsb);

this.setBackground(Color.getHSBColor(hsb[0], hsb[1], hsb[2]));
}
}

enter image description here

这是实际图像:http://images2.fanpop.com/images/photos/4800000/Beach-beaches-4843817-1280-800.jpg

最佳答案

我已经告诉过你去掉那个 GridBagLayout。在 JScrollPane 上设置布局将调整面板大小,使其永远不会大于容器。您的面板必须自行布局,使其与图像的大小相同,以便 JScrollPane 发现它太大而无法显示。只有这样 JScrollPane 才会添加滚动条。因此,如果您的图像是 2000x2000,那么您的面板需要将其首选尺寸设置为 2000x2000,并且表现得好像它可以那么大。 JScrollPane 将完成所有繁重的裁剪工作,并确保面板仅根据滚动条渲染可见部分。如果您的面板始终与 JScrollPane 的视口(viewport)大小相同,则滚动 Pane 认为它适合并且不需要滚动条。

更新:快速谷歌搜索揭示了答案:http://chaosinmotion.com/blog/?p=168

关于java - 如果 JPanel 大于其父级,则调整其大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13570971/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com