让我来解释一下我正在创建的项目。我需要一个图像列表,比如一个电影胶片,我可以将这个图像从这个带子拖到这个程序的另一个部分,然后用它做一些事情。这是最终的目标,但是现在我正在努力工作。我创建了一个存储图像信息并显示图像缩略图的FilmStripItem。我正在尝试创建一个FilmStripPanel,它是一个JScrollPane,它以Y轴形式显示每个缩略图。如何让我的图像面板不会在JScrollPane中变形和扭曲
现在我是Java Swing的新手了,我一直在试图弄清楚BorderLayout,BoxLayout,GridLayout和哪一个会是最好的,并且一直在撞墙。最重要的是,我似乎无法让他们中的任何一个以我想要的方式工作。以下是我正在使用的代码(我摆脱了课程中不必要的细节)。基本上,当我运行FilmStripPanel时,会挤压所有图像以适合窗口大小,并且不显示滚动条。我怎样才能让它显示图像(80x80)而不会压扁它们?
FilmStripItem.java
//Removed import info to save space
public class FilmStripItem extends JPanel {
private BufferedImage testImg;
private Image thumbnail;
public FilmStripItem(BufferedImage img) {
this.testImg = img;
this.thumbnail = img.getScaledInstance(80, 80, Image.SCALE_SMOOTH);
JPanel p = new JPanel();
p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
p.setMinimumSize(new Dimension(80, 80));
add(p);
}
public Image GetThumbnail() {
return this.thumbnail;
}
@Override
public void paintComponent(Graphics g) {
g.drawImage(this.thumbnail, 0, 0, null);
}
public static void main(String[] ARGS) {
try {
//Removed look and layout info
} catch (Exception ex) {
Logger.getLogger("Demo").log(Level.WARNING,
"loading CuiLookAndFeel failed", ex);
}
JFrame f = new JFrame("FilmStripItem");
final FilmStripItem fi = new FilmStripItem();
f.setContentPane(fi);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setBounds(10, 10, 128, 128);
f.setVisible(true);
}
}
FilmStripPanel.java
//import info removed to save space
public class FilmStripPanel extends JPanel {
private static final int ITEM_COUNT = 15;
private ArrayList<FilmStripItem> filmItems;
public FilmStripPanel() {
JPanel p = new JPanel(new GridLayout(0, 1));
setLayout(new GridLayout(1, 1));
filmItems = new ArrayList<FilmStripItem>();
JComponent[] c = new JComponent[ITEM_COUNT];
for (int i = 0; i < ITEM_COUNT; i++) {
FilmStripItem item = new FilmStripItem();
filmItems.add(item);
c[i] = item;
p.add(c[i]);
}
JScrollPane sp = new JScrollPane(p, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
add(sp);
}
public static void main(String[] args) {
try {
//Removed look and feel info
} catch (Exception ex) {
Logger.getLogger("Demo").log(Level.WARNING,
"loading CuiLookAndFeel failed", ex);
}
JFrame f = new JFrame("FilmStrip");
final FilmStripPanel p = new FilmStripPanel();
f.setContentPane(p);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setBounds(10, 10, 128, 512);
f.setVisible(true);
}
}
我已经一遍又一遍地用Google搜索这再次,但似乎无法推测出来为我确切的问题。我确定这里有一些冗余的代码,并且可以随意指出。我可以使用你们可以提供的所有帮助以及任何批评,我正在尝试学习Java Swing,并且失败。
有趣的问题+1 – mKorbel
请看看编辑给我的职务与可运行的代码示例。这真的是最简单的,我认为这是最好的方式。 –
[只在必要时在FlowLayout中显示滚动条]中有一些相关建议(http://stackoverflow.com/questions/8141035/show-scrollbars-in-flowlayout-only-when-necessary)。 – trashgod