Obszar poza Layoutem

0

Witam.

Odkrywam aktualnie tajniki aplikacji okienkowych i trybu graficznego, no i natknąłem się na pewien problem.
Tworzę mały kalkulator, a raczej jego obraz.
Stworzyłem klawiaturę z przyciskami, które rozkładają się wedle layoutu GridLayout. Nad klawiaturą chciałem utworzyć okienko JTextField, w którym będą się pojawiać klikane liczby.
Problem jest taki, że albo kalwiatura zasłania okienko, lub te wchodzi do GridLayoutu i ma rozmiary pojedynczego klawisza.

Co zrobić, aby jakby "przesunąć" layout klawiatury w dół, a na samej górze utworzyć okienko JTextField na całej szerokości.

Poniżej aktualny kod, na którym pracuję:

 import java.awt.ComponentOrientation;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;


public class Ramka extends JFrame{
	
	public static final int HEIGHT = 400;
	public static final int WIDTH = 300;
	
	public Ramka(){
		super("Kalkulator 1.0.0");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		setSize(new Dimension(WIDTH, HEIGHT));
		setLocation(500,500);	
		
		JPanel panel = new MyPanel();
		
		add(panel);
		applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);	
		
		setVisible(true);
	}
}
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class MyPanel extends JPanel implements ActionListener{
		
	protected JTextField tf = new JTextField("test");
	protected JButton[] button = new JButton[10];
		
	public MyPanel(){
		
		for (int i = 0; i <button.length; i++) {
            button[i] = new JButton(String.valueOf(i));
        }  
		
		add(tf);       
        for (int i = 9; i>=0; i--) add(button[i]);
        setLayout(new GridLayout(4,3,5,5));
	}


	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
	}
}

Kod na razie tworzony aby rozkminić całe działanie layoutów, przycisków, okienek itd. więc nie wińcie za poziom skomplikowania.

Pozdrawiam.

1

Zrób dwa panele, jeden dla TF a drugi dla klawiszy

0

Zrobiłem oddzielne panele, ale wciąż nadal się "nakładają"
Gdzieś popełniłem błąd?

import java.awt.ComponentOrientation;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;


public class Ramka extends JFrame{
	
	public static final int HEIGHT = 500;
	public static final int WIDTH = 400;
	
	public Ramka(){
		super("Kalkulator 1.0.0");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		setSize(new Dimension(WIDTH, HEIGHT));
		setLocation(500,500);	
		
		JPanel wPanel = new WindowPanel();
		JPanel bPanel = new ButtonPanel();
	
		setContentPane(wPanel);
		setContentPane(bPanel);

		setVisible(true);
	}
}
import java.awt.ComponentOrientation;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JPanel;


public class ButtonPanel extends JPanel implements ActionListener{		
	
	protected JButton[] button = new JButton[10];
		
	public ButtonPanel(){
		for (int i = 0; i <button.length; i++) {
			button[i] = new JButton(String.valueOf(i));
		}  
			
		for (int i = 9; i>=0; i--) 
			add(button[i]);
	        
		setLayout(new GridLayout(4,3,5,5));
	    applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);	
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
	}
}
import java.awt.FlowLayout;

import javax.swing.JPanel;
import javax.swing.JTextField;

public class WindowPanel extends JPanel{
	
	protected JTextField tf = new JTextField("test");
	
	public WindowPanel() {
		setLayout(new FlowLayout());
		add(tf);
	}
}
1

ustaw w ramce layout :)

zrób to w ten deseń:

setLayout(new BorderLayout());
getContentPane().add(wPanel, BorderLayout.NORTH);
getContentPane().add(bPanel, BorderLayout.SOUTH);

a nie

setContentPane().(wPanel);

dodanie znaczników <code class="java"> - @furious programming

0

Dzięki.

Zostawiłem GridLayout w klasie przycisków, a w klasie okna ustawiłem rozmiary przez PreferredSize.

Właśnie wcześniej kombinowałem z BorderLayoutem, ale nie wiedziałem jak go umieścić.

Jeszcze się dopytam o co chodzi z getContentPane lub setContentPane
Bez tego niby program działa tak samo, ale nie znalazłem jakiegoś dobrego wytłumaczenia działania tych metod.

1

@garai_nz trochę przekombinował. BorderLayout to domyślny layout dla JFrame. Wystarczy tak:

add(wPanel, BorderLayout.NORTH);
add(bPanel, BorderLayout.SOUTH);

Użycie getContentPane() jest zbyteczne, o ile użytkownik ma Javę > 1.4.

0

Dzięki za odpowiedzi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1