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

429

    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. Yritystuet 10 mrd. vuodessa, eli yrittäjäriski valtiolla kuten kommunismissa

      Pelkästään Viking Linen viinanhakuristeilyitä sponsoroidaan 20 miljoonalla eurolla vuosittain. Dieselin verotukikin on
      Yrittäjyys
      6
      4103
    2. Pystyisitkö pitämään

      Näppejä erossa jos tulisi siihen tilaisuus
      Ikävä
      45
      4083
    3. Riikka on siis suomalaisille velkaa 84 mrd

      Jos kauhukabinetti istuu vaalikauden loppuun. Keskimäärin yli 20 miljardia uutta velkaa rikkaiden veronalennuksiin jokai
      Maailman menoa
      84
      3303
    4. Luotathan siihen tunteeseen, joka välillämme on?

      Uskothan myös, että se kestää tämän? Kaipaan sinua valtavasti. Vielä tehdään yhdessä tästä jotain ihmeellistä ja kaunist
      Ikävä
      40
      3268
    5. En saa sua mielestäni vaikka tekisin mitä

      Mikä tähän auttaa.. ei mikään. Edes aika. Kaivan sut kohta vaikka kivenkolosta että saan kysyä haluatko sinäkin💛
      Ikävä
      14
      3037
    6. Sanna on suomalaisille siis velkaa 24 mrd euroa

      Muistanette vielä kuinka Italian remonttirahoja perusteltiin sillä, että italialaiset ostaa suomalaisilta paidatkin pääl
      Maailman menoa
      164
      2850
    7. Tuntuuko ettet tiedä

      Enää miten toimia mun suhteen. Kun en taida tietää itsekään
      Ikävä
      25
      2419
    8. Onnettomuus

      Hukkajärventiellä kolaroi lavetti ja henkilöauto. Uutista ei missään! Hys hys ollaanko hiljaa tästäkin?
      Kuhmo
      4
      2390
    9. Sture Fjäder haluaa tuensaajien nimet julki

      Kokoomuspoliitikko haluaa yli 800 euroa kuukaudessa tukia saavien nimet julki. Ehkä olisi syytä julkaista myös kuvat? h
      Maailman menoa
      33
      2108
    10. Kirjotan ikävää ulos

      Haluaisin kuulla mitä ajattelet minusta. ihan mitä vaan mitä mietit. Voisit kertoa minulle, tai sitten kirjoittaisit run
      Ikävä
      14
      1858
    Aihe