GUI - resize frame

unknown

Bekanntes Mitglied
Hallo

Ich hab' eine Frage. Und zwar bei so einer Situation:

[Java]
JPanel myPanel = new JPanel(new GridLayout2, 1));
JLabel myTextLabel = new JLabel("My text");
JLabel myPicLabel = new JLabel(new ImageIcon("Bild.gif"));
myPanel.add(myTextLabel);
myPanel.add(myPicLabel);
pack();
[/Java]

Angenommen man kann die Textgrösse von "myTextLabel" ändern.
irgendeinmal hat der Text aber nicht mehr genügend Platz (wenn man ihn vergrössert) und deshalb kann man ein Teil davon nicht mehr sehen. Ich möchte allerdings, dass sich die Fenstergrösse (Frame Size) Analog der Textgrösse anpasst.

Sprich, wenn ich die Scriftgrösse 100 habe, möchte ich, dass das Frame automatisch eine Resize-Funktion vornimmt, so dass der Text immer noch genügend Platz hat und ganz sichtbar ist.

hätte da jemand eine Lösung?🙂
 
Zuletzt bearbeitet:
Naja, immer langsam, erstmal müsste das Label angepasst werden, dann der Frame etc. pp.

Wenn ich das nun ad hoc bräuchte würde ich wohl so anfangen.
Ich habe einfach mal als auslösendes Ereignis nen KeyListener verwendet.
Hilft vielleicht zum Start...

Java:
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;


public class FrmTest extends JFrame {
    private JTextField txf = new JTextField();
    private JLabel lbl = new JLabel();

    public FrmTest() {
        jbInit();
        
    }

    private void jbInit() {
        this.getContentPane().setLayout( null );
        this.setSize( new Dimension(400, 300) );
        txf.setBounds(new Rectangle(50, 35, 195, 25));
        lbl.setBounds(new Rectangle(50, 85, 195, 25));
        lbl.setBorder(BorderFactory.createBevelBorder(1));
        this.getContentPane().add(lbl, null);
        this.getContentPane().add(txf, null);
        
        txf.addKeyListener(new KeyAdapter(){
                public void keyReleased(KeyEvent e) {
                    String text = txf.getText();
                    int laenge = lbl.getFontMetrics(lbl.getFont()).stringWidth(text);
                    lbl.setBounds(lbl.getX(), lbl.getY(), laenge+5, lbl.getHeight());
                    lbl.setText(text);
                }
            });
    }
    
    public static void main(String[] args) {
        FrmTest frmT = new FrmTest();
        frmT.setVisible(true);
    }

}
 
danke für die Antwort
Allerdings wird bei meinem Fall die Labelgrösse schon angepasst. Das problem ist das Frame🙂

Im Moment geraten die Labels ineinander, sobald es nicht genügend gibt.
 
Nun im einfachen Fall musst du gar nicht viel tun, außer nach einer Größenänderung erneut
Code:
pack()
aufzurufen. Dafür muss man natürlich entsprechende LayoutManager verwenden.
 
wie bereits erwähnt : im einfachsten fall einfach noch mal pack() callen ...

NULL layout ist hier definitiv die falsche wahl ... die meisten gängigen layouts *border-, flow-, gridbag- layout* sollten das schaffen

ich denke das größte problem ist eher der fakt das das frame bereits angezeigt wird ...

ziemlich schmutziger würg-a-raund *bewusst so geschrieben*

Java:
JFrame.setVisible(false);
JFrame.pack();
JFrame.setVisible(true);

alternativ könnte man noch nach pack() sowas wie (re)validate() , update() , repaint() ... oder diese ganzen methoden callen ... hab da jetzt aber leider kein beispiel bei dem die framgröße angepasst wird ...
 
ich komme später wieder zu diesem Problem zurück.

Momentan ist eine neue Frage aufgetaucht:

Weiss jemand, wie man in einem JToolbar extra sagen kann, dass ein Component rechs eingefügt werden soll?

[Java]bar.add(new JButton(), BorderLayout.EAST); [/Java]
und
[Java]bar.add(new JButton(), SwingConstants.RIGHT); [/Java]

funktionieren nicht...
 
@TO
jo klar ... spring ruhig von einem zum anderen thema ... is ja egal das beides nichts mit ein ander zu tun hat aber beides in ein thread ... obwohl das 1te problem noch nicht mal gelöst ist schon gleich das nächste klären wollen ...

sehr schlechter arbeits-stil ...
 
Ein noch schlechterer Still wäre für jede Frage extra einen Thread zu erstellen. Das Problem bezieht sich ja auch auf GUI.

Ich bin an solchen Diskussionen wirklich nicht interessiert. Bitte sachlich bleiben!
 
nicht alle auf einmal Leute... 🙂

Also Resize anhand von "pack()" funktioniert definitiv nicht. hätte jemand eine andere Lösung?
 
Zuletzt bearbeitet:
Also Resize anhand von "pack()" funktioniert definitiv nicht. hätte jemand eine andere Lösung?

wie wäre es mit resize durch pack(); :autsch:

Java:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class ResizeDurchLabel {
	
	private JFrame frame;
	private JLabel label;
	private JButton button;
	private String inhalt = "Text";

	public ResizeDurchLabel() {
		
		frame = new JFrame("TestFrame");
		label = new JLabel(inhalt);
		button = new JButton("mehr");
			button.addActionListener(new ActionListener() {
				
				@Override
				public void actionPerformed(ActionEvent arg0) {
				verlaengern();	
				}
			});
		
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(label);
		frame.add(button, BorderLayout.SOUTH);
		
		frame.pack();
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
		
	}
	
	private void verlaengern(){
		inhalt += " und noch mehr Text";
		label.setText(inhalt);
		frame.pack();
	}

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

}
 
Ein noch schlechterer Still wäre für jede Frage extra einen Thread zu erstellen. Das Problem bezieht sich ja auch auf GUI.

Ich bin an solchen Diskussionen wirklich nicht interessiert. Bitte sachlich bleiben!

mag zwar sein das sich beides auf ein und die selbe GUI bezieht ... und das es vielleicht sinnvoll wäre wegen einer vermutlich bereits beantworteten frage kein neuen thread auf zu machen ...

aber hat dir noch niemand gesagt "eins nach dem anderen" ? 2 baustellen gleichzeitig führt nur zu noch größerer verwirrung ... also sollte man erstmal eins fertig machen bevor man sich ans nächste wagt ...

war ja auch nur so n tipp ... nicht das du irgendwann 100 probleme gleichzeitig in einen thread stopfen willst nur weil sich alle auf die selbe klasse beziehen ...


btw : da wir ja unten einen code haben bei dem durch pack() sehr wohl ein resize möglich ist *und das ohne weitere calls* würde mich mal der code interessieren mit dem du es versucht hast ...

ohne es zu wissen würde ich nämlich auf null-layout und setBounds() tippen
 

Zurück
Oben