Nabend!
Also ich habe folgendes: Mein Programm, also die GUI, ist ein JFrame, auf der mehrere JPanels liegen. Eines dieser JPanels (ich nenne es mal p) verändert sich zur Laufzeit, indem dort mehrere andere JPanels draufgelegt werden. Sollten es zu viele werden, vergrößert sich p automatisch, damit es groß genug bleibt um alle darzustellen. Entsprechend vergrößert sich auch das ganze JFrame, um p weiterhin ganz darzustellen.
Für den Fall, dass p gezwungen ist, größer als der Bildschirm zu werden, gilt natürlich auch das gleiche fürs JFrame. Nun wäre also ein JScrollPane ganz nützlich, damit nichts vom Bildschirmrand verschluckt wird - bis hierhin alles ganz logisch. Das Problem ist, es klappt leider nicht.^^
Ich bin mir nicht sicher, ob es daran liegt, dass ich JScrollPane irgendwie grundsätzlich missverstanden habe... oder daran, dass p erstmal nicht über den Bildschirm hinaus geht, erst zur Laufzeit... oder daran, dass ich den JFrame mit vergrößere, wann immer p sich vergrößert...
Hier jedenfalls mein Code (wenn auch stark gekürzt, will euch nicht alle 400 Zeilen zumuten). Zum Thema "es klappt nicht" - damit meine ich, dass keine Scrollbars angezeigt werden, auch nicht wenn sie nötig wären.
Über einen Button wird zeichne() aufgerufen und eine Liste von JPanels übergeben, die an anderer Stelle berechnet wird (alle dieser JPanels haben die gleiche Breite bzw Höhe). Die beiden Schleifen dort sorgen dafür, dass immer fünf JPanels pro Spalte auf graphPanel angezeigt werden. Die beiden letzten if-Abfragen testen dann, ob das Fenster vergrößert werden muss. Keine Ahnung ob zeichne() für mein Problem benötigt wird, aber vielleicht hilft es zum Verständnis. Vielleicht fällt ja jemandem auf, wo mein Fehler liegt.
Danke im Voraus!
PS: Möglicherweise liegt es auch an setLayout(null). Leider sehe ich mich für mein spezielles Programm nicht in der Lage, einen LayoutManager zu benutzen. Gibt es eine Möglichkeit, das auch ohne LayoutManager hinzukriegen?
Also ich habe folgendes: Mein Programm, also die GUI, ist ein JFrame, auf der mehrere JPanels liegen. Eines dieser JPanels (ich nenne es mal p) verändert sich zur Laufzeit, indem dort mehrere andere JPanels draufgelegt werden. Sollten es zu viele werden, vergrößert sich p automatisch, damit es groß genug bleibt um alle darzustellen. Entsprechend vergrößert sich auch das ganze JFrame, um p weiterhin ganz darzustellen.
Für den Fall, dass p gezwungen ist, größer als der Bildschirm zu werden, gilt natürlich auch das gleiche fürs JFrame. Nun wäre also ein JScrollPane ganz nützlich, damit nichts vom Bildschirmrand verschluckt wird - bis hierhin alles ganz logisch. Das Problem ist, es klappt leider nicht.^^
Ich bin mir nicht sicher, ob es daran liegt, dass ich JScrollPane irgendwie grundsätzlich missverstanden habe... oder daran, dass p erstmal nicht über den Bildschirm hinaus geht, erst zur Laufzeit... oder daran, dass ich den JFrame mit vergrößere, wann immer p sich vergrößert...
Hier jedenfalls mein Code (wenn auch stark gekürzt, will euch nicht alle 400 Zeilen zumuten). Zum Thema "es klappt nicht" - damit meine ich, dass keine Scrollbars angezeigt werden, auch nicht wenn sie nötig wären.
Java:
import javax.swing.*;
import javax.swing.JScrollBar;
import java.io.File;
import java.io.FileWriter;
import java.awt.event.*;
import java.awt.*;
import java.util.*;
import java.awt.geom.Rectangle2D;
import java.lang.Math;
public class Gui extends JFrame implements ActionListener
{
// GUI Komponenten
private JPanel panel; // Buttons etc.
private JPanel graphPanel; // Anzeige der Ausgabe
private static int graphPanelX = 860;
private static int graphPanelY = 590;
private static int guiX = 900;
private static int guiY = 900;
private JScrollPane scrollPane;
public Gui()
{
panel = new JPanel();
graphPanel = new JPanel();
scrollPane = new JScrollPane (graphPanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
this.add(scrollPane);
panel.setBounds(10, 10, 500, 250);
panel.setLayout(null);
graphPanel.setBounds(10,260,graphPanelX,graphPanelY);
graphPanel.setLayout(null);
Container contentPane = getContentPane();
contentPane.add(panel, BorderLayout.NORTH);
contentPane.add(graphPanel);
this.setTitle("Programm");
this.setSize(guiX,guiY);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(null);
this.setVisible(true);
}
public void zeichne(ArrayList<JPanel> jps)
{
int aktuelleBreite = graphPanelX;
int aktuelleLaenge = graphPanelY;
int guiBreite = guiX;
graphPanel.removeAll();
graphPanel.setBounds(10,260,graphPanelX,graphPanelY);
graphPanel.revalidate();
graphPanel.repaint();
int x = 10;
int y = 10;
int zaehler = 0;
JPanel jp = jps.get(0);
for(int i = 0; i < jps.size()/5; i++)
{
for(int j = 0; j < 5; j++)
{
jp = jps.get(i*5+j);
jp.setLayout(null);
jp.setBounds(x, y, Math.round(jp.getBreite()), Math.round(jp.getLaenge()));
graphPanel.add(jp);
y = y + Math.round(jp.getLaenge()) + 10;
}
y = 10;
x = x + Math.round(jp.getBreite()) + 10;
zaehler = zaehler + 5;
}
for(int k = 0; k < jps.size()%5; k++)
{
jp = jps.get(zaehler+k);
jp.setLayout(null);
jp.setBounds(x, y, Math.round(jp.getBreite()), Math.round(jp.getLaenge()));
graphPanel.add(jp);
y = y + Math.round(jp.getLaenge()) + 10;
}
int spalten = jps.size()/5;
if(jps.size()%5 > 0) spalten = spalten + 1;
if(spalten * (jp.getBreite()+10) + 10 > graphPanelX)
{
aktuelleBreite = spalten * Math.round(jp.getBreite()+10) + 10;
graphPanel.setBounds(10, 260, aktuelleBreite, graphPanelY);
guiBreite = guiBreite + aktuelleBreite - graphPanelX;
this.setSize(guiBreite, guiY);
}
if((jp.getLaenge()+10)*5 + 10 > graphPanelY)
{
aktuelleLaenge = Math.round(jp.getLaenge()+10) * 5 + 10;
graphPanel.setBounds(10, 260, aktuelleBreite, aktuelleLaenge);
this.setSize(guiBreite, guiY + aktuelleLaenge - graphPanelY);
}
graphPanel.revalidate();
graphPanel.repaint();
}
}
Über einen Button wird zeichne() aufgerufen und eine Liste von JPanels übergeben, die an anderer Stelle berechnet wird (alle dieser JPanels haben die gleiche Breite bzw Höhe). Die beiden Schleifen dort sorgen dafür, dass immer fünf JPanels pro Spalte auf graphPanel angezeigt werden. Die beiden letzten if-Abfragen testen dann, ob das Fenster vergrößert werden muss. Keine Ahnung ob zeichne() für mein Problem benötigt wird, aber vielleicht hilft es zum Verständnis. Vielleicht fällt ja jemandem auf, wo mein Fehler liegt.
Danke im Voraus!
PS: Möglicherweise liegt es auch an setLayout(null). Leider sehe ich mich für mein spezielles Programm nicht in der Lage, einen LayoutManager zu benutzen. Gibt es eine Möglichkeit, das auch ohne LayoutManager hinzukriegen?
Zuletzt bearbeitet: