Probleme mit Programm

luminol

Mitglied
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


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:

Joose

Top Contributor
- 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.

Du erstellst deine komplette Vorschau jedes mal neu anstatt dem aktuellen Panel einfach einen neuen Button hinzuzufügen. Das ist unnötig/unschön und außerdem erstellst du dein JPanel ohne preferredSize ;)
Ansonsten was "setSize" Aufrufe von JComponents machen wenig sinn, da der LayoutManager dies zwar bemerkt aber es trotzdem so zeichnet wie er soll.

Was heißt du konntest es bisher nicht einbauen? Welche Probleme gab es? Wie hast du probiert einen Scrollpane einzubauen? Fehler? Falsches Verhalten?

- 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.

Was hat nicht funktioniert? Fehler/falsches Verhalten?
Debugger probiert?


Ansonsten bleibt nur zum Code zu sagen: http://stackoverflow.com/questions/1143923/why-shouldnt-you-extend-jframe-and-other-components
 

luminol

Mitglied
Danke für die Antwort.
Aber ich habe doch eine preferred size angegeben:

Code:
this.vorschau.setPreferredSize(new Dimension(200, 400));

Das mit der Vorschau macht Sinn. Aber so ganz verstehe ich meinen Fehler nicht bzw. kann ich noch nicht ganz sehen, wo mein Problem da liegt.
 

Joose

Top Contributor
Ja im Konstruktor ;)
In der Methode "initializeMiniatrue" ersetzt du das Objekt durch ein anderes (bei diesem wurde es nicht aufgerufen)
 

Joose

Top Contributor
Natürlich, weil das Objekt dessen Dimension du gesetzt hast wird per "remove" von deiner UI entfernt und die Referenz überschrieben.
Somit wird dieses Objekt nicht mehr referenziert und aus dem Speicher gelöscht.
Das neue Objekt, welches in der Methode "initializeMiniatrue" ist ein komplett anderes Objekt.
 

luminol

Mitglied
ich habe jetzt zumindest schon mal das problem gelöst, dass zu große bilder verkleinert werden.
jetzt klappt es, in dem ich vorher ein buffered image erstelle und dieses dann lade.
allerdings hänge ich immer noch an der sache von oben. könnte mir noch mal jemand genauer sagen, wie ich das am einfachsten umbaue?

LG
 

Joose

Top Contributor
Wie oben schon geschrieben: Der LayoutManager ignoriert normale Größenangaben von Komponenten und zeichnet die UI so wie er es programmiert bekommen hat.
Natürlich kannst du mit "preferredSize", "minimumSize" und "maximumSize" trotzdem die Größen beeinflussen. Da du dein JPanel neu erzeugst solltest du auch die preferred/minimum Size neu setzen.
 

luminol

Mitglied
Ah ja, aber tue ich das hier nicht?

Code:
JPanel temp= new JPanel();
        temp.setPreferredSize(new Dimension(200, 400));
 

Joose

Top Contributor
Bis auf dem Code im Anfangspost wurde keiner gepostet und dort ist diese Zeile nicht vorhanden ;)
Das es von dir schon eingefügt wurde ist schwer zu erraten. Keine merkliche Auswirkung?
 

luminol

Mitglied
Oh, du hast recht, Danke! Es verbessert sich wirklich. Allerdings ist es immer noch nicht optimal.
Und desto mehr Bilder kommen, desto schmaler werden natürlich die Buttons.
Ich habe nun versucht eine Scrollpane einzubauen, die bspw. bei mehr als 4-5 Bildern einfach scrollen ermöglicht. Da bis zu dieser Anzahl alles sehr gut aussieht. Nur hakt es hier schon wieder

Mein Ansatz war folgender:

Code:
final JScrollPane ScrollPane = new JScrollPane();
        ScrollPane.setLayout(null);
        ScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        ScrollPane.setBounds(0, 0, 500, 500);

// Weiter unten dann

this.remove(vorschau);
        vorschau=temp;
        vorschau.add(ScrollPane);
        this.add("West",vorschau);
        this.setVisible(true);

Aber das reicht noch nicht. Wie aktiviere ich die Scrollbar bzw. teile die Information mit, ab wann bzw. wie vielen Buttons gescrollt werden soll?
 

Anhänge

  • Bildschirmfoto 2016-01-20 um 17.49.33.png
    Bildschirmfoto 2016-01-20 um 17.49.33.png
    206,2 KB · Aufrufe: 18

luminol

Mitglied
Kann wenigstens Jemand sagen, ob der Ansatz stimmt oder es kompletter Unfug ist? :D Bin hier langsam am verzweifeln.. so schwer kann das ja nicht sein
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Probleme mit 2 JFrames in einem Programm AWT, Swing, JavaFX & SWT 7
M hilfe! probleme mit meinem programm AWT, Swing, JavaFX & SWT 5
XWing Swing Image anzeigen und probleme mit klassen AWT, Swing, JavaFX & SWT 3
E repaint Probleme AWT, Swing, JavaFX & SWT 13
mananana Mögliche probleme die in einer GUI passieren Können AWT, Swing, JavaFX & SWT 6
S GridBagLayout - Probleme mit Bilderanzeige AWT, Swing, JavaFX & SWT 3
I Probleme beim Drucken auf einen PDF-Drucker AWT, Swing, JavaFX & SWT 8
J Probleme mit idividueller Tablecell AWT, Swing, JavaFX & SWT 0
D JavaFX Probleme beim nachtäglichen hinzufügen der jfx dependency AWT, Swing, JavaFX & SWT 7
J Probleme mit InputDialog AWT, Swing, JavaFX & SWT 4
D JavaFX TextArea Probleme bei langen Zeilen AWT, Swing, JavaFX & SWT 1
G JavaFX SplitPane Anwendung - Controller Probleme AWT, Swing, JavaFX & SWT 5
K Probleme bei der Erstellung und Ausführung einer Jar Datei AWT, Swing, JavaFX & SWT 2
B Probleme Action Listener Taschenrechner AWT, Swing, JavaFX & SWT 27
pph080560 JavaFX Probleme mit FX AWT, Swing, JavaFX & SWT 3
M Probleme mit OpenJDK AWT, Swing, JavaFX & SWT 6
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
B Swing Probleme mit dem Layout AWT, Swing, JavaFX & SWT 1
L JavaFX Probleme beim Installieren JavaFX11 / JavaFX12 -- Eclipse 2019-03 AWT, Swing, JavaFX & SWT 3
Fiedlerdan Image-Pfad Probleme nach Export aus Eclipse AWT, Swing, JavaFX & SWT 31
H JFreeChart - DemoDataSetFactory Probleme AWT, Swing, JavaFX & SWT 1
H LayoutManager Probleme mit Positionierung/Abständen der Komponenten AWT, Swing, JavaFX & SWT 14
A Probleme mit gridheight (GridBagLayout) AWT, Swing, JavaFX & SWT 6
U Opaque Probleme AWT, Swing, JavaFX & SWT 3
H JavaFX Probleme Beim Wechseln der scene als .fxml AWT, Swing, JavaFX & SWT 7
F JavaFX Probleme beim automatischen Konvertieren AWT, Swing, JavaFX & SWT 4
S Probleme mit JComboboxen(?) AWT, Swing, JavaFX & SWT 18
S Swing Probleme mit MigLayout AWT, Swing, JavaFX & SWT 2
C Probleme mit createImage AWT, Swing, JavaFX & SWT 1
J Probleme mit contex Menu (javafx) AWT, Swing, JavaFX & SWT 1
J Probleme bei GameofLife AWT, Swing, JavaFX & SWT 24
S JavaFx - Button ActionEvent Probleme AWT, Swing, JavaFX & SWT 3
T Swing Probleme mit repaint() bzw. JScrollPane AWT, Swing, JavaFX & SWT 7
ImperatorMing JavaFX Probleme mit WindowEvent AWT, Swing, JavaFX & SWT 0
ImperatorMing JavaFX Probleme mit WindowEvent AWT, Swing, JavaFX & SWT 5
J LayoutManager GridBagLayout, probleme mit Anordnung von Objekten AWT, Swing, JavaFX & SWT 6
T Java FX Probleme beim befüllen eines Tableviews AWT, Swing, JavaFX & SWT 5
S AWT Probleme beim Zeichnen AWT, Swing, JavaFX & SWT 3
A Swing Probleme mit dem adden von JButtons zur JScrollPane AWT, Swing, JavaFX & SWT 2
D Swing Probleme mit dem Resizing AWT, Swing, JavaFX & SWT 7
G Probleme mit TextArea AWT, Swing, JavaFX & SWT 5
G JFrame Probleme AWT, Swing, JavaFX & SWT 2
K Probleme beim JPasswordField AWT, Swing, JavaFX & SWT 11
G Cardlayout Refresh Probleme AWT, Swing, JavaFX & SWT 2
J Swing Probleme mit ListSelectionListener(), Inhalte der JList werden gelöscht? AWT, Swing, JavaFX & SWT 6
D JavaFX Probleme bei Service-Klasse beim ändern der GUI AWT, Swing, JavaFX & SWT 8
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
M JButton Probleme AWT, Swing, JavaFX & SWT 14
blazingblade komischerweise probleme mit jtextfield.gettext() AWT, Swing, JavaFX & SWT 9
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13
Sin137 LayoutManager GridBagLayout Probleme AWT, Swing, JavaFX & SWT 6
H Netbeans Designer: Probleme mit JPanel und JFrame AWT, Swing, JavaFX & SWT 2
M Swing Probleme mit Frame.pack() AWT, Swing, JavaFX & SWT 1
C Java FX Probleme beim Schließen einer Stage AWT, Swing, JavaFX & SWT 11
M Swing JProgressbar und Outoputstream probleme AWT, Swing, JavaFX & SWT 2
S Swing Probleme mit transparenz der Hintergrundfarbe und JRadioButtons AWT, Swing, JavaFX & SWT 2
Z Probleme mit JPanel's AWT, Swing, JavaFX & SWT 6
T Probleme mit Anzeige von Elementen im JPanel AWT, Swing, JavaFX & SWT 1
Shams Probleme bei dem Hinzufügen von Komponenten zu einem JFrame AWT, Swing, JavaFX & SWT 3
A Swing Probleme mit JScrollPane AWT, Swing, JavaFX & SWT 6
M Layout-Probleme unter Swing AWT, Swing, JavaFX & SWT 5
H Swing Probleme beim erstellen eines neuen Objektes durch einen Button AWT, Swing, JavaFX & SWT 10
J JavaFX JavaFX Probleme bei der Anzeige von Text AWT, Swing, JavaFX & SWT 18
A Probleme mit TilledBorder("***") AWT, Swing, JavaFX & SWT 4
F Bildschirmschoner Probleme mit Preview AWT, Swing, JavaFX & SWT 8
X Panel Probleme (Tetris) AWT, Swing, JavaFX & SWT 8
N JTable probleme AWT, Swing, JavaFX & SWT 5
B Probleme bei ImageIO.read (?!) AWT, Swing, JavaFX & SWT 9
P JFrame Location-/Size-Probleme AWT, Swing, JavaFX & SWT 5
U LayoutManager Probleme mit Layouts AWT, Swing, JavaFX & SWT 5
C 3 kleine Probleme... AWT, Swing, JavaFX & SWT 13
L NullpointerException und Probleme mit repaint() AWT, Swing, JavaFX & SWT 11
K LayoutManager Probleme mit 2 Komponenten AWT, Swing, JavaFX & SWT 9
C Probleme mit Buttons und einem ActionListener AWT, Swing, JavaFX & SWT 2
M Probleme mit Verkleinern eines GUI AWT, Swing, JavaFX & SWT 7
B Swing label.setText() macht probleme AWT, Swing, JavaFX & SWT 5
B ImageIcon - Probleme mit dem Dateipfad AWT, Swing, JavaFX & SWT 5
H JTree Probleme AWT, Swing, JavaFX & SWT 9
F Probleme mit (Graphics g) II AWT, Swing, JavaFX & SWT 4
F Probleme mit (Graphics g) AWT, Swing, JavaFX & SWT 3
K 2D-Grafik .GIF macht mir Probleme AWT, Swing, JavaFX & SWT 14
B Probleme bei Sortierung einer Tabelle mit DefaultTableModel AWT, Swing, JavaFX & SWT 6
T JTable Graphik probleme AWT, Swing, JavaFX & SWT 3
H GridBagLayout macht Probleme... AWT, Swing, JavaFX & SWT 4
vandread Swing Probleme mit jTextField im zusammenspiel mit einem Einblendeffekt (inkl. KSKB) AWT, Swing, JavaFX & SWT 6
S Swing Lauftext Performance Probleme, in größerer Anwendung AWT, Swing, JavaFX & SWT 6
B Infolabel Probleme mit Paint() ? AWT, Swing, JavaFX & SWT 8
P Probleme mit setIconImage AWT, Swing, JavaFX & SWT 8
U Swing Probleme mit Asynchronen Prozessen und Swing: AWT, Swing, JavaFX & SWT 3
das-mo Probleme mit GridBagLayout AWT, Swing, JavaFX & SWT 6
N 2D-Grafik 2 Probleme beim zeichnen AWT, Swing, JavaFX & SWT 18
L Probleme mit JPanel AWT, Swing, JavaFX & SWT 8
D Probleme bei Übertrag von ArrayList in Jtable AWT, Swing, JavaFX & SWT 2
G kleinere Probleme mit GUI AWT, Swing, JavaFX & SWT 2
G Mehrere Probleme mit Java's GUI AWT, Swing, JavaFX & SWT 6
M Swing Erste Schritte mit der GUI, viele Probleme AWT, Swing, JavaFX & SWT 36
J GUI-Aktualisierungs-Probleme AWT, Swing, JavaFX & SWT 4
B Performance-Probleme AWT, Swing, JavaFX & SWT 17
I Probleme if-Anweisung AWT, Swing, JavaFX & SWT 26
D Swing Probleme bei transparenten Hintergrund im JTextField AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben