JCheckBox用于缩放上传图像

时间:2015-09-21 14:46:24

标签: java image swing scale 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 个答案:

答案 0 :(得分:1)

Wo genau skalierst du dein bild denn? Damit dieAktionausgeführtwirdsobald dueinHäckchenindeine skalierencheckbox machst musst du deine Checkbox zumactionlistenerbeifügenundgucken ob dieactionausgeführtwird。

Hier einmal ein von deinemCodeunabhängigesBeispiel:

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

Ichkönntedirwahrscheinlich auch ein funktionierenden Code hinfriemeln aber es ist ziemlich anstrengend deinen ganzen code durchzulesen und nachzuvollziehen ich hoffe duhastafürverständniss:)

你的缩放方法在哪里?要解决您必须设置动作侦测程序的操作,每次勾选复选框时都会解决您的操作。

这是一个如何进行设置的示例:

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

我想我能够给你写一个实际的代码,但是要读完你的整个程序,我希望你能表现出一些理解:)