Avatar billede ng-km Nybegynder
03. februar 2003 - 14:59 Der er 4 kommentarer og
1 løsning

JScrollPane over et JPanel

Ud fra følgende kode, vil jeg gerne kunne scrolle så jeg kan komme hen til cirkel nr 2 også. Hvordan gør jeg det, eller spurgt på en anden måde hvad gør jeg forkert her, eftersom det ikke virker?

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

public class Scrollprojekt extends JFrame
{
  public Scrollprojekt()
  {
    setSize(300,300);
    setTitle("Scrollprojekt");
    getContentPane().setLayout(null);

        Billede billede = new Billede();

        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setBounds(10,10,270,250);
        scrollPane.getViewport().setView(billede);
      getContentPane().add(scrollPane);
  }
   
    class Billede extends JPanel
    {
        public Billede()
        {
            setSize(800,800);
        }
       
        public void paint(Graphics g)
        {
            g.drawOval(40,40, 20, 20);//cirkel nr 1
            g.drawOval(500,500, 20, 20);//cirkel nr 2
        }
    }
   
    public static void main(String args[])
    {
        Scrollprojekt sp = new Scrollprojekt();
        sp.setVisible(true);
    }
}
Avatar billede per_s Nybegynder
03. februar 2003 - 15:24 #1
Hvis dit billede (dit JPanel objekt) ikke implementerer Scrollable interfacet -- hvilket det ikke gør som standard -- så bruger JScrollPane størrelsen fra getPreferredSize().

Så, hvis du erstatter "setSize(800,800)" med "setPreferredSize(new Dimension(800,800))" så vil du få scrollbar'er på JScrollPane.

Hvis du implementerer Scrollable interfacet vil du dog få større kontrol over hvordan der scrolles.

/per_s
Avatar billede ng-km Nybegynder
03. februar 2003 - 22:25 #2
Jeg har prøvet dine forslag, men kan ikke få det til at virke.

setPreferredSize(..)-løsningen gør helt som den selv vil.

Scrollable-løsningen har jeg ikke fået til at køre med scrollbars, der må ligge mere bag end bare interfacet, for at få det til at virke, eller også bruger jeg bare metoderne forkert.

Jeg har imidlertid lavet min egen MyScrollPane vha. 2 JScrollBars på et JPanel, og implementeret det med min egen MyScrollPaneListener. Løsningen er måske ikke helt så generel som man kunne ønske, men den virker rigtigt godt. Jeg lægger gerne koden hvis der er nogen der måske kan bruge den.
Avatar billede =maddog= Nybegynder
04. februar 2003 - 02:32 #3
Du har glemt adskillige ting!
1) Du har ikke overskrevet de to metoder getMinimumSize og getPreferredSize. Uden disse har LayoutManageren ikke en chance for at regne ud hvor stort Componenten er.
2) Du kalder ikke paint metoden i super klasse (JPanel), hvilket betyder at panelet ikke gentegnes fra dobbelt-bufferen. Prøv evt. at slette super.paint(g) i metoden paint(Graphics g) og se hvad jeg mener. De eneste super objekt jeg kan komme i tanke om der kan undvære dette er Component, som har LightweightPeer.

Det ser nogenlunde således ud:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ScrollProject extends JFrame
{
 
  public ScrollProject()
  {
      setSize(300,300);
    setTitle("Scrollprojekt");
    getContentPane().setLayout(null);

        Billede billede = new Billede();

        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setBounds(10,10,270,250);
        scrollPane.getViewport().setView(billede);
      getContentPane().add(scrollPane);
  }
   
    class Billede extends JPanel
    {
        public Billede()
        {
            setSize(800,800);
        }
       
        public Dimension getMinimumSize() { return new Dimension(800,800); }
        public Dimension getPreferredSize() { return new Dimension(800,800); }
       
       
        public void paint(Graphics g)
        {
            super.paint(g);
            g.drawOval(40,40, 20, 20);//cirkel nr 1
            g.drawOval(500,500, 20, 20);//cirkel nr 2
        }
    }
   
    public static void main(String args[])
    {
        JFrame sp = new ScrollProject();
        sp.setVisible(true);
    }
}
Avatar billede ng-km Nybegynder
04. februar 2003 - 23:20 #4
=maddog=  ->  Alletiders. Det virker. Så nu ryger min egen ScrollPane ud af programmet til fordel for den mere generelle.

Tak for hjælpen.
Avatar billede =maddog= Nybegynder
04. februar 2003 - 23:45 #5
altid til tjeneste
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester