我正在使用具有可在左侧单击的图像列表的溢出面板,然后在右侧显示,我有一些大图像。我想使用窗口大小来缩放图像。因此,如果我将鼠标拖到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);
}
}
}
}
答案 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)。