如何将图像放在左上角的滚动窗格中

问题描述 投票:0回答:1

我在滚动窗格中显示图像,当窗格小于图像时效果很好。当窗格大于图像时,图像垂直居中且水平左对齐。我希望图像左对齐和上对齐,这样所有额外的空间都在底部和右侧。

我尝试过使用 insets、setAlignmentY()、JScrollPaneLayout 中的方法,但不能影响图像的显示位置。

我找到的所有提示和文档都显示了如何在需要滚动条时处理窗格,而不是在不需要滚动条时。

我怀疑该行为是由使用 JLabel 显示图像引起的,因为 JLabel 似乎默认在左侧对齐并垂直居中。但我的所有尝试都没有成功地将图像推到顶部。

这是我用来创建上述图像的实际代码(从我的项目中显着减少,并为简洁起见删除了注释)。它应该编译并运行良好。

我在 Windows 10 计算机上的 Intellij Idea 社区版中使用 Java 15。

public class ShowPattern extends JFrame
{
    public static final int IMAGE_WIDTH = 340;
    public static final int IMAGE_HEIGHT = 272;
    protected BufferedImage fullSizeImage;
    private final JLabel imgLabel = new JLabel();

    public ShowPattern(int width, int height)
    {
        JPanel mainPanel = new JPanel(new BorderLayout());
        mainPanel.add(createImagePane(this.imgLabel), BorderLayout.CENTER);
        add(mainPanel);
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        this.setPreferredSize(new Dimension(width + 35, height + 60));
        this.setLocation(25, 25);
        pack();
    }
    public final void showMapImage(BufferedImage img, File file)
    {
        setTitle("Pattern from file " + file.getName());
        fullSizeImage = img;
        ImageIcon imgIcon = new ImageIcon(img);
        imgLabel.setIcon(imgIcon);
    }
    private JScrollPane createImagePane(JLabel image)
    {
        JScrollPane scrollPane = new JScrollPane(image);
        image.setAlignmentY(Component.TOP_ALIGNMENT);  //DOESN'T AFFECT PLACEMENT
        scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
        scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scrollPane.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
        return scrollPane;
    }
    public static void main( String[] args )
    {
        ShowPattern showPattern = new ShowPattern(IMAGE_WIDTH, IMAGE_HEIGHT);
        try
        {
            JFileChooser fileChooser = new JFileChooser();
            int status = fileChooser.showOpenDialog(null);
            fileChooser.setMultiSelectionEnabled(false);
            if (status == JFileChooser.APPROVE_OPTION)
            {
                File file = fileChooser.getSelectedFile();
                BufferedImage bimg;
                try
                {
                    bimg = ImageIO.read(file);
                    showPattern.showMapImage(bimg, file);
                    showPattern.setVisible(true);
                }
                catch (IOException ioe)
                {
                    throw new RuntimeException(ioe);
                }
            }
        }
        catch (Exception e)
        {
            System.out.println("Exception Loading Pattern " + e.getMessage());
        }
    }
}
java swing jscrollpane
1个回答
0
投票

利用

JLabel#setHorizontalAlignment
JLabel#setVerticalAlignment

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

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

    public Main() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    JFrame frame = new JFrame("Test");
                    frame.add(new TestPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                } catch (IOException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
    }

    protected class TestPane extends JPanel {

        public TestPane() throws IOException {
            setLayout(new BorderLayout());
            JLabel label = new JLabel(new ImageIcon(ImageIO.read(getClass().getResource("/resources/apple.png"))));
            label.setHorizontalAlignment(JLabel.LEADING);
            label.setVerticalAlignment(JLabel.TOP);

            add(new JScrollPane(label));
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.