Obszar poza Layoutem

Odpowiedz Nowy wątek
2014-12-30 13:21
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.

Pozostało 580 znaków

2014-12-30 14:26
1

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

Pozostało 580 znaków

2014-12-30 15:13
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);
    }
}

Pozostało 580 znaków

2014-12-30 15:49
garai_nz
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

edytowany 1x, ostatnio: furious programming, 2016-12-13 18:26
Wstawiaj kod w znaczniki kolorujące składnię; - furious programming 2014-12-31 02:08

Pozostało 580 znaków

2014-12-30 16:42
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.

Pozostało 580 znaków

2014-12-30 17:44

@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.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2014-12-30 19:09
0

Dzięki za odpowiedzi.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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