简体   繁体   English

JCheckBox 用于缩放上传图像

[英]JCheckBox use for scale an upload image

I have a school assignment and just one last thing that I still can get right.我有一个学校作业,还有最后一件事我仍然可以做对。

I have to change something in the code so when I press the JCheckBox button the image will be scaled.我必须更改代码中的某些内容,因此当我按下JCheckBox按钮时,图像将被缩放。

For now when scale button is selected, only before upload of the photo the image is been scaled and I need to change it so that the image is already displayed will be scaled as soon as I press the JCheckBox scale. For now when scale button is selected, only before upload of the photo the image is been scaled and I need to change it so that the image is already displayed will be scaled as soon as I press the JCheckBox scale. Any suggestions?有什么建议? thank you in advance for any help.预先感谢您的任何帮助。

Here is my 3 parts code:这是我的 3 部分代码:

Bildbetrachter class 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 class 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 class图片面板类

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);
    } 
}

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

Hier einmal ein von deinem Code unabhängiges Beispiel: Hier einmal ein von deinem Code 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 dir wahrscheinlich auch ein funktionierenden Code hinfriemeln aber es ist ziemlich anstrengend deinen ganzen code durchzulesen und nachzuvollziehen ich hoffe du hast dafür verständniss :) Ich könnte dir wahrscheinlich auch ein funktionierenden Code hinfriemeln aber esist ziemlich anstrengend deinen ganzen code durchzulesen und nachzuvollziehen ich hoffe du hast dafür verständniss :)


where is your scaling method?你的缩放方法在哪里? to resolve an action you have to set up an actionlistener, which resolves your action everytime your checkbox is ticked.要解决一个动作,您必须设置一个动作侦听器,它会在每次选中复选框时解析您的动作。

here is an example how to set things up:这是一个如何设置的示例:

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

I think I would be able to write you an actual code but its to exhausting to read through your whole programm I hope you show some understanding :)我想我可以给你写一个实际的代码,但阅读你的整个程序很累,我希望你能理解:)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM