PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ,,Umstieg" von Canvas auf JPanel


Evalley
2006-05-10, 15:03:00
erledigt

Monger
2006-05-10, 15:30:30
Ich verstehe nicht was du meinst. Ein Panel ist ein Panel, ein Canvas ist ein Canvas. Auf einem Canvas kannst du zeichnen, auf einem Panel nicht. In ein Frame kannst du ein Panel oder einen Canvas einbetten. Du kannst einen Canvas aber auch in ein Panel einbetten, was wiederum in ein Frame eingebettet ist...


Was genau willst du denn erreichen, dass du jetzt von Canvas weg willst?

Evalley
2006-05-10, 15:42:19
erledigt

Monger
2006-05-10, 16:02:17
Evalley[/POST]']
Die eigentliche Frage ist also, wie ich innerhalb einer Canvas zeichenfläche per JScrollPane scrollen kann.

Gute Frage. Ich wollte selber mal für mein Programm für verschiedene Elemente Scrollbalken einrichten, hab es aber noch nicht ausprobiert...


Von der Idee her muss man wohl unterscheiden zwischen dem Platz den ein Element einnehmen darf, und dem dargestellten Bereich. Damit irgendwas scrollen kann, muss der äußere Bereich fest, und der innere variabel sein...

Meiner Meinung nach kann es eigentlich nur so sein, dass du ein variabel großes Canvas hast, dass du in ein fixes Panel einbettest. Nicht der Canvas hat dann die Scrollbalken, sondern das außenrum. Das setzt allerdings voraus, dass du deinen Zeichenbereich dynamisch deinen gezeichneten Objekten anpasst...

Sag mir wenn du eine Lösung gefunden hast, würde mich auch interessieren! :)

Senior Sanchez
2006-05-10, 16:43:57
Monger[/POST]']Gute Frage. Ich wollte selber mal für mein Programm für verschiedene Elemente Scrollbalken einrichten, hab es aber noch nicht ausprobiert...


Von der Idee her muss man wohl unterscheiden zwischen dem Platz den ein Element einnehmen darf, und dem dargestellten Bereich. Damit irgendwas scrollen kann, muss der äußere Bereich fest, und der innere variabel sein...

Meiner Meinung nach kann es eigentlich nur so sein, dass du ein variabel großes Canvas hast, dass du in ein fixes Panel einbettest. Nicht der Canvas hat dann die Scrollbalken, sondern das außenrum. Das setzt allerdings voraus, dass du deinen Zeichenbereich dynamisch deinen gezeichneten Objekten anpasst...

Sag mir wenn du eine Lösung gefunden hast, würde mich auch interessieren! :)

Genauso läuft das ;)

Ich habe so etwas vor kurzem mal für die JDesktopPane geschrieben, weil die ja nicht scrollen kann ;)

Dort habe ich die Größe der JDesktopPane immer dem "äußersten" JInternalFrame angepasst. Die JScrollPane stellt daraufhin dann Balken dar, sobald die interne Komponente größer ist als der JViewport es erlaubt.

HellHorse
2006-05-10, 17:58:14
zu Canvas <-> JPanel:
Canvas ist ja eine AWT Klasse. Wenn man Swing verwendet ist das natürlich suboptimal und es ist besser wenn man statt dessen JComponent subclasst (JPanel ist ein Container, es macht nicht wirklich Sinn es zu subclassen bloss zum zeichnen, gehen tut es natürlich schon) und dort #paintCompontent overridet.

Monger
2006-05-10, 18:07:05
Ich weiß, dass man auch direkt in das Content Pane vom Frame painten kann. Als ich mal mit Java3D was gemacht habe, ging das genau so. Aber das macht natürlich nur Sinn, wenn man das gesamte Rendern in dem entsprechenden Bereich dann auch übernimmt, ansonsten wird es unheimlich hässlich...

Solange man kein Vollbild und/oder 3D haben will, ist ein eingelagertes Canvas bestimmt die bessere Wahl.

Evalley
2006-05-10, 21:36:12
erledigt

Evalley
2006-05-11, 13:26:34
erledigt

Monger
2006-05-11, 13:57:04
Evalley[/POST]']
Führt man den folgenden Code aus so bekommt man auch Scrollbalken, allerdings scrollt er mir die ganze Zeichenfläche über die Scrollbalken.
Den Satz verstehe ich nicht. Könntest du den nochmal genauer erläutern? Mir fehlt da grade die Vorstellungskraft...

Evalley
2006-05-11, 14:08:20
erledigt

Monger
2006-05-11, 15:14:05
Sind denn die Scrollbalken jetzt wirklich Bestandteil des umgebenden Panels?

Evalley
2006-05-11, 15:40:27
erledigt

Monger
2006-05-11, 15:51:22
Lass mal das normale Panel weg, und adde auch nicht die Zeichenfläche.

Sag einfach nur:


JScrollpane pane = new JScrollpane(new Zeichenfläche());

add(pane);


Ich vermute, dass du hier zwei Elemente hast die sich überlagern. Das muss nicht sein, weil das JScrollPane einen eigenen Renderbereich hat, der beliebig assoziert werden kann. Auf jeden Fall wird es im JScrollPane Tutorial so gemacht.

Evalley
2006-05-11, 16:56:35
erledigt

Monger
2006-05-11, 17:25:25
Evalley[/POST]']Bringt leider überhaupt keine Veränderung. Ich schätze mal, dass es wirklich an dem nicht implementierten Interface Scrollable liegt.

OK...
Anscheinend ist das JSrollable Interfache vorallem für Tabellen o.ä. gedacht. Aber hast du dir das hier schonmal durchgelesen?

http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/JViewport.html

Zumindest auf den ersten Blick scheint es mir, als würde der Viewport selbst Möglichkeiten zum painten geben. Und den Viewport müsstest du dem JScrollPane zuweisen können.

HellHorse
2006-05-11, 18:19:19
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.Scrollable;

import static java.awt.Color.BLACK;

import static javax.swing.SwingUtilities.invokeLater;
import static javax.swing.BorderFactory.createEmptyBorder;

import static javax.swing.WindowConstants.EXIT_ON_CLOSE;
import static javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;
import static javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED;

import static java.awt.BorderLayout.CENTER;
import static java.awt.BorderLayout.SOUTH;

public class Cross extends JComponent implements Scrollable {

private Dimension size;

public Cross(Dimension size) {
this.size = size;
}

public Cross() {
this(new Dimension(300, 300));
}

public Dimension getPreferredSize() {
return this.size;
}

public void paintComponent(Graphics g) {
g.setColor(BLACK);
g.drawLine(0, 0, (int) size.getWidth(), (int) size.getHeight());
g.drawLine(0, (int) size.getWidth(), (int) size.getHeight(), 0);
}

public Dimension getPreferredScrollableViewportSize() {
return this.size;
}

public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
return 1;
}

public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
return 1;
}

public boolean getScrollableTracksViewportWidth() {
return false;
}

public boolean getScrollableTracksViewportHeight() {
return false;
}

protected static void createFrame() {
JFrame frame = new JFrame("Scroll Demo");
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);

JScrollPane scrollPane = new JScrollPane(new Cross(), VERTICAL_SCROLLBAR_AS_NEEDED, HORIZONTAL_SCROLLBAR_AS_NEEDED);

BorderLayout layout = new BorderLayout();

JComponent contentPane = (JComponent) frame.getContentPane();
contentPane.setLayout(layout);
contentPane.setBorder(createEmptyBorder(12, 12, 11, 11));

contentPane.add(scrollPane, BorderLayout.CENTER);

frame.setBounds(200, 200, 300, 300);

frame.setVisible(true);
}

public static void main(String[] args) {
invokeLater(new Runnable() {
public void run() {
createFrame();
}
});
}
}

Fragen?

Evalley
2006-05-11, 19:15:30
erledigt