2015-03-16 2 views
0

Я пытаюсь поставить 2 JPanels в borderLayout. Таким образом, один JPanel будет иметь размерную область 1 (600 600), а другой - панель2 (200 600). Я надеюсь упаковать их так, что большой будет слева, а другой - справа. Я устанавливаю размер каждой jpane, но похоже, что оба они занимают полное пространство и вид перекрытия друг с другом.Ввод 2 jpanels в borderlayout

Я полный новичок здесь и понятия не имею, что происходит не так. Любая помощь приветствуется. JFrame frame = new JFrame("Simple Graph"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); int pane1_width = FRAME_WIDTH-200;//800-200 Pane1 myPlots = new Pane1(graph_panel_size, FRAME_HEIGHT);
frame.add(myPlots); Pane2 simpleInfo = new Pane2(200,FRAME_HEIGHT); frame.add(simpleInfo); frame.pack(); frame.setSize(FRAME_WIDTH, FRAME_HEIGHT); frame.setResizable(false); frame.setVisible(true);

Это базовый класс рамы. Для JPanel

public Pane2(int width,int height){
this.setSize(width,height); Border blackline = BorderFactory.createTitledBorder("ola"); this.setBorder(blackline);

другая панель также имеет подобный конструктор. Но оба Jpanels перекрывают друг друга, и я не могу их разместить отдельно.

ответ

4

Проблема в том, что вы звоните setSize(). При использовании LayoutManager (который вы обязательно должны делать всегда), использование setSize/setBounds/setLocation абсолютно бесполезно.

Дополнительный адрес, вызывающий setPreferredSize()/setMinimumSize/setMaximumSize не рекомендуется и может быть контрпродуктивным.

У вашего компонента есть веская причина иметь заданный размер (например, вы делаете обычную живопись, например), тогда вы должны переопределить getPreferredSize, или просто вам не нужно ничего делать, и используйте только подходящий LayoutManager.

Вы можете также check out the tutorial on LayoutManager of Oracle

Смотрите этот пример с переопределения getPreferredSize():

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class TestCustomPainting { 

    private static class MyTriangle extends JPanel { 

     private final int width; 
     private final int height; 

     public MyTriangle(int width, int height) { 
      this.width = width; 
      this.height = height; 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(width, height); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.setColor(Color.GREEN); 
      g.fillPolygon(new int[] { 0, getWidth(), 0 }, new int[] { 0, 0, getHeight() }, 3); 
     } 

    } 

    protected static void initUI() { 
     JFrame frame = new JFrame("test"); 
     frame.add(new MyTriangle(200, 45), BorderLayout.EAST); 
     frame.add(new MyTriangle(85, 600), BorderLayout.WEST); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       initUI(); 
      } 
     }); 
    } 
} 

NB: Я должен признать, что есть более интересно рисовать :-)

+0

Эй Спасибо. :) И тем временем я нашел еще одну ссылку на stackoverflow, которая объясняла getPreferredSize(). Итак, я новичок в любом графическом программировании. Исходя из системного фона (или для любого, кто исходит из любого фона программирования) и вызова getPreferredSize(), а не setPreferredSize(), звучит совершенно контуитивно. Есть ли какая-то причина иметь setPreferredSize(), кроме исторических винтов. благодаря –

Смежные вопросы