İki tane JTextField oluştururken sorun

package Proje;

import javax.swing.*;
import java.awt.*;
public class guiareaoftriangle {
	public static void main(String[]args) {
		JFrame win = new JFrame("Area of Triangle");
		win.setSize(600,400);
		win.setDefaultCloseOperation(win.EXIT_ON_CLOSE);
		

		JTextField height = new JTextField();
		height.setBounds(170, 70, 45, 20);
		height.setEditable(true);

		JTextField base = new JTextField();
		base.setBounds(170, 90, 45, 20);
		
		win.add(height);
		win.add(base);
		win.setVisible(true);
		win.setLayout(null);
		
		
		
		
	}
}

Birinci JTextField gayet güzel çalışıyor. Ama ikincisine gelirsek ikinci çalışmıyor.

Neden çalışmıyor? Ayrıca çalışması gerekmiyor çünkü JTextField sadece giriş alır. Bir sorun varsa hata çıktılarıyla beraber paylaşmanız gerekir.

Böyle oluyor ortadaki küçük TextField çalışıyor ama diğerinede aynılarını yapmama rağmen çalışmıyor.

Sikinti JFrame layout’uyla alakali. Birden fazla element dogrudan add edilemez, ara element koymak veya layout’u degistirmek lazim.

1 Beğeni
package Proje;

import javax.swing.*;  
class s 
{  
public static void main(String args[])  
    {  
    JFrame f= new JFrame("TextField Example");  
    JTextField t1,t2;  
    t1=new JTextField("Welcome to Javatpoint.");  
    t1.setBounds(50,100, 200,30);  
    t2=new JTextField("AWT Tutorial");  
    t2.setBounds(50,150, 200,30);  
    f.add(t1); f.add(t2);  
    f.setSize(400,400);  
    f.setLayout(null);  
    f.setVisible(true);  
    }  
    }  

Bu ile benim yazdığım kod arasındaki fark nedir çünkü bu çalışıyor benimki çalışmıyor?

Sadece bir satır yerini değiştirerek sorunu çözdüm. En alta yazdığınız win.setLayout(null) kısmı pencerenin düzenini bozuyor. Bu tarz tanımlamaları pencereyi ekranda göstermeden önce yapmanız daha doğrudur.


    public static void main(String[] args) {
        JFrame win = new JFrame("Area of Triangle");
        win.setSize(600, 400);
        win.setDefaultCloseOperation(win.EXIT_ON_CLOSE);
        win.setLayout(null); // BURAYA TAŞINDI
        
        JTextField height = new JTextField();
        height.setBounds(170, 70, 45, 20);
        height.setEditable(true);

        JTextField base = new JTextField();
        base.setBounds(170, 90, 45, 20);

        win.add(height);
        win.add(base);
        win.setVisible(true);
        

    }
1 Beğeni

Edilebiliyor, ancak dediğim gibi pencereyi ekranda gösterdikten sonra layout ile ilgili ayarlamalar yapmak pencere düzenini bozuyor. Resimde de görüldüğü gibi iki textfield üst üste binmiş.

1 Beğeni

Evet, pardon, edilebiliyormus.

Bu da JFrame’i bildigim GUI kutuphaneleri arasinda birden fazla cocuk eklenebilen tek top-level container yapacakti ki, soyle bir sey okudum:

Like all other JFC/Swing top-level containers, a JFrame contains a JRootPane as its only child. The content pane provided by the root pane should, as a rule, contain all the non-menu components displayed by the JFrame . This is different from the AWT Frame case. As a conveniance add and its variants, remove and setLayout have been overridden to forward to the contentPane as necessary. This means you can write:

frame.add(child);

And the child will be added to the contentPane.

Yani aslinda edilemiyomus, teknik olarak. Ama AWT Frame’lerine edilebiliyomus; yanlis oldugum degismiyo :slight_smile:

Ama sorun layout. Ilgili SO da oyle demisti, “JPanel kullan, onun layout’u birden fazla obje kaldiriyor.”

Rule-of-thumb: Bir elemente birden fazla cocuk verilecekse o elementin birden fazla cocuk icin tasarlandigindan emin olun; coguna verilmiyor.

2 Beğeni

Yani anladığım kadarıyla, aslında biz ekleme yaptığımızda JFrame içerisinde zaten varsayılan olarak RootPane bulunmakta ve ona ekleniyor. Değil mi?

1 Beğeni

Evet. setLayout(null) da ona gidiyor ama ne yapiyor anlamadim.

1 Beğeni

https://docs.oracle.com/javase/tutorial/uiswing/layout/using.html

Burada yazılandan anladığım kadarıyla, null değerini verdiğimizde Container’ların bir layout kullanmamasını sağlıyormuş. Böylece nesnelerin ekranda nerede görüntüleneceği bize bırakılmış oluyor.

2 Beğeni

Ha, tamam =)

called absolute positioning

1 Beğeni

@coderistan Verdiğin cevap gerçekten işime yaradı teşekkür ederim ek bir sorum daha var bu jtextfieldların soluna yazı eklemek istediğimizde label ile mi yapıcaz yoksa daha farklı kolay bir yolu var mı(pythonda sanki hatırlıyor gibiyim ama emin değilim)

Soluna yazı eklemeyi Label ile yapabilirsiniz. Ama düzgün bir görünüm isterseniz layout kullanmanız gerekir

https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html


https://javatutorial.net/java-swing-jframe-layouts
https://www.tutorialspoint.com/swing/swing_layouts.htm

1 Beğeni