JList "springt"

  • Themenstarter Themenstarter ZwEnN
  • Beginndatum Beginndatum
Z

ZwEnN

Gast
Hallo leute,
ich bin gerade dabei für die Schule ein kleines Chatprogramm zu schreiben.
Ich weiß dass ich das Rad neu erfinde aber für mich geht es hier um den Lerneffekt. 😀

Da ist aber ein leichter Schönheitsfehler in dem GUI da nämlich die JList "springt" wenn man das Fenster verkleinert.
Ich habe keine Ahnung woran das liegt... hab schon alles mögliche versucht aber es geht nich weg :/ vllt könnt ihr mir ja helfen.

Wäre auch schön wenn ihr etwas zum code allgemein sagen könntet ich versuche nämlich gerade meinen Programmierstil zu verbessern damit nichtmehr alles so chaotisch aussieht und übersichtlicher wird...

Hier der code (so angepasst dass er mit copy und paste zum ausprobieren läuft):
Java:
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionListener;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JMenuBar;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.text.StyledDocument;

class WindowBuilder {
	
	private static JFrame
	window;
	
	/*################## MainWindow ##################
	 */
		
		static StyledDocument startMainWindow(ActionListener listener) {
			
			setMainWindowProperties(listener);
			
			Container content = window.getContentPane();
			content.setLayout(new GridBagLayout());
			
			makeBar(content,listener);
			
			StyledDocument doc =
			makeChatLog(content);
			
			makeUserlist(content,listener);
			
			makeInput(content,listener);
			
			window.pack();
			window.setVisible(true);
			return doc;
		}
	
		private static void setMainWindowProperties(ActionListener listener) {
			
			window.setTitle("Simple Chat");
			window.setLocation(300, 300);
			window.setMinimumSize(new Dimension(350,250));
			

		}
		//----------------Input----------------
			private static void makeInput(Container content, ActionListener listener){
				
				JTextField input = new JTextField();
				addInputField(input,content);
				
				JButton sendButton = createButton("Senden","send",listener);
				addInputButton(sendButton,content);
				
			}
			private static void addInputField(JTextField input, Container content){
				GridBagConstraints cons = new GridBagConstraints();
				
				cons.insets = new Insets(0,5,0,5);
				
				cons.gridwidth = GridBagConstraints.RELATIVE;
				cons.gridheight = GridBagConstraints.REMAINDER;
				
				cons.fill = GridBagConstraints.HORIZONTAL;
				cons.weightx = 1.0;
				
				content.add(input,cons);
			}
			private static void addInputButton(JButton button, Container content){
				GridBagConstraints cons = new GridBagConstraints();
				
				//Der button soll nicht direkt am Eingabefeld hängen.
				//Außerdem soll nach oben und unten ein bisschen Abstand sein
				//damit es besser aussieht.
				cons.insets = new Insets(3,5,3,5);
				
				cons.gridheight = GridBagConstraints.REMAINDER;
				cons.gridwidth = GridBagConstraints.REMAINDER;
				
				cons.anchor = GridBagConstraints.WEST;
				
				content.add(button,cons);
			}
		//---------------*Input*---------------

		//----------------Userlist----------------
			private static void makeUserlist(Container content,ActionListener listener){
				
				DefaultListModel listModel = new DefaultListModel();
				
				//Erstellen einer Scroll pane bestehend aus der JList mit dem listModel
				JScrollPane userList = new JScrollPane(new JList(listModel));
				userList.setPreferredSize(new Dimension(75,300));
				
				addUserlist(userList, content);
			}
			private static void addUserlist(JScrollPane userList, Container content){
				GridBagConstraints cons = new GridBagConstraints();
				
				//Die Userliste ist das letzte element in ihrer Reihe
				cons.gridwidth = GridBagConstraints.REMAINDER;
				
				cons.fill = GridBagConstraints.BOTH;
				//Soll sich zusammen mit dem Chatlog nach links oder rechts erweitern
				cons.weightx = 0.2;
				//Soll sich wie der Chatlog komplett nach oben oder unten erweitern
				cons.weighty = 1.0;
				
				content.add(userList,cons);
			}
			
			
		//---------------*Userlist*---------------
		
		//----------------ChatLog----------------
			private static StyledDocument makeChatLog(Container content){
				JTextPane textPane = new JTextPane();
				textPane.setEditable(false);
				
				JScrollPane scrollPane = new JScrollPane(textPane);
				scrollPane.setPreferredSize(new Dimension(300,300));
				
				addChatLog(scrollPane, content);
				
				return textPane.getStyledDocument();
			}
			private static void addChatLog(JScrollPane scrollPane, Container content){
				
				GridBagConstraints cons = new GridBagConstraints();

				cons.gridwidth = GridBagConstraints.RELATIVE;
				
				cons.fill = GridBagConstraints.BOTH;
				//Soll sich zusammen mit der Userliste nach links oder rechts erweitern
				cons.weightx = 0.8;
				//Soll sich wie die Userliste komplett nach oben oder unten erweitern
				cons.weighty = 1.0;
				
				content.add(scrollPane,cons);
			}
		//---------------*ChatLog*---------------
		
		//----------------Bar----------------
			private static void makeBar(Container content,ActionListener listener){
				JMenuBar bar = new JMenuBar();
				bar.setLayout(new FlowLayout(FlowLayout.LEFT));
				
				JButton button;
				
				button = createButton("Verbinden","bar.connect",listener);
				bar.add(button);
				
				button = createButton("Trennen","bar.disconnect",listener);
				bar.add(button);
				
				button = createButton("Schrift","bar.style",listener);
				bar.add(button);
				
				button = createButton("Name","bar.name",listener);
				bar.add(button);
				
				addBar(bar,content);
				
			}
			private static void addBar(JMenuBar bar, Container content){
				GridBagConstraints cons = new GridBagConstraints();
				
				//Die Leiste ist das einzige und damit auch letzte element in ihrer Reihe
				cons.gridwidth = GridBagConstraints.REMAINDER;
				cons.gridheight = 1;
				
				cons.fill = GridBagConstraints.HORIZONTAL;
				cons.weightx = 1.0;

				content.add(bar,cons);
			}
		//---------------*Bar*---------------
		
	//################# *MainWindow* #################
	public static void main(String args[]){
		startMainWindow(null);
	}
	private static JButton createButton(String title, String actionCommand, ActionListener listener){
		
		JButton button = new JButton(title);
		button.setActionCommand(actionCommand);
		if(listener != null)
			button.addActionListener(listener);
		
		return button;
	}
	static{
		window = new JFrame();
	}
}
 
Weiß es keiner oder ist die Frage einfach so dumm, dass keiner antworten will?
Würde mich bitte Jemand aufklären?
 
Dumme Fragen gibt's angeblich nicht.

Das, was Du als "Springen" bezeichnest,
kann vielleicht daran liegen, dass das Fenster (hier : JFrame) nach jeder Bewegung
neu gezeichnet wird, ohne dass Du es im Programm vorschreibst.

Alles wird beim Bewegen des Fensters von vorn neu gezeichnet und auf die Position gebracht.

Wenn Du Spass an Experimenten hast, kannst Du mit verschiedenen Layout- Managern versuchen.

Gruss,
 
Zuletzt bearbeitet:
Es passiert aber komischerweise nur, wenn man das Fenster verkleinert und nicht wenn man es vergrößtert.
Die anderen Layoutmanager eignen sich meiner Meinung nach nicht um das Fenster so hinzubekommen.
Wenn es nicht weggeht, muss ich wohl damit leben. 😀
Schadet ja zum dem Programm nicht... ärgert mich aber ein bisschen. :/
 
Das liegt daran, dass das GridBagLayout sich nach der MinimumSize aller Kinder des auszulegenden Containers richtet, sobald nicht mehr alle Kinder mit PreferredSize (Höhe oder Breite, eines reicht schon) auf den Container passen. Siehe dazu: http://www.java-forum.org/bilder-gui-damit-zusammenhaengt/64702-gridbaglayout.html#post544790 (besonders das Beispiel).

In Deinem Fall sollte es also helfen, wenn Du der Liste eine anständige MinimumSize (nämlich genau die gleiche wie die PreferredSize) gibst. Probier's mal aus.

Ebenius
 

Neue Themen


Zurück
Oben