JScrollPane nachbauen (klitzekleiner Haken)

Status
Nicht offen für weitere Antworten.

gpxricky

Mitglied
Hi ihr alle,

ich versuche zur Zeit, eine JScrollPane nachzubauen. Nicht vom Prinzip, sondern einzig und allein vom Layout.
Nun sollte das eigentlich nicht so schwer sein - dachte ich zumindest.

Bis jetzt schaut meine "nachgebaute" ScrollPane noch so aus:

Code:
---------------------------------
|                          | /\ |
|                          |----|
|                          |    |
|                          |    |
|                          |    |
|                          |    |
|                          |    |
|                          |----|
|                          | \/ |
---------------------------------
|  < |                     | >  |
---------------------------------


Ich stehe nun vor dem großen Problem, dass ich am unteren, rechten Rand ein kleines Eckchen haben möchte, so dass die ScrollPane in etwa so ausschaut:

Code:
---------------------------------
|                          | /\ |
|                          |----|
|                          |    |
|                          |    |
|                          |    |
|                          |    |
|                          |    |
|                          |----|
|                          | \/ |
---------------------------------
|  < |                | >  |    |
---------------------------------

Mein Code sieht folgendermaßen aus, aber wie gesagt, schaffe ich es einfach nicht, das Eckchen vernünftig reinzukriegen, so dass es genauso breit und hoch wie der Button der ScrollBar ist. Vielleicht brauche ich einen anderen LayoutManager, aber ich habe echt schon alles versucht und wäre über Eure Hilfe sehr dankbar.

Code:
public class ScrollPane extends JPanel {

  private JPanel borderPanel = new JPanel();

  private JPanel mainScrollPanel = new JPanel();

  private JScrollBar verticalScrollBar = new JScrollBar(JScrollBar.VERTICAL);
  private JScrollBar horizontalScrollBar = new JScrollBar(JScrollBar.HORIZONTAL);

  private final static String STR_SETTINGS_TITLE = "Diagrammeinstellungen:";

  public ScrollPane() {
    this.setLayout(new BorderLayout());

    borderPanel.setBackground(Color.GREEN);

    mainScrollPanel.setLayout(new BorderLayout());

    mainScrollPanel.add(verticalScrollBar, BorderLayout.EAST);
    mainScrollPanel.add(horizontalScrollBar, BorderLayout.SOUTH);
    mainScrollPanel.add(borderPanel, BorderLayout.CENTER);

    this.add(ganttScrollPanel, BorderLayout.CENTER);

    // ... weitere Elemente werden noch draufgehauen, aber das spielt ja keine Rolle mehr!
  }
}

Grüßle

gpxricky
 
Darf man fragen warum du eine JScrollPane nachbauen willst??? Du solltest deine Klasse ausserdem nicht ScrollPane nennen, da es diese Klasse schon im AWT gibt.
 
Ich würde die Klasse von JScrollPane ableiten und die Methoden, die bei Dir anders sein sollen überschreiben...
 
Das GridBagLayout? Hm, leider verstehe ich nicht, wie ich das mit dem GridBagLayout lösen könnte, kann mir da vielleicht jemand ne Hilfe geben?
 
Mit Hilfe des GridBagLayout kannst Du Contraints definieren, die das Aussehen der UI bestimmen... Ist z.B. im javabuch erklärt.

Aber trotzdem nochmal die Frage: Was ist dein Ziel? Warum baust Du eine vorhandene Komponente nach???
 
;-) Ok, ich versuchs mal zu erklären:

Also, ich will folgendes:

In einer Art Scrollpane soll sich ein JPanel befinden, dass jedoch nicht mit den ScrollBars der ScrollPane gesteuert werden soll. In dem JPanel befindet sich eine Art Diagramm, mit x- und y-Achse und dem enstprechenden Diagramm.

Ich weiß, dass mit der JScrollPane sowas in der Art möglich ist, eine x-Achse kann man z.B. mit columnHeader setzen, aber es gibt mehrere Probleme:

1.) In der ScrollPane muss sich zuerst ein "fester" JPanel befinden, erst darin soll das Diagramm mit den Achsen sein, dass scrollbar ist. Dieses feste JPanel benötige ich deshalb, um das gerade sichtbare Diagramm mittels der Bibliothek VectorGraphics zu exportieren (und am einfachsten ist es, VectorGraphics ein JPanel zu übergeben, die Bibliothek ruft dann die paint-Methode auf und schreibt sie in eine Datei).

2.) Die x-Achse, die man mit columnHeader setzen kann, befindet sich immer am oberen Rand des ScrollPanes, ich will ihn aber an den unteren Rand der Pane setzen.

Grüßle

gpxricky
 
Hm, ich bin heute morgen auf ne neue Idee gekommen. Man könnte ja auch die JScrollPane irgendwie umschreiben (und damit COLUMN_HEADER am unteren Rand ist, müsste man auch irgendwie ScrollPaneLayout umschreiben), so dass die Sache funktioniert.

Leider gibts aber immer ne NullPointerException :-(((

Hier der Code:

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

public class DiagramScrollPane extends JScrollPane {
  private JScrollPane insideScrollPane = new JScrollPane(null,
      VERTICAL_SCROLLBAR_NEVER, HORIZONTAL_SCROLLBAR_NEVER);
  private JViewport insideViewport = new JViewport();

  public DiagramScrollPane() {
    setLayout(new ScrollPaneLayout.UIResource());
    setVerticalScrollBarPolicy(VERTICAL_SCROLLBAR_ALWAYS);
    setHorizontalScrollBarPolicy(HORIZONTAL_SCROLLBAR_ALWAYS);

    // Zwei neue Zeilen
    insideViewport.setView(insideScrollPane);
    add(insideViewport, VIEWPORT);
    // Ende der neuen Zeilen

    setVerticalScrollBar(createVerticalScrollBar());
    setHorizontalScrollBar(createHorizontalScrollBar());
    setOpaque(true);
    updateUI();

    if (!this.getComponentOrientation().isLeftToRight()) {
        viewport.setViewPosition(new Point(Integer.MAX_VALUE, 0));
    }
  }
   
  public void setViewportView(Component view) {
    insideScrollPane.setViewportView(view);
  }
  
  public JViewport getViewport() {
    return insideScrollPane.getViewport();
  }

  public void setRowHeaderView(Component view) {
    insideScrollPane.setRowHeaderView(view);
  }
  
  public JViewport getRowHeader() {
      return insideScrollPane.getRowHeader();
  }


  public void setColumnHeaderView(Component view) {
    insideScrollPane.setColumnHeaderView(view);
  }
  
  public JViewport getColumnHeader() {
      return insideScrollPane.getColumnHeader();
  }
}

Ich krieg die Sache echt nicht hin und bräuchte wirklich dringend Hilfe :-(((
 
Die Methode DiagramScrollPane#getViewport liefert eine NullPointerException, weil 'insideScrollPane' noch nicht initialisiert ist!
 
Wenn du GBL nimmst, hier mal als Tip die ersten Eigenschafte die in den GridBagConstraints sein müssten, in der Reihenfolge wie im Konstruktor:
Der Viewport: 0, 0, 1, 1, 1, 1, CENTER, BOTH
Rechter Scrollbalken: 1, 0, 1, 1, 0, 1, CENTER, HORIZONTAL
Unterer Scrollbalken: 0, 1, 1, 1, 1, 0, CENTER, VERTICAL
 
Hey, wow, tausend Dank!
Die Sache mit dem GridBagLayout war wirklich genial und wenn mans mal verstanden hat, ist es eigentlich auch ziemlich simpel. Nochmals danke für eure Hilfe ;-)

gpxricky
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben