У меня есть школьное задание и только одна последняя вещь, которую я все еще могу получить.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);
}
}
извините, но вы не могли бы написать свой ответ на английском языке тоже? Если в будущем кто-то найдет этот вопрос, и ваш ответ будет принят, и они не знают немецкий язык, ему будет трудно понять его. Это может быть полезно, даже если это сломанный английский. Благодаря! – Frakcool
Это не ответ, просто ответ, я ошибся, когда ответил: – Eli
Этот код был предоставлен школой в рамках задания Я понимаю ваше чувство, так как у меня тот же самый. Масштабирование выполняется в общедоступном void grafikLaden (String datei, boolean skaliert) – Eli