JScrollPane resized nicht richtig...

TKausL

Top Contributor
Hallo.

Habe folgenden Code:

Java:
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextField;


public class C extends JFrame {
	JTextField input = new JTextField();
	JButton nicklist = new JButton();
	JScrollPane scroll_nicklist = new JScrollPane();
	JButton output = new JButton();
	public C(){
		super("Test");
		setLayout(null);
		A.loggedin = true;
		addWindowListener(new java.awt.event.WindowAdapter() {
		    public void windowClosing(WindowEvent winEvt) {
		    	A.loggedin = false;
		    }
		});
		addComponentListener(new ComponentListener(){
			public void componentHidden(ComponentEvent e){}
			public void componentResized(ComponentEvent e){
				int x = getWidth();
				int y = getHeight();
				if(x < 500){
					x = 500;
				}
				if(y < 300){
					y = 300;
				}
				setSize(x, y);
				x = getContentPane().getWidth();
				y = getContentPane().getHeight();
				input.setBounds(0, y-28, x, 28);
				scroll_nicklist.setBounds(x-200, 0, 200, y-28);
				output.setBounds(0, 0, x-200, y-28);
				System.out.println("RESIZE auf " + getWidth() + "x" + getHeight());
				
			}
			public void componentShown(ComponentEvent e){}
			public void componentMoved(ComponentEvent e){}
			
		});
		input.setFont(new Font("MS Sans Serif", 0, 13));
		add(input);
		//add(nicklist);
		add(output);
	    scroll_nicklist.setVerticalScrollBarPolicy(20);
	    scroll_nicklist.setHorizontalScrollBarPolicy(30);
	    scroll_nicklist.setViewportView(nicklist);
	    add(scroll_nicklist);
	    nicklist.setPreferredSize(new Dimension(200, 493));
		setVisible(true);
	}
	



}

Das Problem ist, dass die rechte Pane nicht anständig mitresized. beim ersten resize tut sie garnichts, beim 2. resize nimmt sie die größe an, die sie beim 1. resize hätte annehmen müssen usw.
Kann man das irgendwie beheben?
 
Also du must genauer schreiben, was da nicht geht, ich kanns jetzt nicht nachvollziehen
Was du auf jeden Fall machen musst ist alles raus aus dem Konstruktor, im Konstruktor sollte man so wenig wie möglich machen und wenn dann nur eine Methode aufrufen aber nicht die ganze Logik.
Besser ist, wenn man im Konstruktor gar nichts hat und "C#draw..." aufrufen würde.

Zu deinem Problem: Ich glaube du sollst ein Layout verwenden, für das was du machen willst gibt es Layouts, das ist verlorene Mühe sowas nachprogrammieren.
Schau dir das BorderLayout oder wenns sein muss das GridBagLayout an, Du kannst die Layouts auch verschachteln, damit erreichst du auf jeden Fall dein
Das NullLayout ist nicht zu empfehlen.
lg


Java:
package jscrollpanetest;

import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextField;


public class C extends JFrame {

    JTextField input = new JTextField();
    JButton nicklist = new JButton("Button2");
    JScrollPane scroll_nicklist = new JScrollPane();
    JButton output = new JButton("Button1");
    public C(){
        super("Test");
        setLayout(null);
        A.loggedin = true;
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(WindowEvent winEvt) {
                A.loggedin = false;
            }
        });
        addComponentListener(new ComponentListener(){
            public void componentHidden(ComponentEvent e){}
            public void componentResized(ComponentEvent e){
                int x = getWidth();
                int y = getHeight();
                if(x < 500){
                    x = 500;
                }
                if(y < 300){
                    y = 300;
                }
                setSize(x, y);
                x = getContentPane().getWidth();
                y = getContentPane().getHeight();
                input.setBounds(0, y-28, x, 28);
                output.setBounds(0, 0, x-300, y-28);
                output.repaint();
                output.updateUI();
                scroll_nicklist.setBounds(x-200, 0, 250, y-28);
                scroll_nicklist.repaint();
                scroll_nicklist.updateUI();
                System.out.println("RESIZE auf " + getWidth() + "x" + getHeight());

            }
            public void componentShown(ComponentEvent e){}
            public void componentMoved(ComponentEvent e){}

        });
        input.setFont(new Font("MS Sans Serif", 0, 13));
        add(input);
        //add(nicklist);
        add(output);
        scroll_nicklist.setVerticalScrollBarPolicy(20);
        scroll_nicklist.setHorizontalScrollBarPolicy(30);
        scroll_nicklist.setViewportView(nicklist);
        add(scroll_nicklist);
        nicklist.setPreferredSize(new Dimension(200, 493));
        setVisible(true);
        }

    public static void main(String[] args) {
        new C();
        }
    }

class A {
    static boolean loggedin = false;
    }
 
Keine Ahnung,

Wieso ueberlaesst du das nicht dem LayoutManager? Damit gehts viel einfacher. Den ComponentListener kannst du dir auch sparen.

Java:
		// setLayout(null);
		input.setFont(new Font("MS Sans Serif", 0, 13));
		add(BorderLayout.SOUTH, input);
		add(BorderLayout.CENTER, output);
		scroll_nicklist.setVerticalScrollBarPolicy(20);
		scroll_nicklist.setHorizontalScrollBarPolicy(30);
		scroll_nicklist.setViewportView(nicklist);
		scroll_nicklist.setPreferredSize(new Dimension(200, 0));
		add(BorderLayout.EAST, scroll_nicklist);
		setMinimumSize(new Dimension(500, 300));
		setSize(500, 300);
		setVisible(true);
 
Hallo,

Danke ihr beiden, so geht es natürlich um einiges einfacher 😀
Eine Frage noch: wie erreicht man, dass das fenster als Vollbild (also Maximiert) gestartet wird?
 

Zurück
Oben