Hi, wir sollen für die Uni ein Programm zum Darstellen von Fotos programmieren.
Leider hänge ich bei einigen Punkten.
- Sobald man mehr als 4 oder 5 Fotos gleichzeitig öffnet, verzieht sich links alles. Also ich würde gerne dass die Buttons/Thumbnails so groß bleiben, wie wenn nur 2-3 Bilder geöffnet sind. Leider stehe ich auf dem Schlauch. Außerdem wäre eine Scrollpane schön, bzw. letztendlich auch unausweichlich. Aber auch das konnte ich bisher nicht einbauen.
- Außerdem kriege ich es nicht sehr große Bilder so zu verkleinern, dass sie in meine View passen und nicht nur ein Ausschnitt. Habe einen kleinen Test probiert, aber das funktionierte nicht.
Wäre nett, wenn ihr mir helfen könntet. Liebe Grüße
Leider hänge ich bei einigen Punkten.
- Sobald man mehr als 4 oder 5 Fotos gleichzeitig öffnet, verzieht sich links alles. Also ich würde gerne dass die Buttons/Thumbnails so groß bleiben, wie wenn nur 2-3 Bilder geöffnet sind. Leider stehe ich auf dem Schlauch. Außerdem wäre eine Scrollpane schön, bzw. letztendlich auch unausweichlich. Aber auch das konnte ich bisher nicht einbauen.
- Außerdem kriege ich es nicht sehr große Bilder so zu verkleinern, dass sie in meine View passen und nicht nur ein Ausschnitt. Habe einen kleinen Test probiert, aber das funktionierte nicht.
Wäre nett, wenn ihr mir helfen könntet. Liebe Grüße
Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.*;
import java.io.File;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.filechooser.FileFilter;
public class PVGui extends JFrame implements ActionListener {
private JPanel view = new JPanel(); // Für Bilder
private JPanel vorschau = new JPanel(); // Für Thumbnails
JScrollPane scrollPane = new JScrollPane (vorschau);
JScrollPane scrollPane2 = new JScrollPane (view);
private JMenuBar menue = new JMenuBar();
private JMenu datei = new JMenu("Datei");
private JMenuItem open = new JMenuItem("Oeffnen");
private JMenuItem exit = new JMenuItem("Programm beenden");
private JFileChooser file =new JFileChooser();
private JButton back = new JButton("Zurueck");
private JButton next = new JButton("Vor");
private JButton diashow = new JButton("Diashow");
//private JButton stop = new JButton("Stop");
private ArrayList<Image> image=new ArrayList<Image>();
private Canvas canvas=new Canvas();
private ArrayList<JButton> miniature=new ArrayList<JButton>();
private int index;
private boolean running=false;
public PVGui(){
super("Ralfs Photoviewer");
//Fensterlayout
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(1000,750);
this.setLocation(250,100);
this.vorschau.setPreferredSize(new Dimension(200, 400));
this.view.setSize(800,800);
this.view.setLayout(new BorderLayout());
// vorschau.setLayout(new GridLayout(0, 1, 0, 10)); // geht nicht?
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new FlowLayout());
datei.add(open);
datei.add(exit);
menue.add(datei);
open.addActionListener(this);
buttonPanel.add(back);
buttonPanel.add(next);
buttonPanel.add(diashow);
//buttonPanel.add(stop);
view.add("South", buttonPanel);
back.addActionListener(this);
next.addActionListener(this);
diashow.addActionListener(this);
//stop.addActionListener(this);
add("North", menue);
add("West", vorschau);
add("Center", view);
canvas.setBackground(Color.WHITE);
view.add("Center", canvas);
repaint();
}
public static void main(String[] args) {
PVGui photoviewer = new PVGui();
//photoviewer.setSize(800, 800);
//photoviewer.setLocation(120, 120);
photoviewer.setVisible(true);
photoviewer.repaint();
}
public void initializeMiniatrue(File[] mini){
JPanel temp= new JPanel();
//temp.setLayout(new GridLayout((mini.length+1)/2,2,4,4));
temp.setLayout(new GridLayout(0, 1, 0, 10));
this.miniature=new ArrayList<JButton>();
this.image=new ArrayList<Image>();
for(File f:mini){
//hier wird das Image geladen
Image i=getToolkit().getImage(""+f);
this.image.add(i);
JButton btn=new JButton();
btn.setSize(125,125);
//Die Groesse des Images wird auf den Button zurechtgeschnitten
btn.setIcon(new ImageIcon(i.getScaledInstance(btn.getWidth(), btn.getHeight(), 0)));
btn.addActionListener(this);
miniature.add(btn);
temp.add(btn);
}
//Etwas haesslich aber so wird das Panel wie gewollt ueberschrieben
this.remove(vorschau);
vorschau=temp;
this.add("West",vorschau);
this.setVisible(true);
}
public void drawImage(int i){
Image image=this.image.get(i);
MediaTracker mt = new MediaTracker(this);
mt.addImage(image, 2);
try {
mt.waitForID(2);
} catch (InterruptedException e) {
System.out.println(e);
}
Graphics g = canvas.getGraphics();
g.clearRect(0, 0, canvas.getWidth(), canvas.getHeight());
// TEST
if(image.getHeight(this)>600 || image.getWidth(this)>600){
System.out.println("Bild"+image.toString()+" ist zu groß");
System.out.println(image.getHeight(this)+" "+image.getWidth(this));
image = image.getScaledInstance(600, 600, Image.SCALE_SMOOTH);
}
// TEST
g.drawImage(image, 0, 0, this);
}
@Override
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
if(e.getSource()==exit){
System.exit(0);
System.out.println("hallo");
}
if(e.getSource()==open){
File[]files;
//Hier ermoeglichen wir mehrfachselection
file.setMultiSelectionEnabled(true);
file.setFileFilter(new FileFilter() {
//Hier legen wir fest welche Anforderungen an eine Datei gestellt wird,
//damit sie in unserem Filemanager angezeigt wird
@Override
public boolean accept(File f) {
return f.getName().toLowerCase().endsWith(".jpg")||f.getName().toLowerCase().endsWith(".gif")||f.getName().toLowerCase().endsWith(".png")|| f.isDirectory();
}
@Override
public String getDescription() {
return "JPG/PNG/GIF Files";
}
});
int result = file.showDialog(this, "Bilder auswaehlen");
switch(result) {
case JFileChooser.APPROVE_OPTION:
files = file.getSelectedFiles();
if(files == null) {
return;
}
else initializeMiniatrue(files);
}
}
if(e.getSource()==diashow){
running=!running;
Diashow d=new Diashow();
d.start();
}
if(e.getSource()==next)
drawImage(index=++index%miniature.size());
if(e.getSource()==back)
drawImage(index=(index==0)?miniature.size()-1:index-1);
if(miniature.contains(e.getSource())){
index=miniature.indexOf(e.getSource());
drawImage(index);
}
}
private class Diashow extends Thread{
String eingabe = JOptionPane.showInputDialog(null,"Gebe Dauer in Sekunden ein");
public void run(){
if(running){
next.setEnabled(false);
back.setEnabled(false);
diashow.setText("Stop");
}
if(miniature.size()==0)running=false;
System.out.println(miniature.size());
while(running){
try{
drawImage(index=++index%miniature.size());
sleep(Integer.parseInt(eingabe)*1000);
}
catch (Exception e) {
System.out.println(e);
}
}
next.setEnabled(true);
back.setEnabled(true);
diashow.setText("Diashow");
}
}
}
Zuletzt bearbeitet von einem Moderator: