如何让我的JPanel图像可扩展到窗口大小?

时间:2016-04-09 15:55:45

标签: java swing user-interface jframe jpanel

我正在使用具有可在左侧单击的图像列表的溢出面板,然后在右侧显示,我有一些大图像。我想使用窗口大小来缩放图像。因此,如果我将鼠标拖到EXIT按钮附近并使窗口变大,那么图片会变大,反之亦然。目前我的JFrame是固定的默认窗口大小,但即使这样,图像也太大而无法完全看到。

这是我的代码:

驱动程序类:

import java.awt.*;
import javax.swing.*;
public class PickImage
{
   //-----------------------------------------------------------------
   // Creates and displays a frame containing a split pane. The
   // user selects an image name from the list to be displayed.
   //-----------------------------------------------------------------
   public static void main(String[] args)
   {
      JFrame frame = new JFrame("Pick Image");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setSize(500, 300);

      JLabel imageLabel = new JLabel();
      JPanel imagePanel = new JPanel();
      imagePanel.add(imageLabel);
      imagePanel.setBackground(Color.white);

      ListPanel imageList = new ListPanel(imageLabel);

      JSplitPane sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
                                     imageList, imagePanel);

      sp.setOneTouchExpandable(true);

      frame.getContentPane().add(sp);

      frame.setVisible(true);
   }
}

ListPanel类:

import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;

public class ListPanel extends JPanel
{

   private JLabel label;
   private JList list;
   public ListPanel(JLabel imageLabel)
   {
      label = imageLabel;

      String[] fileNames = { "Denali2.jpg",
                             "denali.jpg",
                             "MauiLaPerouseBay.jpg",
                              };
      list = new JList(fileNames);
      list.addListSelectionListener(new ListListener());
      list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
      add(list);
      setBackground(Color.white);
}
   private class ListListener implements ListSelectionListener
   {
      public void valueChanged(ListSelectionEvent event)
      {
         if (list.isSelectionEmpty())
            label.setIcon(null);
         else
         {
            String fileName = (String)list.getSelectedValue();
            ImageIcon image = new ImageIcon(fileName);
            label.setIcon(image);
         }
      }
   }
}  

1 个答案:

答案 0 :(得分:0)

  JPanel imagePanel = new JPanel();
  imagePanel.add(imageLabel);

首先,JPanel默认使用FlowLayout。所以组件以其首选大小显示,因此标签永远不会调整大小。

因此,您需要更改布局,以便标签可以调整到可用空间:

  JPanel imagePanel = new JPanel( new BorderLayout() );

然后你可以使用Stretch Icon。此图标将自动缩放以填充其父组件中的可用空间。

另一种选择是自己在面板上绘制图像,然后在绘制图像时缩放图像。您需要覆盖面板的paintComponent()方法:

@Override
protected void paintComponent(Graphics g)
{
    super.paintComponent(g);
    Dimension d = getSize();
    g.drawImage(image, 0, 0, d.width, d.height, this);

}

阅读Custom Painting上Swing教程中的部分,了解更多信息和示例。

或者你可以查看Background Panel,这是这种方法的更好的实现。它允许您以原始大小绘制图像1)缩放,2)平铺3)。