ScrollPane + Image

0

Siema mam banalny problem ale nie mam juz sily z nim walczyc, chcialbym aby w oknie mozna bylo scrollowac obraz, prosze o wytkniecie bledu w kodzie

JPanel panel = new
JPanel()
{
public void paintComponent(Graphics g)
{
if (image != null)
g.drawImage(image, 0, 0, null);

          }

      };

      JScrollPane imageScrollPanel = new JScrollPane();

        imageScrollPanel.getViewport().add(panel);
            panel.setPreferredSize(new Dimension(250,250));

    frame.add( imageScrollPanel, BorderLayout.CENTER );

    frame.add(panel);

[\code]

0

nie wiem na kiego grzyba dodajesz na koniec:
frame.add(panel);
i tam tkwi problem.

0

Chcialbym abys mnial racje ale to nic nie zmienia, Twojej podpowiedzi nadal nie mam Scrolla:(

0
Irekkk napisał(a)

Chcialbym abys mnial racje ale to nic nie zmienia, nadal nie mam Scrolla:(

0

jeżeli zastosujesz powyższy kod, usuwając ostatnią linię (frame.add(panel); ), i w dalszym ciągu nie masz scrolla, to błąd jest poza tym obszarem programu, siedzi gdzie indziej. Bez znajomości reszty kodu Ci nie pomogę.

EDIT: masz w ogóle frame'a wyświetlanego? Co się dzieje jak run'ujesz program?

0

Caly kod otwierania okna

public void createInternalFrame(final BufferedImage im, String t)
{
iframe = new JInternalFrame(t,
true,//zm rozm
true,//moz zamk
true,//max
true);//zw do ikony

        im.getGraphics().drawImage(img, 0, 0, null);
      JPanel panel = new
              JPanel()
      {
          public void paintComponent(Graphics g)
          {
              if (image != null)
                  g.drawImage(image, 0, 0, null);

          }

      };
      JScrollPane imageScrollPanel = new JScrollPane();

    panel.setPreferredSize(new Dimension(256,256));
    imageScrollPanel.setSize(500,500);

    imageScrollPanel.setViewportView(panel);

    iframe.getContentPane().add(imageScrollPanel, BorderLayout.CENTER);

    desktop.add(iframe);

// dodaje obiekt nasluchujacy zamkniecie ramki
iframe.addVetoableChangeListener(new
        VetoableChangeListener()
{
    public void vetoableChange(PropertyChangeEvent zdarzenie)
    throws PropertyVetoException
    {
        String name = zdarzenie.getPropertyName();
        Object value = zdarzenie.getNewValue();

        //sprawdza proby zamkniecia ramki
        if(name.equals("closed")&&value.equals(true))
        {
            //prosi o potwierdznie zamkniecia
            int result = JOptionPane.showInternalConfirmDialog(
                    iframe,"Ok to close?","Select an Option",JOptionPane.YES_NO_OPTION);

            // jesli nie zglasza veto
            if(result != JOptionPane.YES_OPTION)
                throw new PropertyVetoException("User canceled close",zdarzenie);

        }

    }
});

//ustala pozycje ramki
int width = desktop.getWidth()/2;
int height = desktop.getHeight()/2;
iframe.reshape(nextFrameX, nextFrameY, width, height);

 iframe.show();
//wybor ramki moze byc zawetowany
 try
  {
     iframe.setSelected(true);
  }
  catch (PropertyVetoException e)
  {}

}

0

Probowalem juz okreslac roznych kombinacji z okreslaniem rozm Scrolla bez itp itd wszystko na nic..
Hellp [glowa]

0

Nie jestem w stanie Ci pomóc ze skrawka programu, za dużo dalej mam zmiennych niewiadomych, w których mogą czaić się błędy ;). Ciągniesz kontekst graficzny z 'im' (ok, to jest BufferedImage), rysujesz na nim 'img' (1-co to za 'img'? Myślałem, że 'im' to obraz już przekazywany jako parametr całej metody, 2- nie rozumiem idei rysowania po 'im', dalej tej zmiennej nigdzie nie używasz), na panelu rysujesz nagle jakieś 'image' (j/w skąd to się wzięło?). Mogę jednak powiedzieć jak wcześniej, błąd nie siedzi w tamtym skrawku programu. Wrzuć na całość try&catch, zobacz czy niczym nie rzuca na lewo i prawo. I w dalszym ciągu nie powiedziałeś 'co się dzieje jak run'ujesz program?'. Odpala się? Widzisz frame z obrazem bez scrolla? W ogóle jest frame? To by więcej powiedziało w temacie 'co jest nie tak' w kodzie :).

0

Okienko uruchamia sie bez problemu tylko brak Scrolla, program jest w trakcie konstrukcji dlatego lekki problem z klarownoscia, parametr image jest typu BufferedImage, w sumie lepiej zmienic na
public void paintComponent(Graphics g)
{
if (im != null)
g.drawImage(im, 0, 0, null);

          }

dla lepszej widocznosci problemu, lecz to nie zmienia aktualnej formy dzialania programu, image jest zadeklarowany w polach statycznych( i dziala na pewno poprawnie swiadzczy o tym poprawne wczytanie obrazu)

0

Rozwiazanie problemu:D
class ImageDisplay extends JComponent
{

float ratio = 0;
int myWidth = 0, myHeight = 0;
public ImageDisplay(BufferedImage bi) {
    myWidth = bi.getWidth();
    myHeight = bi.getHeight();
    image = bi;
    ratio = ((float) myWidth) / myHeight;
    this.setPreferredSize(new Dimension(myWidth,myHeight));
}
public void paintComponent( Graphics g ) {
    Graphics2D g2d = (Graphics2D) g;

    g2d.drawImage(image,0,0,myWidth,myHeight,this);
    this.setPreferredSize(new Dimension(myWidth,myHeight));
    this.revalidate();
}

}

       try {

        ImageDisplay id =  new ImageDisplay(image);
        iframe.getContentPane().add(new JScrollPane(id));

        iframe.pack();

    } catch ( Exception e ) {
        e.printStackTrace();
    }

Prawie cala noc nad tym siedzialem [browar]

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0