Hallo liebe Java-forum Gemeinde,
ich hatte schon länger nicht mehr in Java programmiert und bin deshalb ein wenig eingerostet.
Folgendes Problem. Ich habe eine Visualisierung die sich in einem JScrollPane befindet. Diese soll immer die Width benutzen die sie zur Verfüfung hat, aber nicht mehr (also horizontal nicht scrollbar) und dann den Rest eben vertikal darstellen (vertikal immer scrollbar).
Wenn ich nun das Fenster vergrößere klappt alles wunderbar. Wenn ich es aber verkleinere dann veringert sich aber nicht die Width sondern bleibt gleich, wodurch nicht alles zu sehen ist.
Ich habe mal alle "Verschachtelungen" usw in folgendes Beispiel gepackt wo man das Verhalten sehen kann. Wenn man das Fenster Vergrößert wird immer schön im oberen linken viertel ein Rechteck gezeichnet. Wenn man die Fenster aber wieder verkleinert, verkleinert sich die Visualisierung leider nicht.
Irgendwie komm ich aber gerade leider nicht drauf wie ich das elegant mache.
Ziel ist also, dass das visPanel nie breiter wird wie das Frame.
ich könnte zwar sowas machen wie:
Es gibt aber doch sicher auch eine andere Möglichkeit? Die Variante wäre halt leider in das eigentliche Projekt nicht wirklich übertragbar. Bzw mir kommts einfach ned sauber vor
ich hatte schon länger nicht mehr in Java programmiert und bin deshalb ein wenig eingerostet.
Folgendes Problem. Ich habe eine Visualisierung die sich in einem JScrollPane befindet. Diese soll immer die Width benutzen die sie zur Verfüfung hat, aber nicht mehr (also horizontal nicht scrollbar) und dann den Rest eben vertikal darstellen (vertikal immer scrollbar).
Wenn ich nun das Fenster vergrößere klappt alles wunderbar. Wenn ich es aber verkleinere dann veringert sich aber nicht die Width sondern bleibt gleich, wodurch nicht alles zu sehen ist.
Ich habe mal alle "Verschachtelungen" usw in folgendes Beispiel gepackt wo man das Verhalten sehen kann. Wenn man das Fenster Vergrößert wird immer schön im oberen linken viertel ein Rechteck gezeichnet. Wenn man die Fenster aber wieder verkleinert, verkleinert sich die Visualisierung leider nicht.
Code:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class JPanelInJSLiderTest {
/**
* @param args
*/
public static void main(String[] args) {
JFrame testFrame = new JFrame();
testFrame.setSize(500,500);
JPanel allPanel = new JPanel();
allPanel.setLayout(new BorderLayout());
JPanel secondPanel = new JPanel();
secondPanel.setLayout(new BorderLayout());
final JComponent visPanel = new JComponent() {
@Override
public void paint(Graphics g) {
g.setColor(Color.RED);
g.fillRect(0, 0, this.getWidth()/2, this.getHeight()/2);
}
@Override
public int getHeight() {
return getWidth()*3;
}
@Override
public Dimension getPreferredSize() {
return new Dimension(getWidth(), getHeight());
}
};
final JScrollPane visScroller = new JScrollPane();
visScroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
visScroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
visScroller.addComponentListener(new ComponentListener() {
@Override
public void componentShown(ComponentEvent e) {
// TODO Auto-generated method stub
}
@Override
public void componentResized(ComponentEvent e) {
// visScroller.setViewportView(visPanel);
}
@Override
public void componentMoved(ComponentEvent e) {
// TODO Auto-generated method stub
}
@Override
public void componentHidden(ComponentEvent e) {
// TODO Auto-generated method stub
}
});
secondPanel.add(visPanel, BorderLayout.CENTER);
visScroller.setViewportView(secondPanel);
allPanel.add(new JLabel("Lalelu"), BorderLayout.NORTH);
allPanel.add(visScroller, BorderLayout.CENTER);
testFrame.add(allPanel);
testFrame.setVisible(true);
testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
Irgendwie komm ich aber gerade leider nicht drauf wie ich das elegant mache.
Ziel ist also, dass das visPanel nie breiter wird wie das Frame.
ich könnte zwar sowas machen wie:
Code:
@Override
public int getWidth() {
return testFrame.getWidth();
}
Es gibt aber doch sicher auch eine andere Möglichkeit? Die Variante wäre halt leider in das eigentliche Projekt nicht wirklich übertragbar. Bzw mir kommts einfach ned sauber vor