簡體   English   中英

JCheckBox 用於縮放上傳圖像

[英]JCheckBox use for scale an upload image

我有一個學校作業,還有最后一件事我仍然可以做對。

我必須更改代碼中的某些內容,因此當我按下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. 有什么建議? 預先感謝您的任何幫助。

這是我的 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;
    }
}

圖片面板類

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 ? 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:

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 esist ziemlich anstrengend deinen ganzen code durchzulesen und nachzuvollziehen ich hoffe du hast dafür verstä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.
}
}

我想我可以給你寫一個實際的代碼,但閱讀你的整個程序很累,我希望你能理解:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM