03. februar 2003 - 14:59Der 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); } }
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
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.
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.
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); } }
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.