我有一份学校作业,最后一件事我仍然可以做对。
我必须更改代码中的内容,以便在按下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);
}
}
答案 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.
}
}
我想我能够给你写一个实际的代码,但是要读完你的整个程序,我希望你能表现出一些理解:)