Obszar poza Layoutem

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

Liczba odpowiedzi na stronę

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