2017-01-14 33 views
-1

Wenn ich das Fenster, meine benutzerdefinierte JTextField Größe ändert die Größe neu. Es tut dies nur einmal, das erste Mal, wenn ich die Größe des Fensters ändere. Es ist innen paintComponent zu dieser Linie bezogen werden:Java Swing JTextField setMargin unerwartetes Verhalten

setMargin(new Insets(2, 25, 2, 2));

diesen Befehl Ausführen nicht das Textfeld vergrößert werden, bis ich die Größe des Fensters. Nach der Größenänderung des Fensters führt die Ausführung dieses Befehls dazu, dass JTextField größer wird. Die tatsächliche Größe des Fensters spielt keine Rolle. Die erste Zeitfenstergröße wird geändert, JTextField wird größer und bleibt dann bis zum Ende der Zeit groß. Ich würde es vorziehen, wenn das Feld groß wäre, sobald ich das Programm starte, und natürlich möchte ich nicht, dass es zufällig die Größe ändert.

Wie kann ich die Größe dieses JTextField beheben, so dass es nicht zufällig ändert?

Hier ist die ganze Klasse:

/** 
* From https://gmigdos.wordpress.com/2010/03/30/java-a-custom-jtextfield-for-searching/ 
* @author Georgios Migdos <[email protected]> */ 
public class JIconTextField extends JTextField { 

private Icon icon; 
private Insets dummyInsets; 

public JIconTextField(int columns) throws IOException { 
    super(columns); 

    Border border = UIManager.getBorder("TextField.border"); 
    JTextField dummy = new JTextField(); 
    this.dummyInsets = border.getBorderInsets(dummy); 

    String path = "find-16x16.png"; 
    InputStream is = Main.class.getClassLoader().getResourceAsStream(path); 
    setIcon(new ImageIcon(ImageIO.read(is))); 
    repaint(); 
} 

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 

    int textX = 2; 

    if(this.icon!=null){ 
     int iconWidth = icon.getIconWidth(); 
     int iconHeight = icon.getIconHeight(); 
     int x = dummyInsets.left + 5;//this is our icon's x 
     textX = x+iconWidth+2; //this is the x where text should start 
     int y = (this.getHeight() - iconHeight)/2; 
     icon.paintIcon(this, g, x, y); 
    } 

    setMargin(new Insets(2, textX, 2, 2)); 
} 

} 
+1

Warum setzen Sie Ränder innerhalb einer paintComponent-Methode? Das ist sehr ungewöhnlich und sieht sehr skizzenhaft aus. –

+0

Quelle des Codes ist in der URL in OP. Ich weiß nicht, warum er es so gemacht hat. Ich bin darauf gestoßen, als ich gegoogelt habe, wie man ein Symbol über ein Textfeld zeichnet. –

+0

Also was ** genau ** versuchst du zu erreichen? Was ist Ihr gewünschtes Codeverhalten im Gegensatz zu Ihrem beobachteten Codeverhalten? –

Antwort

1

Neben den Kommentaren, wenn Sie den Code aus dem paintComponent Methode schneiden und es in den Konstruktor einfügen, werden Sie Ihre gewünschte Ergebnis erhalten.

paintComponent Die Methode zur tatsächlichen Gemälde, das heißt der Hintergrund des Feldes Austast- und den Text zu ziehen. Im Allgemeinen sollten Sie diese Methode nicht überschreiben, es sei denn, Sie möchten die Art, in der die Komponente gezeichnet wird, speziell ändern.

+0

Danke. Wenn es eine bessere Möglichkeit gibt, das Symbol über das Textfeld zu zeichnen, lassen Sie es mich wissen. –

+0

@AtteJuvonen: Wenn Sie genau erklären würden, was Sie erreichen wollen, werden wir es tun. Zeigen Sie ein Bild von dem, was Sie bekommen, etwas, irgendetwas. Beachten Sie, dass diese Antwort nur meinen Kommentar, der keine Kritik an Jimadilo ist, wiederholt, aber nur Ihnen sagt, dass, wenn Sie eine bessere Antwort wollen, etwas Besseres als das, worauf Sie sofort die Frage gestellt haben, bitte stellen Sie eine bessere Frage. –

+0

@AtteJuvonen: Ich habe tatsächlich nie versucht, ein Symbol direkt zu einem Symbol in ein Textfeld hinzuzufügen. Möchten Sie, dass das Symbol hinter dem eingegebenen Text oder neben dem Text angezeigt wird? – Jimadilo