Alaspäin scrollaaminen hävittää kuvan Jframen Jpanel

rattanat

Yrityksenä olisi lisätä Jframeen scrollpanella varustettu Jpanel, joka piirtää tiedostosta ladatun kuvan. Tämän lisäksi on painike joka korvaa ohjelman käynnistyksenyhteydessä piirretyn kuvan, uudella kuvalla.

Ongelma on kuvan korvauksen jälkeen tapahtuva alaspäin-scrollaus. Kun käyn alhaalla ja palaan takaisin ylös on kuva vaihtunut takaisin käynnistyksessä ladattuun kuvaan.

Muuten toimiva lähdekoodi:
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;

public class MainWindow extends JFrame implements ActionListener{

private String kuva_yksi_path = ".\\kuva1.png";
private String kuva_kaksi_path = ".\\kuva2.png";

//The constructor for the class MainWindow.
public MainWindow()
      {
      makeFrame(kuva_yksi_path);
      }

   //Make frame
   public void makeFrame(String kuva)
      {
ImagePanel drawingPanel = new ImagePanel(kuva);

      JScrollPane scroller = new JScrollPane(drawingPanel);
scroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

this.setLayout(new BorderLayout());
this.setPreferredSize(new Dimension(900,670));

//change button
JButton change_button = new JButton("change");
this.getContentPane().add(change_button, BorderLayout.WEST);
      change_button.addActionListener(this);

//scroller is the JScrollPane
this.getContentPane().add(scroller, BorderLayout.CENTER);
this.setVisible(true);
this.pack();
      }

   //change the picture
   public void actionPerformed(ActionEvent e)
      {
      if(e.getActionCommand().equals("change"))
         makeFrame(kuva_kaksi_path);
      }

//The panel on which the drawings are done.
private class ImagePanel extends JPanel
   {
      Image image = null;

public ImagePanel(String kuva_path)
      {
            image = getToolkit().getImage(kuva_path);//load image
            }

//This is the method that actually paints all the drawings whenever a.
//The shapes theselves can be defined somewhere else, but that paint method must be invoked from here.
public void paintComponent(Graphics g)
   {
super.paintComponent(g); //paint background
   Graphics2D g2 = (Graphics2D) g;

      if (image != null)
            { //there is a picture: draw it
             g.drawImage(image,0, 0, 53, 77, this);
            } //end if
         g.drawString("text", 750, 750);//To test the scrollpane.
         }

      public Dimension getPreferredSize()
         {
         return new Dimension(750,750);
         }
   }
public static void main(String[] args)
   {
new MainWindow();
   }
}

3

450

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • dfgdfgsdf

      Taitaa tulla monta JScrollPanea päällekkäin. Poista vaikka vanha ennen kuin uutta lisäät.. this.getContentPane().remove(scroller);

      • rattanat

        Kiitos molemmille. dfgdfgsdf ratkaisumalli oli tälläkertaa sovellukseeni paremmin käyvä ratkaisumalli.


    • if-else

      Toinen vaihtoehto on muuttaa ohjelmaa niin, että vain kuva korvataan, ilman paneelin tuhoamista. Esim.

      --- ALKAA ---

      import javax.swing.*;
      import java.awt.*;
      import java.awt.geom.*;
      import java.awt.event.*;

      public class MainWindow extends JFrame implements ActionListener{

         ImagePanel drawingPanel;
         
         private String kuva_yksi_path = ".\\kuva1.png";
         private String kuva_kaksi_path = ".\\kuva2.png";

         //The constructor for the class MainWindow.
         public MainWindow() {
            makeFrame(kuva_yksi_path);
         }

      //Make frame
         public void makeFrame(String kuva) {
            drawingPanel = new ImagePanel(kuva);
            
            JScrollPane scroller = new JScrollPane(drawingPanel);
            scroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

            this.setLayout(new BorderLayout());
            this.setPreferredSize(new Dimension(900,670));

            //change button
            JButton change_button = new JButton("change");
            this.getContentPane().add(change_button, BorderLayout.WEST);
            change_button.addActionListener(this);

            //scroller is the JScrollPane
            this.getContentPane().add(scroller, BorderLayout.CENTER);
            this.setVisible(true);
            this.pack();
         }

         
         //change the picture
         public void actionPerformed(ActionEvent e)
         {
            if(e.getActionCommand().equals("change")) {
               drawingPanel.ChangeImage(kuva_kaksi_path);
               drawingPanel.repaint();
            }
         }

         //The panel on which the drawings are done.
         private class ImagePanel extends JPanel {
            Image image = null;

            public ImagePanel(String kuva_path) {
               image = getToolkit().getImage(kuva_path);//load image
            }
            
            public void ChangeImage(String kuva_path) {
               image = getToolkit().getImage(kuva_path);//load image
            }

            //This is the method that actually paints all the drawings whenever a.
            //The shapes theselves can be defined somewhere else, but that paint method must be invoked from here.
            public void paintComponent(Graphics g) {
               super.paintComponent(g); //paint background
               Graphics2D g2 = (Graphics2D) g;

               if (image != null) { //there is a picture: draw it
                  g.drawImage(image,0, 0, 53, 77, this);
      } //end if

               g.drawString("text", 750, 750);//To test the scrollpane.
            }

            public Dimension getPreferredSize() {
               return new Dimension(750,750);
            }
         }

         public static void main(String[] args) {
            new MainWindow();
         }
      }

      --- LOPPUU ---

    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Perintovero 100 prosenttiin, työeläkkeet ja maataloustuet pois

      Noilla eväillä lähden tasapainottamaan valtiontaloutta ja korjaamaan työntekijöiden palkkakuoppaa nostamatta työnantajie
      Maailman menoa
      57
      2543
    2. Päivän Riikka: polttoöljyn hinta räjähti

      Näyttää tuo putinismi ilmenevän persuissa myös Suomen yrittäjien kampittamisena. Polttoöljy on se katalyytti, joka pitää
      Maailman menoa
      49
      2315
    3. Riikka runnoo: polttoöljyn hinta nousi maaliskuussa 40 prosenttia

      Onko irvistelijällä sakset hävinneet, vai miksei osaa leikata polttoaineiden hintaa kansalaisten kukkarolle sopivalle ta
      Maailman menoa
      2
      2302
    4. Mökkejä ostellaan nyt ihan hulluna!

      Tyypilliset lainamäärät on yli 500 000€ mökkejä ostellessa eli erityisesti tuollaiset miljoonamökit on nyt suomalaisten
      Maailman menoa
      72
      2223
    5. Demariskandaali! Eveliina Heinäluoma (sdp) kahmii kaikki Hitas asunnot itselleen!

      Heinäluoma on ostanut useita yhteiskunnan tukemia, hintasäännösteltyjä asuntoja itselleen! Ei ihme, että Hitas on ollut
      Maailman menoa
      51
      2072
    6. Helsingin yllä valopalloja

      https://www.iltalehti.fi/kotimaa/a/1508be00-28c9-4156-83dc-0be5e7aa3066 "Helsingin taivaalla lensi lauantaina puolen yön
      Sinkut
      137
      2027
    7. HÄLYYTYS!!

      Ukraina se hyökkää jo Suomen maaperälle. https://www.iltalehti.fi/kotimaa/a/645b83ce-e074-4f00-8b99-245d01b38a36
      NATO
      398
      1765
    8. Kovasti on hävittäjiä ilmassa. Nytkö se alkoi?

      Onko nyt sota ?? `Vai harjoituksiako vain? Hävittäjät pörrää kovasti.
      Kouvola
      108
      1706
    9. Ranskan vasemmistojohtaja tunnustaa, että väestö on vaihtumassa

      ja se on vaan hyvä asia hänen mielestään. Kyseessä siis Ranskan vasemmistojohtaja Jean-Luc Mélenchon jonka puheet järkyt
      Maailman menoa
      22
      1589
    10. Helsingin yllä lensi yöllä jotain outoa puolen yön aikaan valopalloja

      Poliisi on saanut tapauksesta yhden havaintoilmoituksen. Valopalloja oli noin parikymmentä ILtalehdessä on video tapah
      Maailman menoa
      124
      1524
    Aihe