Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > JLayeredPane, проблема.


Автор: unkis 15.1.2007, 21:09
Ребята у меня следующая проблема, 

я пытаюсь разместить на JLayeredPane две панели, на которых есть по JButton.

так вот у меня ничего не отображается, ни одной панели.
в чём может быть дело?

вот код:
Код

import java.awt.Dimension;
import java.awt.HeadlessException;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;


public class MainFrame extends JFrame {

    public MainFrame() throws HeadlessException {
        super("Proba");
        
        JPanel panel1 = new JPanel();
        JPanel panel2 = new JPanel();
        
        JLayeredPane myLayeredPane = new JLayeredPane();
        
        myLayeredPane.setPreferredSize(new Dimension(300, 310));
        myLayeredPane.setBorder(BorderFactory.createTitledBorder("Proba"));
        
        panel1.add(new JButton("Button 1"));

        panel2.add(new JLabel("Button 2"));
        
        myLayeredPane.add(panel1,new Integer(1000));
        myLayeredPane.add(panel2,new Integer(100));
    
        this.setContentPane(myLayeredPane);
        this.pack();
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        
        
    }

    

    /**
     * @param args
     */
    public static void main(String[] args) {
        new MainFrame();

    }

}


Автор: powerOn 15.1.2007, 22:16
У тебя панели нулевой площади. Поставь к примеру panel1.setBounds(20, 20, 300, 300);

Автор: unkis 15.1.2007, 22:38
а нет чего-нибудь такого, наподобие pack(), чтобы автоматически определялся нужный размер?

Автор: powerOn 15.1.2007, 22:58
Цитата(unkis @  15.1.2007,  22:38 Найти цитируемый пост)
а нет чего-нибудь такого, наподобие pack(), чтобы автоматически определялся нужный размер? 


Такого нет. Все ручками придётся делать.

Автор: LSD 16.1.2007, 12:59
Цитата(unkis @  15.1.2007,  22:38 Найти цитируемый пост)
а нет чего-нибудь такого, наподобие pack(), чтобы автоматически определялся нужный размер?

Или LayoutManager или
Код
component.setSize(component.getPreferredSize());

Автор: unkis 16.1.2007, 13:26
Цитата(LSD @  16.1.2007,  10:59 Найти цитируемый пост)
Или LayoutManager или


подождите, если я не ошибаюсь то по дефолту у панели стоит FlowtLayoutManager?

или что вы написали имея ввиду "Или LayoutManager"?

Автор: powerOn 16.1.2007, 13:32
Цитата(unkis @  16.1.2007,  13:26 Найти цитируемый пост)
или что вы написали имея ввиду "Или LayoutManager"? 

Установи LayoutManager для JLayoutPane.

Код

myLayeredPane.setLayout(new BorderLayout());


Добавлено @ 13:32 
наверное.... smile

Автор: unkis 16.1.2007, 13:58
спасибо, теперь следующее непонятно

Почему Button 2 появляется сверху, ведь у неё z-index гораздо меньше чем у Button 1?

Код

public class MainFrame extends JFrame {

    public MainFrame() throws HeadlessException {
        super("Proba");
        
        JPanel panel1 = new JPanel();
        JPanel panel2 = new JPanel();
        
        JLayeredPane myLayeredPane = new JLayeredPane();
        myLayeredPane.setLayout(new BorderLayout());

        
        myLayeredPane.setPreferredSize(new Dimension(300, 310));
        myLayeredPane.setBorder(BorderFactory.createTitledBorder("Proba"));
        
        panel1.add(new JButton("Button 1"));
        panel2.add(new JButton("Button 2"));
        
        myLayeredPane.add(panel1,BorderLayout.CENTER,new Integer(1000));
        myLayeredPane.add(panel2,BorderLayout.CENTER,new Integer(100));
    
        this.setContentPane(myLayeredPane);
        this.pack();
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        
        
    }

    

    /**
     * @param args
     */
    public static void main(String[] args) {
        new MainFrame();

    }

Автор: LSD 16.1.2007, 14:41
Дело не в уровне, а в том, что BorderLayout не может разместить два компонента на одно и то же место (CENTER).
Код
this.setVisible(true);
System.out.println("panel1 bounds = " + panel1.getBounds());
System.out.println("panel2 bounds = " + panel2.getBounds());

Автор: unkis 16.1.2007, 15:50
хорошо, а что же мне тогда использовать, чтобы расположить их как бы один над другим, а потом менять по нажатию кнопки?

Автор: LSD 16.1.2007, 15:51
CardLayout

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)