vendredi 5 juin 2015

Scale displayed Image via JCheckBox

Hello everyone,
Ich bin eine Java Studentin, meine Deutschkenntnisse ist so so... Ich brauche hilfe bei der Einsendeaufgaben:
Ich weiß nicht was soll ich bei dem Listener machen und was noch verändern.
Bitte haben Sie etwas Geduld mit mir, ich bin nur studentin.
Wenn Sie mir tipps geben könnten, wäre das echt super, danke schonmal im vorraus!

Das Kontrollkästchen Anpassen im Register Einzelbild des Bildbetrachters wirkt
sich nur auf die Anzeige der Grafiken aus, die noch geladen werden. Ändern Sie
das Programm so, dass über das Kontrollkästchen auch das aktuell angezeigte Bild
angepasst werden kann.
Wie Sie diese Änderung umsetzen, bleibt Ihnen überlassen. Dokumentieren Sie
Ihre Lösung aber bitte ausführlich,

Java Code:

  1.  
  2. import java.io.File;
  3.  
  4. import javax.swing.JFileChooser;
  5. import javax.swing.filechooser.FileFilter;
  6. import javax.swing.filechooser.FileNameExtensionFilter;
  7.  
  8. public class BildbetrachterDialog {
  9.  
  10. class MeinFilter extends FileFilter {
  11.  
  12. @Override
  13. public boolean accept(File f) {
  14.  
  15. String name = f.getName().toLowerCase();
  16. if (f.isDirectory())
  17. return true;
  18. if (name.endsWith(".gif"))
  19. return false;
  20. if (name.endsWith(".jpg"))
  21. return true;
  22. if (name.endsWith(".jpeg"))
  23. return true;
  24. if (name.endsWith(".png"))
  25. return true;
  26. return false;
  27. }
  28.  
  29.  
  30.  
  31. @Override
  32. public String getDescription() {
  33. return "Grafikdateien";
  34.  
  35. }
  36. }
  37.  
  38. private JFileChooser dialogErstellen(){
  39. FileFilter filter = new FileNameExtensionFilter("JPEG file", "jpg", "jpeg");
  40. JFileChooser oeffnenDialog = new JFileChooser();
  41.  
  42. oeffnenDialog.addChoosableFileFilter(filter);
  43.  
  44. oeffnenDialog.setFileFilter(new MeinFilter());
  45.  
  46. oeffnenDialog.setAcceptAllFileFilterUsed(false);
  47.  
  48. return oeffnenDialog;
  49. }
  50.  
  51.  
  52. public String dialogZeigen() {
  53. JFileChooser dialogEinzel;
  54. dialogEinzel = dialogErstellen();
  55.  
  56.  
  57. int status = dialogEinzel.showOpenDialog(null);
  58.  
  59. if (status == JFileChooser.APPROVE_OPTION)
  60. return (dialogEinzel.getSelectedFile().toString());
  61.  
  62. else
  63. return null;
  64. }
  65.  
  66. //die Methode für die Auswahl mehrerer Dateien
  67. public File[] dialogZeigenMehrere() {
  68. JFileChooser dialogMehrere;
  69. dialogMehrere = dialogErstellen();
  70. dialogMehrere.setMultiSelectionEnabled(true);
  71.  
  72. //den Dialog anzeigen und den Status holen
  73. int status = dialogMehrere.showOpenDialog(null);
  74.  
  75. if (status == JFileChooser.APPROVE_OPTION)
  76. return (dialogMehrere.getSelectedFiles());
  77.  
  78. else
  79. return null;
  80. }
  81. }


Java Code:

  1.  
  2. import java.awt.FlowLayout;
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5. import java.io.File;
  6.  
  7. import javax.swing.JButton;
  8. import javax.swing.JCheckBox;
  9. import javax.swing.JFrame;
  10. import javax.swing.JLabel;
  11. import javax.swing.JPanel;
  12. import javax.swing.JSpinner;
  13. import javax.swing.JTabbedPane;
  14. import javax.swing.JTextField;
  15. import javax.swing.SpinnerNumberModel;
  16. import javax.swing.event.ChangeEvent;
  17. import javax.swing.event.ChangeListener;
  18.  
  19. public class Bildbetrachter extends JFrame{
  20.  
  21. //automatisch über Eclipse ergänzt
  22. private static final long serialVersionUID = 5926848670766709720L;
  23.  
  24. private JButton oeffnen, beenden, oeffnenSchau, beendenSchau;
  25.  
  26. private JTextField eingabe;
  27.  
  28. private BildPanel bildAnzeige, bildAnzeigeSchau;
  29.  
  30. private JCheckBox skalieren;
  31.  
  32. //adding the JSpinner
  33. private JSpinner jspinner;
  34. private int showImage;
  35.  
  36.  
  37. //The inner class for the listener
  38. class MeinListener implements ActionListener, ChangeListener { //must import change listener and itemListener
  39.  
  40. @Override
  41. public void actionPerformed(ActionEvent e) {
  42. //für die Schaltflächen zum Beenden
  43. if (e.getActionCommand().equals("Ende"))
  44. System.exit(0);
  45. //für die Auswahl eines einzelnen Bildes
  46. if (e.getActionCommand().equals("Laden"))
  47. bildLaden();
  48. //für die Auswahl der Bilder für die Bilderschau
  49. if (e.getActionCommand().equals("LadenSchau"))
  50. bilderSchau();
  51.  
  52.  
  53. }
  54. public void stateChanged (ChangeEvent e){ //must import change event
  55. if (e.getSource() instanceof JSpinner){
  56. showImage = (Integer) jspinner.getValue();
  57. try {
  58. Thread.sleep(showImage * 1000); //must double the number mili second
  59. } catch (InterruptedException e1){
  60. e1.printStackTrace(); } }
  61. //What do I need to change or add here?
  62. if (e.getSource() instanceof JCheckBox){
  63. // bildAnzeigeSchau.grafikLaden(nameOfTheLastDatei, skalieren.isSelected());
  64. }
  65.  
  66. }
  67. }
  68.  
  69. //der Konstruktor
  70. public Bildbetrachter(String titel) {
  71. super(titel);
  72. initGUI();
  73. }
  74.  
  75. private void initGUI() {
  76. //die Panels für die Register
  77. JPanel registerEinzel = new JPanel();
  78. JPanel registerSchau = new JPanel();
  79.  
  80. //das TabbedPane
  81. JTabbedPane panelKomplett = new JTabbedPane();
  82.  
  83. //das Register für die Einzelanzeige
  84. //eine neue Instanz für das Panel mit der Grafik erzeugen
  85. bildAnzeige = new BildPanel();
  86.  
  87. //create the componenets
  88. registerEinzel.setLayout(new FlowLayout(FlowLayout.LEFT));
  89. registerEinzel.add(bildAnzeige);
  90.  
  91. oeffnen = new JButton("Bild laden");
  92. beenden = new JButton("Beenden");
  93. oeffnen.setActionCommand("Laden");
  94. beenden.setActionCommand("Ende");
  95. eingabe = new JTextField(20);
  96.  
  97. skalieren = new JCheckBox("Anpassen");
  98.  
  99. registerEinzel.add(new JLabel("Bilddatei: "));
  100. registerEinzel.add(eingabe);
  101. registerEinzel.add(skalieren);
  102. registerEinzel.add(oeffnen);
  103. registerEinzel.add(beenden);
  104.  
  105. //link the listener
  106. MeinListener listener = new MeinListener();
  107. oeffnen.addActionListener(listener);
  108. beenden.addActionListener(listener);
  109. skalieren.addActionListener(listener);
  110.  
  111. //das Register für die Bilderschau
  112. //eine neue Instanz für das Panel mit der Grafik erzeugen
  113. bildAnzeigeSchau = new BildPanel();
  114.  
  115. //die Komponenten erstellen und einbauen
  116. registerSchau.setLayout(new FlowLayout(FlowLayout.LEFT));
  117. registerSchau.add(bildAnzeigeSchau);
  118.  
  119. oeffnenSchau = new JButton("Bilder laden");
  120. beendenSchau = new JButton("Beenden");
  121. oeffnenSchau.setActionCommand("LadenSchau");
  122.  
  123. beendenSchau.setActionCommand("Ende");
  124. //crate a label for the jspinner
  125. JLabel label = new JLabel ("Anzeige Dauer");
  126. //create and add the spinner number model
  127. SpinnerNumberModel numbermodel = new SpinnerNumberModel (10,2,20,1); //must import spinner number model
  128. jspinner = new JSpinner (numbermodel);
  129. registerSchau.add(oeffnenSchau);
  130. registerSchau.add(beendenSchau);
  131. registerSchau.add(label); //add the label and the spinner to the register
  132. registerSchau.add(jspinner);
  133.  
  134. //link the Listener
  135. oeffnenSchau.addActionListener(listener);
  136. beendenSchau.addActionListener(listener);
  137. //link the change listener to the spinner and JCheckBox
  138. jspinner.addChangeListener (listener);
  139. skalieren.addChangeListener (listener);
  140.  
  141. panelKomplett.add("Einzelbild",registerEinzel);
  142. panelKomplett.add("Bilderschau",registerSchau);
  143.  
  144. add(panelKomplett);
  145.  
  146. setSize(350,450);
  147. setResizable(false);
  148. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  149. setVisible(true);
  150. }
  151.  
  152. private void bildLaden() {
  153.  
  154. BildbetrachterDialog dialog = new BildbetrachterDialog();
  155.  
  156. String datei = dialog.dialogZeigen();
  157.  
  158. if (datei != null) {
  159. bildAnzeige.grafikLaden(datei, skalieren.isSelected());
  160. eingabe.setText(datei); } }
  161.  
  162. //die Methode zur Anzeige der Bilderschau
  163. private void bilderSchau() {
  164. //einen Standard-Öffnen-Dialog erzeugen
  165. BildbetrachterDialog dialogSchau = new BildbetrachterDialog();
  166. //die Rückgabe holen und in einem Array vom Typ File ablegen
  167. File[] dateien = dialogSchau.dialogZeigenMehrere();
  168.  
  169. //wenn eine Datei ausgewählt wurde, alle Dateien nacheinander anzeigen
  170. if (dateien != null) {
  171. for (File datei: dateien) {
  172. bildAnzeigeSchau.grafikLaden(datei.toString(), true); }}}
  173.  
  174. public static void main(String[] args) {
  175. new Bildbetrachter("Bildbetrachter");
  176.  
  177. }
  178. }


Java Code:

  1.  
  2.  
  3. import java.awt.Dimension;
  4. import java.awt.Graphics;
  5. import java.awt.image.BufferedImage;
  6. import java.io.File;
  7. import java.io.IOException;
  8.  
  9. import javax.imageio.ImageIO;
  10. import javax.swing.JOptionPane;
  11. import javax.swing.JPanel;
  12. import javax.swing.border.BevelBorder;
  13.  
  14. //The class create a Panel with the image uploaded
  15.  
  16. public class BildPanel extends JPanel{
  17.  
  18. private static final long serialVersionUID = 7482508662820162216L;
  19.  
  20. //Create a bufferedImage object for the input image
  21. private BufferedImage bild;
  22.  
  23.  
  24. //for the change of the image
  25. private double neueBildBreite;
  26. private double neueBildHoehe;
  27.  
  28.  
  29. //The constructor that set the size, draws a box and retrieve the graphics context
  30. public BildPanel() {
  31. setPreferredSize(new Dimension(300,300));
  32. setBorder(new BevelBorder(BevelBorder.LOWERED));
  33. }
  34.  
  35. //The method to upload the image, the name of the file is passed as a String
  36. //scaled controls whether the image is resized or not
  37.  
  38. public void grafikLaden(String datei, boolean skaliert) {
  39.  
  40. //A local variable for the change of the proportion
  41. double proportion;
  42.  
  43. try { //the exception handling is mandatory
  44. //inputimage bild
  45. bild = ImageIO.read(new File(datei));
  46.  
  47. //Should the image be adjusted?
  48. if (skaliert == true) {
  49.  
  50. //Is the image height is higher that the width (height > width)
  51. if (bild.getHeight() > bild.getWidth())
  52.  
  53. //then we determine the best new height
  54. proportion = (double) this.getSize().height / bild.getHeight();
  55. else
  56. //otherwise the optimal width
  57. proportion = (double) this.getSize().width / bild.getWidth();
  58. }
  59. else
  60. //if not, the proportion remains unchanged
  61. proportion = 1.0;
  62.  
  63. //Calculate the new height and width
  64. //Must be instance variable double
  65. //Resizes an image by a percentage of original size (proportional).
  66. neueBildBreite = proportion * bild.getWidth();
  67. neueBildHoehe = proportion * bild.getHeight();
  68.  
  69. //Get the graphic context
  70. Graphics grafikKontext = this.getGraphics();
  71.  
  72. //Clear the display
  73. grafikKontext.clearRect(0, 0, this.getSize().width, this.getSize().height);
  74.  
  75. //The method drawImage to show the new output scaled image
  76. grafikKontext.drawImage(bild, 0, 0, (int) neueBildBreite, (int) neueBildHoehe, this);
  77. }
  78. catch (IOException e) { //Error resize image
  79. JOptionPane.showMessageDialog(this.getParent(), "Beim Laden hat es ein Problem gegeben", "Fehler", JOptionPane.ERROR_MESSAGE);
  80. }
  81. }
  82.  
  83. //Override the method so that the resize image will not disappear
  84. @Override
  85. protected void paintComponent(Graphics g) {
  86. //Call the parent method that resize the image
  87. super.paintComponent(g);
  88. //When an image is displayed, let it resize
  89. if (bild != null)
  90. g.drawImage(bild, 0, 0, (int) neueBildBreite, (int) neueBildHoehe, this);
  91. }
  92. }


Scale displayed Image via JCheckBox

0 commentaires:

Enregistrer un commentaire