GUI IP-Adress-Eingabefeld

paradox.

Aktives Mitglied
Hallo,

benötige für meine GUI ein IP-Adresseingabefeld. Da es sowas ja nicht standardmäßig gibt hab ich mich mal auf die Suche gemacht und folgendes im Forum gefunden
http://www.java-forum.org/codeschnipsel-u-projekte/51187-ip-eingabefeld.html#post316597


Jetzt zu meiner Frage wie kann ich dies in mein erstes GUI Programm einbinden?
Java:
JFormattedTextField formattedTextField10 = new JFormattedTextField(new IPFormatter());
Habs bis jetzt so gemacht (hab die Klasse in IPFormatter umbenannt), aber da klappt es leider irgendwie nicht..

Wenn ich das Textfeld auf der GUI dann anschau steht folgender Text drinnen:
Erstes.Projekt.IPFormatter[,0,0,0x0,invalid,layout=java.awt.FlowLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=]
Grüße
 
Zuletzt bearbeitet:

paradox.

Aktives Mitglied
Java:
JFormattedTextField formattedTextField10 = new JFormattedTextField(new IPFormatter());
		formattedTextField10.setHorizontalAlignment(SwingConstants.CENTER);
		formattedTextField10.setBounds(400, 400, 150, 30);
		seite1.add(formattedTextField10);
Hier bind ich die Klasse ein, oder versuchs zumindestens
 

kaoZ

Top Contributor
Das hier

Java:
Erstes.Projekt.IPFormatter[,0,0,0x0,invalid,layout=java.awt.FlowLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=]

zeigt dir doch schon genau wo dein Problem liegt :)

Poste bitte mal den dazu gehörenden SourceCode, den wo du das Layout für den Container deklarierst in dem du das TextFeld hinzufügen möchtest, ist es ein JPanel ?

Btw. möchteste du ein Textfeld haben welches auch separaten Eingabefeldern besteht, wie man es von der Eingabemaske der Netzwerkverbindungen kennt oder ein zusammenhängendes Textfeld, wie eben ein normales TextFeld ?
 
Zuletzt bearbeitet:

paradox.

Aktives Mitglied
Das hier

Java:
Erstes.Projekt.IPFormatter[,0,0,0x0,invalid,layout=java.awt.FlowLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=]

zeigt dir doch schon genau wo dein Problem liegt :)

Poste bitte mal den dazu gehörenden SourceCode, den wo du das Layout für den Container deklarierst in dem du das TextFeld hinzufügen möchtest, ist es ein JPanel ?

Btw. möchteste du ein Textfeld haben welches auch separaten Eingabefeldern besteht, wie man es von der Eingabemaske der Netzwerkverbindungen kennt oder ein zusammenhängendes Textfeld, wie eben ein normales TextFeld ?

Java:
		JTabbedPane tabs = new JTabbedPane(JTabbedPane.TOP);
		tabs.setBounds(0, 0, 500, 300);
		contentPane.add(tabs);
Java:
JPanel seite1 = new JPanel();
		tabs.addTab("Seite 1", seite1);
		seite1.setLayout(null);


Kann mit der Meldung irgendwie nicht viel anfangen.

Jap ist ein JPanel, dort möchte ich es einbinden.
Das ist mir eigentlich relativ egal, ich möchte nur falsche Eingabe von IP-Adressen vermeiden..
 
Zuletzt bearbeitet:

kaoZ

Top Contributor
Java:
seite1.setLayout(null);

Du setzt hier ein null layout ,

deine Fehlermeldung beinhaltet :

Code:
layout=java.awt.FlowLayout

kannst du mal den kompletten stacktrace posten ?!

[TIPP]Null-Layouts are Evil :D[/TIPP]

Btw. was passiert wenn du dem Panel mal kein gesondertes layout setzt, und einfach das Standardmäßige Flowlayout verwendest ? Bekommst du dann eine Fehlermeldung ?

Wenn du ein Null-Layout verwendest musst du auch zwangsläufig die bounds setzen, damit dein Textfeld auch angezeigt wird.

sprich

Java:
seite1.setBounds(0,0,250,150);
 
Zuletzt bearbeitet:

paradox.

Aktives Mitglied
Java:
seite1.setLayout(null);

Du setzt hier ein null layout ,

deine Fehlermeldung beinhaltet :

Code:
layout=java.awt.FlowLayout

kannst du mal den kompletten stacktrace posten ?!

[TIPP]Null-Layouts are Evil :D[/TIPP]

Btw. was passiert wenn du dem Panel mal kein gesondertes layout setzt, und einfach das Standardmäßige Flowlayout verwendest ? Bekommst du dann eine Fehlermeldung ?

Wenn du ein Null-Layout verwendest musst du auch zwangsläufig die bounds setzen, damit dein Textfeld auch angezeigt wird.

sprich

Java:
seite1.setBounds(0,0,250,150);


Kann den stacktrace nicht posten, das Feld ist ja bis jetzt mit noch nichts verknüpft, des steht halt einfach in diesem Textfeld drinnen, also die Meldung.

Wenn ich das null Layout überall rausnehm zerschießt er mir meine komplette Oberfläche.. Muss ich jetzt die ganze Oberfläche nochmal neu erstellen?

Wie meist du dass mit den Bounds? Das Feld wird ja angezeigt. Nur in dem Textfeld wo ich meinen Text bzw. meine IP eingeben muss erscheint die Meldung..
 

kaoZ

Top Contributor
Warte kurz :)

Hier mal ein

Java:
import java.awt.BorderLayout;

import javax.swing.BorderFactory;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class Foo {
	
	JFormattedTextField txt;
	JFrame frame;
	JPanel panel;
	JLabel label;
	
	public Foo() {
		init();
		add();
	}
	
	private void init(){
		frame = new JFrame("Beispiel");
		frame.setSize(300,150);
		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		frame.setLocationRelativeTo(null);
		
		panel = new JPanel(null);
		panel.setBounds(0,0,300,150);
		panel.setBorder(BorderFactory.createTitledBorder("IP Adresse"));
		
		label = new JLabel("IP :");
		label.setBounds(10,20,50,20);
		
		txt = new JFormattedTextField();
		txt.setBounds(50, 20, 150, 20);
	}
	
	private void add(){
		panel.add(label);
		panel.add(txt);
		frame.add(BorderLayout.CENTER, panel);
		
	}
	
	public void show(boolean value){
		frame.setVisible(value);
	}
	
	public static void main(String[] args) {
		new Foo().show(true);
	}
}



Erläuterung:

Wenn du ein null-Layout verwendest, bist du selbst dafür verantwortlich die Komponenten in den Fall in deinem Panel zu platzieren, sprich du musst über
Code:
setBounds(int, int, int, int);
angeben, wo und wie genau die Komponente in dem Panel gezeichnet werden soll, machst du das nicht wird entweder nur murks oder garnichts angezeigt, oder es passiert das sich verschiedene Komponenten Überlagern, außerdem skaliert ein null layout nicht mit, deshalb solltest du , insofern du dich doch für ein null-Layout entscheiden solltest, über .setResizable(false); eine größenänderung des Frames unterbinden, sonst kann es schnell passieren das es ganz schön hässlich wird.

Wenn du die bounds in diesem Beispiel mal auskommentierst, wirst du sehen das das Label sowie auch das Textfeld nicht angezeigt werden .



[TIPP]
Ich empfehle eine sauberere Lösung über Layoutmanager !
[/TIPP]
 
Zuletzt bearbeitet:

paradox.

Aktives Mitglied
Warte kurz :)

Hier mal ein

Java:
import java.awt.BorderLayout;

import javax.swing.BorderFactory;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class Foo {
	
	JFormattedTextField txt;
	JFrame frame;
	JPanel panel;
	JLabel label;
	
	public Foo() {
		init();
		add();
	}
	
	private void init(){
		frame = new JFrame("Beispiel");
		frame.setSize(300,150);
		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		frame.setLocationRelativeTo(null);
		
		panel = new JPanel(null);
		panel.setBounds(0,0,300,150);
		panel.setBorder(BorderFactory.createTitledBorder("IP Adresse"));
		
		label = new JLabel("IP :");
		label.setBounds(10,20,50,20);
		
		txt = new JFormattedTextField();
		txt.setBounds(50, 20, 150, 20);
	}
	
	private void add(){
		panel.add(label);
		panel.add(txt);
		frame.add(BorderLayout.CENTER, panel);
		
	}
	
	public void show(boolean value){
		frame.setVisible(value);
	}
	
	public static void main(String[] args) {
		new Foo().show(true);
	}
}



Erläuterung:

Wenn du ein null-Layout verwendest, bist du selbst dafür verantwortlich die Komponenten in den Fall in deinem Panel zu platzieren, sprich du musst über
Code:
setBounds(int, int, int, int);
angeben, wo und wie genau die Komponente in dem Panel gezeichnet werden soll, machst du das nicht wird entweder nur murks oder garnichts angezeigt, oder es passiert das sich verschiedene Komponenten Überlagern, außerdem skaliert ein null layout nicht mit, deshalb solltest du , insofern du dich doch für ein null-Layout entscheiden solltest, über .setResizable(false); eine größenänderung des Frames unterbinden, sonst kann es schnell passieren das es ganz schön hässlich wird.

Wenn du die bounds in diesem Beispiel mal auskommentierst, wirst du sehen das das Label sowie auch das Textfeld nicht angezeigt werden .



[TIPP]
Ich empfehle eine sauberere Lösung über Layoutmanager !
[/TIPP]

Java:
		JFormattedTextField formattedTextField10 = new JFormattedTextField(new IPFormatter());
		formattedTextField10.setHorizontalAlignment(SwingConstants.CENTER);
		formattedTextField10.setBounds(374, 400, 145, 23);
		formattedTextField10.setResizable(false); //Method is undefined!
		seite1.add(formattedTextField10);

Die Methode setResizeable ist doch gar nicht definiert oder?
Im Endeffekt sprech ich doch mein formattedTextField mit den Bounds an, dann sollte doch das jetzt alles klappen? Tuts aber leider immer noch nicht.

[Java]public class GUI extends JFrame {


private Component JFormattedTextField;[/Java]

lege ganz oben in der Klasse mein JFormattedTextField an, und im Konstruktor steht dann der obengenannte Code zum einbinden..

PS: Wenn ich ein Gitter-Layout verwende, passiert das gleiche.
 
Zuletzt bearbeitet:

kaoZ

Top Contributor
Java:
public class GUI extends JFrame {
    
 
  private Component JFormattedTextField;

Öhm ja....

public abstract class Component
public class JFormattedTextField

Was fällt dir auf ?

Wie du sehen kannst ist Component eine Abstrakte Basisklasse aus der AWT API, das was du da versuchst kann also eigentlich garnicht klappen,

da dies keine gültige Deklaration sein dürfte / bzw. ist,

[TIPP]Außerdem schreibt man Variablen lowerCamelCase ;)[/TIPP]

zudem musst du soweit ich weiß , insofern du wirklich mit Component, ( eigentlich auch eher JComponent ) arbeitest, das Zeichnen selbst über
Code:
.paintComponent(Graphics g)
übernehmen.

versuch doch bitte einfach mal folgendes :

Java:
public class GUI extends JFrame {
    
 
  private JFormattedTextField txtField:

[EDIT]
Code:
.setResizable()
, ist nur undefiniert weil du auf eine Abstrakte Basisklasse, eben Component Referenzierst, wie schon erwähnt wäre hier auch
Code:
[B]JComponent[/B]
eher ratsam da du mit SWING arbeitest , nicht mit
Code:
[B]AWT[/B]
, konkret lege ich dir nahe, wie im Beispiel hier drüber
Code:
[B]JFormattedTextField[/B]
zu referenzieren.[/EDIT]

Zu dem
Code:
.setBounds();
diese musst du setzen wenn du ein null-layout verwendest !
Sonst werden deine Komponenten nicht gezeichnet, da beim Kompilieren ja nicht feststeht wo genau gezeichnet werden soll.

[EDIT]Was ich übrigends auch nicht nachvollziehen kann ist , warum du ein JFormattedTextField festlegst, aber in deinem Beispielcode dann diese Referenz nicht nutzt. ( außer dies war nur zu anschauungszwecken)[/EDIT]
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben