Как сделать так, чтобы JPanel внутри JFrame заполнял все окно? - PullRequest
3 голосов
/ 25 февраля 2012

В приведенном ниже примере, как я могу заставить JPanel занять весь JFrame?Я установил предпочтительный размер 800x420, но на самом деле он заполняет только 792x391.

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.image.BufferStrategy;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class BSTest extends JFrame {
    BufferStrategy bs;
    DrawPanel panel = new DrawPanel();

    public BSTest() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());   // edited line
        setVisible(true);
        setSize(800,420);
        setLocationRelativeTo(null);
        setIgnoreRepaint(true);
        createBufferStrategy(2);
        bs = getBufferStrategy();
        panel.setIgnoreRepaint(true);
        panel.setPreferredSize(new Dimension(800,420));
        add(panel, BorderLayout.CENTER);     // edited line
        panel.drawStuff();
    }

    public class DrawPanel extends JPanel {
        public void drawStuff() {
            while(true) {
                try {
                    Graphics2D g = (Graphics2D)bs.getDrawGraphics();
                    g.setColor(Color.BLACK);
                    System.out.println("W:"+getSize().width+", H:"+getSize().height);
                    g.fillRect(0,0,getSize().width,getSize().height);
                    bs.show();
                    g.dispose();
                    Thread.sleep(20);
                } catch (Exception e) { System.exit(0); }
            }
        }
     }

    public static void main(String[] args) {
        BSTest bst = new BSTest();
    }
}

Ответы [ 4 ]

6 голосов
/ 25 февраля 2012

Если у вас есть только одна панель в кадре и ничего больше, попробуйте это:

  • Установить BorderLayout в кадре.
  • Добавить панель в кадре с BorderLayout.CENTER

Может быть, это происходит из-за цикла while в JPanel. (Не уверен, почему? Найти фактическую причину. Обновится, когда найдет ее.) Если вы замените ее методом paintComponent(g), все работает нормально:

public BSTest() {
    //--- your code as it is
    add(panel, BorderLayout.CENTER);
    //-- removed panel.drawStuff();
}

public class DrawPanel extends JPanel {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.BLACK);
        System.out.println("W:" + getSize().width + ", H:" + getSize().height);
        g2d.fillRect(0, 0, getSize().width, getSize().height);
    }
 }

//your code as it is.
3 голосов
/ 25 февраля 2012

Вот альтернативный вариант использования пакета.

import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class PackExample extends JFrame {

    public PackExample(){
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(800,600));
        panel.setBackground(Color.green);
        add(panel);
        pack();
        setVisible(true);
   }

   public static void main(String[] args){
     new PackExample();
   }

}
1 голос
/ 25 февраля 2012

Если вы хотите заполнить JFrame всей JPanel, вам нужно установить Undecorated в true, то есть frame.setUndecorated(true);.Но теперь вам нужно позаботиться о том, чтобы ваши кнопки MAXIMIZE

0 голосов
/ 23 февраля 2017

Это заняло у меня целую вечность, но это на самом деле самый простой код за всю историю.Просто создайте родительскую панель и передайте GridLayout, затем добавьте свою дочернюю панель следующим образом.

JPanel parentPanel= new JPanel(new GridLyout());
JPanel childPanel= new JPanel();
parentPanel.add(childPanel);
...