2015-09-21 5 views
2

У меня есть школьное задание и только одна последняя вещь, которую я все еще могу получить.JCheckBox использовать для масштабирования изображения для загрузки

Мне нужно что-то изменить в коде, поэтому, когда я нажимаю кнопку JCheckBox, изображение будет масштабироваться.

На данный момент, когда выбрана кнопка масштабирования, только до загрузки фотографии изображение масштабируется, и мне нужно изменить его, чтобы изображение уже отображалось, будет масштабироваться, как только я нажму шкалу JCheckBox. Любые предложения? Спасибо заранее за любую помощь.

Вот мой 3 части кода:

Bildbetrachter класс

import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.File; 

import javax.swing.JButton; 
import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JSpinner; 
import javax.swing.JTabbedPane; 
import javax.swing.JTextField; 
import javax.swing.SpinnerNumberModel; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class Bildbetrachter extends JFrame{ 
//automatisch über Eclipse ergänzt 
private static final long serialVersionUID = 5926848670766709720L; 

private JButton oeffnen, beenden, oeffnenSchau, beendenSchau; 

private JTextField eingabe; 

private BildPanel bildAnzeige, bildAnzeigeSchau; 

private JCheckBox skalieren; 

//adding the JSpinner 
private JSpinner jspinner; 
private int showImage; 


//The inner class for the listener 
class MeinListener implements ActionListener, ChangeListener { //must import   change listener and itemListener 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     //für die Schaltflächen zum Beenden 
     if (e.getActionCommand().equals("Ende")) 
      System.exit(0); 
     //für die Auswahl eines einzelnen Bildes 
     if (e.getActionCommand().equals("Laden")) 
      bildLaden(); 
     //für die Auswahl der Bilder für die Bilderschau 
     if (e.getActionCommand().equals("LadenSchau")) 
      bilderSchau(); 

     if (e.getActionCommand().equals("Anpassen"))//the action listener to the JCheckBox 
       bildLaden(); 
} 
    public void stateChanged (ChangeEvent e){ //must import change event 
     if (e.getSource() instanceof JSpinner){ 
      showImage = (Integer) jspinner.getValue(); 
      try { 
       Thread.sleep(showImage * 1000); //must double the number mili second 
      } catch (InterruptedException e1){ 
       e1.printStackTrace();   } } 
     } 
} 

//der Konstruktor 
public Bildbetrachter(String titel) { 
    super(titel); 
    initGUI(); } 

private void initGUI() { 
    //die Panels für die Register 
    JPanel registerEinzel = new JPanel(); 
    JPanel registerSchau = new JPanel(); 

    //das TabbedPane 
    JTabbedPane panelKomplett = new JTabbedPane(); 

    //das Register für die Einzelanzeige 
    //eine neue Instanz für das Panel mit der Grafik erzeugen 
    bildAnzeige = new BildPanel(); 

    //create the components 
    registerEinzel.setLayout(new FlowLayout(FlowLayout.LEFT)); 
    registerEinzel.add(bildAnzeige); 

    oeffnen = new JButton("Bild laden"); 
    beenden = new JButton("Beenden"); 
    oeffnen.setActionCommand("Laden"); 
    beenden.setActionCommand("Ende"); 
    eingabe = new JTextField(20); 

    JCheckBox skalieren = new JCheckBox("Anpassen");//Constructor for JCheckBox 

    registerEinzel.add(new JLabel("Bilddatei: ")); 
    registerEinzel.add(eingabe); 
    registerEinzel.add(skalieren); 
    registerEinzel.add(oeffnen); 
    registerEinzel.add(beenden); 

    //link the listener 
    MeinListener listener = new MeinListener(); 
    oeffnen.addActionListener(listener); 
    beenden.addActionListener(listener); 
    skalieren.addActionListener(listener);//Link the JCheckBox to the listener 

    //das Register für die Bilderschau 
    //eine neue Instanz für das Panel mit der Grafik erzeugen 
    bildAnzeigeSchau = new BildPanel(); 

    //die Komponenten erstellen und einbauen 
    registerSchau.setLayout(new FlowLayout(FlowLayout.LEFT)); 
    registerSchau.add(bildAnzeigeSchau); 

    oeffnenSchau = new JButton("Bilder laden"); 
    beendenSchau = new JButton("Beenden"); 
    oeffnenSchau.setActionCommand("LadenSchau"); 

    beendenSchau.setActionCommand("Ende"); 
    //crate a label for the jspinner 
    JLabel label = new JLabel ("Anzeige Dauer"); 
    //create and add the spinner number model 
    SpinnerNumberModel numbermodel = new SpinnerNumberModel (10,2,20,1); //must import spinner number model 
    jspinner = new JSpinner (numbermodel); 
    registerSchau.add(oeffnenSchau); 
    registerSchau.add(beendenSchau); 
    registerSchau.add(label); //add the label and the spinner to the register 
    registerSchau.add(jspinner); 

    //link the Listener 
    oeffnenSchau.addActionListener(listener); 
    beendenSchau.addActionListener(listener); 

    //link the change listener to the spinner and JCheckBox 
    jspinner.addChangeListener (listener); 

    panelKomplett.add("Einzelbild",registerEinzel); 
    panelKomplett.add("Bilderschau",registerSchau); 

    add(panelKomplett); 

    setSize(350,450); 
    setResizable(false); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setVisible(true); } 

private void bildLaden() { //the method that opens window dialog to choose file and upload it 

    BildbetrachterDialog dialog = new BildbetrachterDialog(); 

    String datei = dialog.dialogZeigen(); 

    if (datei != null) { 
     bildAnzeige.grafikLaden(datei, skalieren.isSelected()); 
     eingabe.setText(datei); } } 

//die Methode zur Anzeige der Bilderschau 
private void bilderSchau() { 
    //einen Standard-Öffnen-Dialog erzeugen 
    BildbetrachterDialog dialogSchau = new BildbetrachterDialog(); 
    //die Rückgabe holen und in einem Array vom Typ File ablegen 
    File[] dateien = dialogSchau.dialogZeigenMehrere(); 

    //wenn eine Datei ausgewählt wurde, alle Dateien nacheinander anzeigen 
    if (dateien != null) { 
     for (File datei: dateien) { 
      bildAnzeigeSchau.grafikLaden(datei.toString(), true); }}} 

     public static void main(String[] args) { 
      new Bildbetrachter("Bildbetrachter");  } } 

класс MeinFilter

import java.io.File; 

import javax.swing.JFileChooser; 
import javax.swing.filechooser.FileFilter; 
import javax.swing.filechooser.FileNameExtensionFilter; 

public class BildbetrachterDialog { 

class MeinFilter extends FileFilter { 

    @Override 
    public boolean accept(File f) { 

     String name = f.getName().toLowerCase(); 
     if (f.isDirectory()) 
      return true; 
     if (name.endsWith(".gif")) 
      return false; 
     if (name.endsWith(".jpg")) 
      return true; 
     if (name.endsWith(".jpeg")) 
      return true; 
     if (name.endsWith(".png")) 
      return true; 
     return false;  } 

    @Override 
    public String getDescription() { 
     return "Grafikdateien";   
    } 
    } 

    private JFileChooser dialogErstellen(){ 
    FileFilter filter = new FileNameExtensionFilter("JPEG file", "jpg", "jpeg"); 
    JFileChooser oeffnenDialog = new JFileChooser(); 

    oeffnenDialog.addChoosableFileFilter(filter); 

    oeffnenDialog.setFileFilter(new MeinFilter()); 

    oeffnenDialog.setAcceptAllFileFilterUsed(false); 

    return oeffnenDialog; 
    } 


public String dialogZeigen() { 
    JFileChooser dialogEinzel; 
    dialogEinzel = dialogErstellen(); 


    int status = dialogEinzel.showOpenDialog(null); 

    if (status == JFileChooser.APPROVE_OPTION) 
     return (dialogEinzel.getSelectedFile().toString()); 

    else 
     return null; 
} 

//die Methode für die Auswahl mehrerer Dateien 
public File[] dialogZeigenMehrere() { 
    JFileChooser dialogMehrere; 
    dialogMehrere = dialogErstellen(); 
    dialogMehrere.setMultiSelectionEnabled(true); 

    //den Dialog anzeigen und den Status holen 
    int status = dialogMehrere.showOpenDialog(null); 

    if (status == JFileChooser.APPROVE_OPTION) 
     return (dialogMehrere.getSelectedFiles()); 

    else 
     return null; 
    } 
} 

BildPanel класс

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.border.BevelBorder; 


public class BildPanel extends JPanel{ 

private static final long serialVersionUID = 7482508662820162216L; 



//für die Änderungen beim Skalieren 
private double neueBildBreite; 
private double neueBildHoehe; 
private BufferedImage bild; 

public BildPanel() { 
    setPreferredSize(new Dimension(300,300)); 
    setBorder(new BevelBorder(BevelBorder.LOWERED)); 
} 


public void grafikLaden(String datei, boolean skaliert) { 


    //eine lokale Variable für die Änderung der Proportionen 
    double proportion; 

    //die Ausnahmebehandlung ist zwingend erforderlich 
    try { 
     bild = ImageIO.read(new File(datei)); 
     //soll das Bild angepasst werden? 
     if (skaliert == true) { 
      //ist das Bild höher als breit? 
      if (bild.getHeight() > bild.getWidth()) 
       //dann ermitteln wir die optimale neue Höhe 
       proportion = (double) this.getSize().height/bild.getHeight(); 
      else 
       //sonst die optimale neue Breite 
       proportion = (double) this.getSize().width/bild.getWidth(); 
     } 
     else 
      //wenn nicht, bleibt die Proportion unverändert 
      proportion = 1.0; 
     //die "neue" Breite und Höhe berechnen 
     //die Variablen müssen als Instanzvariablen vom Typ double  vereinbart werden 
     neueBildBreite = proportion * bild.getWidth(); 
     neueBildHoehe = proportion * bild.getHeight(); 
     //den Grafik-Kontext beschaffen 
     Graphics grafikKontext = this.getGraphics(); 
     //die Anzeige löschen 
     grafikKontext.clearRect(0, 0, this.getSize().width, this.getSize().height); 
     //das Bild anzeigen 
     //dabei wird die neue Höhe und Breite berücksichtigt 
     grafikKontext.drawImage(bild, 0, 0, (int) neueBildBreite, (int) neueBildHoehe, this); 
    } 
    catch (IOException e) { 
     JOptionPane.showMessageDialog(this.getParent(), "Beim Laden hat es ein Problem gegeben", "Fehler", JOptionPane.ERROR_MESSAGE); 
    } 
    } 


    //die Methode zum Neuzeichnen überschreiben, damit die Bilder nicht verschwinden 
    @Override 
protected void paintComponent(Graphics g) { 
    //die Methode zum Neuzeichnen der übergeordneten Klasse aufrufen, damit es keine Probleme gibt 
    super.paintComponent(g); 
    //wenn ein Bild angezeigt wurde, neu zeichnen lassen 
    if (bild != null) 
     g.drawImage(bild, 0, 0, (int) neueBildBreite, (int) neueBildHoehe, this); 
    } 
} 

ответ

1

Wo genau skalierst du dein bild denn? Damit die Aktion ausgeführt wird sobald du ein Häckchen in deine skalierencheckbox machst musest du deine Checkbox zum actionlistener beifügen und gucken ob die action ausgeführt wird.

HIER Einmal Эйн фон deinem Код unabhängiges Beispiel:

deineCheckbox.add(actionlistener(this)); 

public void actionPerformed(ActionEvent e) { 
if (e.getSource() == deineCheckbox) { 
if(deineCheckbox.isSelected()){ 
//hier skallieren methode ausführen! 
//Natürlich auch deine Display Methode/Befehl(wahrscheinlich bilderschau.()) 
//damit das ganze jedesmal bei der Aktion ausgeführt und gerendert wird. 
} 
} 

Ich könnte реж wahrscheinlich Auch Эйн funktionierenden Код hinfriemeln Абер-эс ист ziemlich anstrengend deinen код Ганзен durchzulesen унд nachzuvollziehen ич Hoffe Du Hast dafür verständniss :)


где ваш метод масштабирования? чтобы разрешить действие, которое вы должны настроить для actionlistener, который разрешает ваши действия каждый раз, когда ваш флажок отмечен.

вот пример того, как установить вещи:

yourCheckbox.add(actionlistener(this)); 

public void actionPerformed(ActionEvent e) { 
if (e.getSource() == yourCheckbox) { 
if(yourCheckbox.isSelected()){ 
//resolve your scaling method here! 
//also you have to initialise your display method(approxamentally bilderschau.()) 
//to resolve them everytime your box is ticked, scaling and rendering as for that. 
} 
} 

Я думаю, что я мог бы написать вам реальный код, но его к исчерпанию, чтобы прочитать всю свою программу, я надеюсь, вы показываете некоторое понимание:)

+1

извините, но вы не могли бы написать свой ответ на английском языке тоже? Если в будущем кто-то найдет этот вопрос, и ваш ответ будет принят, и они не знают немецкий язык, ему будет трудно понять его. Это может быть полезно, даже если это сломанный английский. Благодаря! – Frakcool

+0

Это не ответ, просто ответ, я ошибся, когда ответил: – Eli

+0

Этот код был предоставлен школой в рамках задания Я понимаю ваше чувство, так как у меня тот же самый. Масштабирование выполняется в общедоступном void grafikLaden (String datei, boolean skaliert) – Eli

Смежные вопросы