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.
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:
Bildbetrachter class
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
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 ? 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 es ist 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 :)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.