JPanel не отображается в BorderLayout - PullRequest
1 голос
/ 13 октября 2011

У меня есть макет границы и JPanel справа. JPanel имеет абсолютный макет и ничего не содержит, потому что я использую его для рисования графики (переопределение paintComponent (Graphics g))

Проблема в том, что панель не отображается (она есть, но имеет ширину 1 пиксель). Я пытался установить размер на панели .. но это не работает ..

Как мне это сделать?

frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
JPanel panelCenter = new JPanel();
panelRight = new ActorDrawer();
frame.getContentPane().add(panelRight, BorderLayout.EAST);
panelRight.setSize(200, 400);
panelRight.setLayout(null);
frame.getContentPane().add(panelCenter, BorderLayout.CENTER);
frame.getContentPane().add(panelBottom, BorderLayout.SOUTH);
table = new JTable(new MyTableModel());
JScrollPane scrollPane = new JScrollPane(table);
table.setFillsViewportHeight(true);
panelCenter.add(scrollPane);

Ответы [ 3 ]

3 голосов
/ 13 октября 2011

Посмотрите на метод JPanel.setPreferredSize (). Кроме того, я думаю, что вызов JFrame.setBounds () - это не то, что вы ищете. Вот пример:

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

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

public class Sandbox extends JFrame
{
    class MyPanel extends JPanel
    {
        public void paintComponent(Graphics g)
        {
            g.setColor(Color.RED);
            g.fillRect(0, 0, this.getWidth(), this.getHeight());
        }
    }

    public static void main(String[] args)
    {
        Sandbox s = new Sandbox();
    }

    public Sandbox()
    {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLayout(new BorderLayout());

        MyPanel panelRight = new MyPanel();
        panelRight.setPreferredSize(new Dimension(150, 300));
        this.getContentPane().add(panelRight, BorderLayout.EAST);

        JPanel panelCenter = new JPanel();
        this.getContentPane().add(panelCenter, BorderLayout.CENTER);

        JScrollPane scrollPane = new JScrollPane(new JTable());
        panelCenter.add(scrollPane);

        JPanel panelBottom = new JPanel();
        this.getContentPane().add(panelBottom, BorderLayout.SOUTH);

        this.setSize(400, 400);
        this.setVisible(true);
    }
}
1 голос
/ 13 октября 2011

BorderLayout учитывает предпочтительный размер восточного компонента и при необходимости увеличивает его высоту.Вы пытались установить предпочтительный размер панели (или переопределить метод getPreferredSize, чтобы получить нужный размер)?

0 голосов
/ 08 июня 2013

здесь приходит решение !!! Я делал то же самое.

JPanel panel = new JPanel();          
JLabel strech_label = new JLabel("As long as you need ,  Dummy Text");
strech_label.setPreferredSize( new Dimension( 111, 0 ) );

panel.setLayout(new BorderLayout());

panel.add(new MyDraw(), BorderLayout.CENTER);
panel.add(strech_label, BorderLayout.SOUTH);

    frame1.setLayout(new BorderLayout());
    frame1.add(panel,BorderLayout.WEST);

Так что в основном JLabel находится либо на юге, либо на севере, и он намеренно вытянет MyDraw.

...