Как поместить JPanel с 2DGraphics на JFrame (тот же класс) - PullRequest
0 голосов
/ 22 марта 2019

У меня есть класс, расширяющий JFrame, и я хотел бы добавить к этому JFrame два JPanel: текстовую панель и графическую панель.Моя текстовая панель - это панель с надписью с текстом.Моя графическая панель будет содержать график (созданный с использованием 2DGraphics).Я добавляю графическую панель слева (0,0) и текстовую панель справа (1,0), используя метод gridbaglayout.Тем не менее, графическая панель не будет отображаться в кадре.Я пробовал многочисленные методы, чтобы попытаться заставить панель показываться безуспешно.

import java.awt.*;
import javax.swing.*;

public class GraphicsTest extends JFrame {

    private final JPanel textPanel;
    private final JLabel textLabel;

    public GraphicsTest() {
        textPanel = new JPanel(new BorderLayout());
        textLabel = new JLabel("Home label");

        this.setBounds(180, 112, 1080, 675);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLayout(new GridBagLayout());

        textPanel.add(textLabel, BorderLayout.NORTH);

        addComponent(this, new GraphicPanel(), 0, 0, 1, 1, GridBagConstraints.CENTER);
        addComponent(this, textPanel, 1, 0, 1, 1, GridBagConstraints.CENTER);

        this.setVisible(true);
    }

    public class GraphicPanel extends JPanel {

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

        public void paintComponents(Graphics g) {
            Graphics2D g2d = (Graphics2D) g;
            // drawing lots of shapes and lines, removed for readibility
        }   

    }

    public void addComponent(JFrame frame, JComponent component, int x, int y, int width, int height, int align) {
        GridBagConstraints c = new GridBagConstraints();

        c.gridx = x;
        c.gridy = y;
        c.gridwidth = width;
        c.gridheight = height;
        c.weightx = 100.0;
        c.weighty = 100.0;
        c.insets = new Insets(5, 0, 5, 0);
        c.anchor = align;
        c.fill = GridBagConstraints.NONE;

        frame.add(component, c);
    }

    public static void main(String[] args) {
        GraphicsTest gui = new GraphicsTest();
    }

}

1 Ответ

1 голос
/ 22 марта 2019

Работает нормально для меня, когда я использую размер как (200, 200).

GridbagLayout работает так, что если компонент не может быть отображен в его предпочтительном размере, то он будет отображаться в своем минимальном размере, который будет (0, 0).

Так что(700, 700) работы будут зависеть от вашего разрешения экрана.Это также работает в (700, 600) для моего экрана.

Я спрашиваю, хотите ли вы использовать GridBadLayout.Может быть, просто используйте BorderLayout.Пользовательская панель рисования будет помещена в ЦЕНТР, поэтому она будет увеличиваться / уменьшаться при изменении размера рамки.Другая панель перейдет к LINE_END, поэтому она останется в фиксированном размере.

...