Obszar poza Layoutem

Fertood
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 23
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ę:

Kopiuj
 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);
	}
}
Kopiuj
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.

GA
  • Rejestracja: dni
  • Ostatnio: dni
1

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

Fertood
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 23
0

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

Kopiuj
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);
	}
}
Kopiuj
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
	}
}
Kopiuj
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);
	}
}
  • Rejestracja: dni
  • Ostatnio: dni
1

ustaw w ramce layout :)

zrób to w ten deseń:

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

a nie

Kopiuj
setContentPane().(wPanel);

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

Fertood
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 23
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.

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
1

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

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

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

Fertood
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 23
0

Dzięki za odpowiedzi.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.