Archiv verlassen und diese Seite im Standarddesign anzeigen : JScrollPane, kein Schieberegler
Hallo Leute,
ich mache gerade meine ersten Gehversuche mit JScrollPane.
Was ich hinbekomme, sind die Rahmen für die Schieberegler, der Rest fehlt leider.
Bisheriger Code:
static void init_gui()
{
gamepanel.addMouseListener(mausdap);
gamepanel.setSize(new Dimension(1600,1200));
JScrollPane jsp =new JScrollPane(gamepanel);
jsp.setHorizontalScrollBarPolicy(JScrollPane.HORIZ ONTAL_SCROLLBAR_ALWAYS);
jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICA L_SCROLLBAR_ALWAYS);
// JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED
jsp.setPreferredSize(new Dimension(800,600));
JFrame frame=new JFrame(gname);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOS E);
frame.setJMenuBar(mach_menubar());
frame.add(jsp,BorderLayout.CENTER);
frame.setSize(800,600);
frame.setVisible(true);
load_config();
}
gamepanel ist ein JPanel und wird maximal bis 1600x1200 bepinselt.
Es soll in einem 800x600-Ausschnitt gescrollt werden. Aber bisher wird bei Frameende (800x600 bei Start) immer schnöde abgeschnitten, von Scrollmöglichkeit keine Spur!
so long,
BlueJay
Tha, statt gamepanel.setSize musste es
gamepanel.setPreferredSize(new Dimension(gamepanel.sxmax,gamepanel.symax));
heissen!
Da soll aber auch einer drauf kommen!
Die Sache mit dem JScrollPane ist noch nicht um:
Nun reagiert der Bursche zwar mit Scrollbars, aber wenn er das Panel neu berechnen soll, verrechnet er sich leider, und das gründlich.
(Sun Java 1.6.0_03)
Code:
static public void buttonklick(ActionEvent e)
{ int i,kommando=-1;
for (i=0; i<commands.length; i++) if (commands[i] .equals(e.getActionCommand())) kommando=i;
switch(kommando)
{ case 0: gamepanel.set_screen(0); break;
case 1: gamepanel.set_screen(0); my_spiel.zeige_zuege(); break;
case 2: gamepanel.set_screen(1); break;
case 3: aufraeumen(); break;
case 4: tfeld=tileset[tilesetliste.getSelectedIndex()].split(",");
case 5: gamepanel.set_screen(2); break; // hilfe
case 6: popup(info); break;
default: gamepanel.set_screen(-1); // Titelbild
}
gamepanel.repaint();
// gamepanel.setPreferredSize(new Dimension(gamepanel.get_xmax(),gamepanel.get_ymax( )));
gamepanel.setPreferredSize(new Dimension(1600,1200)); //***
gamepanel.revalidate();
System.out.println(jsp.getHorizontalScrollBar().ge tMaximum()+"/"+jsp.getVerticalScrollBar().getMaximum());
}
Problem:
Setze ich bei gamepanel.setPreferredSize(new Dimension(1600,1200));
irgendwas anderes ein als die Daten, mit denen das Ganze initialisiert wurde, werden die Scrollbalken falsch berechnet, ebenso, wenn sich der Screensize ändert (Fenster->Fullscreen und zurück).
Ich habe bisher schon probiert, den jsp (JScrollPane) und den frame global zu machen und letzterem ein pack() zu verpassen, das sorgte auch nur dafür, dass die Scrollbalken mit denselben falschen Werten gefüttert wurden, wie es ein revalidate mit Ändern des Screen- oder gamepanel-Size taten.
Zur Illustration:
Solange man die Pfoten von irgendwelchen Resizes von gamepanel sowie der Fenstergröße lässt, wird korrekt 1600/1200 angezeigt.
Wenn nicht, schrumpft das Scrollbar-Maximum auf bis zu 800x600 (frame-größe) oder auf die Größe, auf die man das Fenster aufzieht, was gerade der größere Wert ist.
Was wurde da vergessen?
so long,
BlueJay
Soweit ich mich errinnere, hat bei mir bei solchen Problemen immer ein
.setVisible(true);
geholfen - egal ob die Komponente schon sichtbar war oder nicht (wird dann irgendwie neugezeichnet). Und sonst ev. zuerst ein false und dann ein true (gleich nacheinander).
MfG Bischi
Hab's mal eingebaut und sowohl auf gamepanel als auch auf jsp losgelassen, selbe Ka*** in Grün :(
Solang man die Anfangswerte nimmt, werden die Scrollbars richtig angezeigt, man kann sogar korrekt damit scrollen. Einmal die Fenstergröße geändert, und der meint, den gamepanel wieder auf 800x600 oder aktuelle Fenstergröße schrumpfen lassen zu müssen, sogar beim Betätigen des (zunächst korrekt eingestellten) Schiebereglers.
Das Problem ist ja diesmal nicht, dass er nix tut, sondern das, was er da tut, ist falsch!
Habe auch mal versucht, den Scrollbars per Hand die richtige Größe beizufüttern, die Darstellung ist so falsch wie eh' und je.
Code:
gamepanel.repaint();
gamepanel.setPreferredSize(new Dimension(gamepanel.get_xmax(),gamepanel.get_ymax( )));
gamepanel.revalidate();
// gamepanel.setPreferredSize(new Dimension(1600,1200)); // Anfangswerte
// jsp.setViewportView(gamepanel); // Viewport neu setzen
jsp.revalidate();
jsp.getHorizontalScrollBar().setMaximum(gamepanel. get_xmax());
jsp.getVerticalScrollBar().setMaximum(gamepanel.ge t_ymax());
jsp.setVisible(false);
jsp.setVisible(true);
System.out.println("Min to Max:");
System.out.println(jsp.getHorizontalScrollBar().ge tMinimum()+"/"+jsp.getVerticalScrollBar().getMinimum());
System.out.println(jsp.getHorizontalScrollBar().ge tMaximum()+"/"+jsp.getVerticalScrollBar().getMaximum());
Den Viewport habe ich auch mal neu überschrieben, hat nix gebracht.
Als weiteres habe ich mal einen Delay eingebaut (bis 500ms), der hat aber auch nichts gebracht. Es liegt also nicht an zu lahmer Berechnung.
so long,
BlueJay
mehlvogel
10-12-2007, 18:44
Hast du mal die Methoden set{Maximum,Minimum}Size versucht?
Stehen in den Zeilen vor Bischis Vorschlag.
Nahm er sich nichts von an :(
Der Schuldige scheint wohl das gamepanel zu sein. Packe ich dies in ein Zwischenpanel und übergebe das an JScrollpane, funktioniert's mit den Scrollbalken.
gamepanel ist ein Objekt einer von JPanel abgeleiteten Klasse, und eigintlich will ich nur dieses Panel in dem jsp haben, alles andere gibt fürchterliche Ränder, obendrein wird das gamepanel abgeschnitten dargestellt (Platzmangel).
Hier nochmal der Konstruktor vom gamepanel:
class spielfeld extends JPanel
{
static int cmax=36;
// Bildschirmparameter:
static final int sxmax=1280;
static final int symax=960;
static int axmax=800;
static int aymax=600;
static int dx=28;
static int dy=28;
.. (einige Definitionen weggelassen)
static BufferedImage bima=new BufferedImage(sxmax,symax,BufferedImage.TYPE_INT_A RGB);
Graphics gb=bima.getGraphics();
int aktscreen=-1;
main mama; // parent
public spielfeld(main parent)
{ mama=parent;
p_game=mama.my_spiel;
init_data();
}
// slots:
public void set_screen(int nr) { aktscreen=nr; }
... u.s.w.
public void paintComponent(Graphics g)
{
...
Also eigentlich alles Standard. Es spielt auch keine Rolle, ob man ihm ein Layout verpasst oder nicht, die Scrollbarberechnung ist genauso falsch.
so long,
BlueJay
Hier die vorläufig entgültige Version:
class main
{
...
static JFrame frame=new JFrame(gname);
static JScrollPane jsp =new JScrollPane();
static JPanel zwischenlager=new JPanel();
static main self=new main();
static zeichenfeld gamepanel=new zeichenfeld(self); // parent uebergeben
...
static void init_gui()
{
// der hier kann nicht mit JScrollPane zusammenarbeiten
gamepanel.addMouseListener(mausdap);
gamepanel.setPreferredSize(new Dimension(gamepanel.sxmax,gamepanel.symax));
// aber der hier kann!
zwischenlager.setLayout(new BorderLayout());
zwischenlager.add(gamepanel,BorderLayout.CENTER);
zwischenlager.setPreferredSize(new Dimension(gamepanel.sxmax,gamepanel.symax));
jsp.setHorizontalScrollBarPolicy(JScrollPane.HORIZ ONTAL_SCROLLBAR_AS_NEEDED);
jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICA L_SCROLLBAR_AS_NEEDED);
jsp.setViewportView(zwischenlager);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOS E);
frame.setJMenuBar(mach_menubar());
frame.add(jsp,BorderLayout.CENTER);
frame.setSize(800,600); // Startgroesse
frame.setVisible(true);
load_config();
}
...
}
Lt. Sun kann JScrollPane nur mit Lightweight-Komponenten zusammen arbeiten, der abgeleitete JPanel zum Draufzeichnen war wohl schon zu heavy.
so long,
BlueJay
anda_skoa
13-12-2007, 19:30
Lt. Sun kann JScrollPane nur mit Lightweight-Komponenten zusammen arbeiten, der abgeleitete JPanel zum Draufzeichnen war wohl schon zu heavy.
Lightweight im Kontext Java GUI bedeutet normalerweise nur, dass die entsprechende Komponenten keinen direkten AWT Peer hat, also meistens bedeutete, dass es Swing-only ist und alles Grafische mit Java2D gezeichnet wurde.
Ciao,
_
Hatte mich hierauf bezogen:
There is no native code required to process lightweight components, hence handling of lightweights is 100% implemented in common java code,
So und ähnlich findet man es im Internet.
http://java.sun.com/j2se/1.3/docs/guide/awt/designspec/lightweights.html
Da hätte der JScrollpane bei dem gamepanel (JPanel mit Graphics2D bepinselt) aber nicht so rumzicken dürfen.
http://java.sun.com/products/jfc/tsc/articles/mixing/
Tatsächlich pfuscht ihm wohl Graphics2D als awt-Komponente ins Handwerk.
Naja, durch den Zwischenpanel pariert ja jetzt das Ganze, man kann sogar die gamepanel-Größe dynamisch ändern, und alles läuft, wie es soll.
so long,
BlueJay
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.