2017-01-24 16 views
0

У меня есть одна панель whit gridBagLayout и вторая с нулевой сеткой. Когда я добавляю это на главную панель, и основная панель для создания одной панели исчезает. Почему это? А как добавить две панели с разными настройками макетов в одном кадре?Как добавить две панели с разными макетами в один кадр?

Вот код основной @Beowolve:

import java.awt.BorderLayout; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 

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

public class PrikazGUI { 

    JFrame frejm; 
    JPanel k; 
    JButton b1,b2; 

    public PrikazGUI(){ 
     frejm = new JFrame("Lala"); 
     k = new JPanel(); 

     KvadratPravi p = new KvadratPravi(); 
     JPanel grid = new JPanel(); 
     grid.setLayout(new GridBagLayout()); 
     grid.add(p); 
//  Kvadrat l = new Kvadrat(); 
     JosJedanKvadrat jos = new JosJedanKvadrat(); 
//  k.setLayout(null); 
//  k.setBounds(0, 444,444, 445); 
     k.add(jos); 
     k.add(grid); 
     JPanel main = new JPanel(); 
     main.setLayout(null); 
     k.setBounds(0, 0,1000, 1900); 
     main.setBounds(0, 0,1000, 1900); 
     main.add(k); 



     frejm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frejm.setSize(1900, 1000); 
     frejm.getContentPane().add(main); 
//  frejm.getContentPane().add(k); 
//  frejm.pack(); 
     frejm.setVisible(true); 


    } 


    public static void main(String[] args) { 
     PrikazGUI a = new PrikazGUI(); 

    } 

} 

Второй класс:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 

import javax.swing.JPanel; 

public class KvadratPravi extends JPanel { 

    int sizeH = 60; 
    int sizeW = 60; 
    public GridBagConstraints cst = new GridBagConstraints(); 

    public KvadratPravi() { 
     JPanel j = new JPanel(); 
     j.setLayout(new GridBagLayout()); 
     cst.gridx = 0; 
     cst.gridy = 0; 

     add(j,cst); 

    } 



    @Override 
    protected void paintComponent(Graphics g) { 
     // TODO Auto-generated method stub 
     super.paintComponent(g); 
      g.setColor(Color.PINK); 
      g.drawRect(0, 0, sizeH, sizeW); 
      g.fillRect(0, 0, sizeH, sizeW); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(sizeH,sizeW); 
    } 

} 

Третий класс:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Point; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionAdapter; 

import javax.swing.JPanel; 

public class JosJedanKvadrat extends JPanel { 

    int sizeH = 60; 
    int sizeW = 60; 
    int x,y; 


    public JosJedanKvadrat() { 

     setBounds(33, 44,444, 445); 
     JPanel j = new JPanel(); 

     setLayout(null); 

     add(j); 
     addMouseListener(new MouseAdapter() { 
       public void mousePressed(MouseEvent e) { 
       if(!e.isMetaDown()){ 
       x = e.getX(); 
       y = e.getY(); 
       } 
       } 
       }); 
       addMouseMotionListener(new MouseMotionAdapter() { 
       public void mouseDragged(MouseEvent e) { 
       if(!e.isMetaDown()){ 
       Point p = getLocation(); 
       setLocation(p.x + e.getX() - x, 
       p.y + e.getY() - y); 
       } 
       } 
       }); 



    } 



    @Override 
    protected void paintComponent(Graphics g) { 
     // TODO Auto-generated method stub 
     super.paintComponent(g); 
      g.setColor(Color.BLUE); 
      g.drawOval(0, 0, sizeH, sizeW); 


    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(sizeH,sizeW); 
    } 

} 

Так я whant второй класс находится в центре панели, и иметь gridBagLayout, а третий класс я хочу перемещаться по объектам, чтобы класс не имел gridlayout ... когда я и что две панели на главной панели кажутся, что второй класс whit gridBagLayout не работает.

+0

Пожалуйста, добавьте небольшой пример кода, чтобы показать свою проблему. Ваше объяснение проблемы не очень ясное. – Beowolve

+0

@Beowolve вот код сейчас :) – getXgetY

+1

Не используйте нулевой макет. Swing был разработан для использования с менеджерами компоновки. Кроме того, всякий раз, когда вы выполняете обычную роспись, вам необходимо переопределить метод getPreferredSize() 'этого компонента, чтобы менеджер компоновки знал, что такое желаемый размер компонента. Не печатайте размер рамки. Метод pack() будет определять размер кадра на основе предпочтительного размера компонентов, добавленных в фрейм. – camickr

ответ

0

Вы в настоящее время добавляете два JPanel в JFrame.

JFrame f = new JFrame(); 

Этот кадр, по умолчанию, использует BorderLayout. Так что, если вы вызываете f.add(new Panel()); несколько раз, только последний будет виден, так как область этого макета может отображать только JComponent. Вам нужно использовать другой макет.

+1

'Вам нужно использовать другой макет.' - или добавить второй компонент в другую область BorderLayout. Например, 'add (компонент, BorderLayout.PAGE_END)'. – camickr

+0

@camickr Я предпочел использовать другой макет, так как я не был уверен в содержании этих панелей. И я предпочитаю видеть макет границы, чтобы установить содержимое границ: меню, нижний колонтитул, заголовки. Но я должен был бы упомянуть об этом. Ну не имеет значения – AxelH