[英]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.