Как сделать так, чтобы кнопка не мешала расположению нарисованной фигуры? - PullRequest
0 голосов
/ 04 апреля 2020

Таким образом, в основном, когда я добавляю кнопку, она по существу отталкивает черный прямоугольник, нарисованный в этой программе, и выводит его из заданного местоположения. Как бы вы это исправить?

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

public class Grid {

    public class homeGraphics extends JComponent {
        homeGraphics() {
            setPreferredSize(new Dimension(450, 600));
        }

        public void paint(Graphics g) {
            super.paint(g);
            g.fillRect(200, 275, 50, 50);
        }
    }

    public void homeFrame() {
        JFrame frame1 = new JFrame();
        frame1.setSize(450, 600);
        frame1.setResizable(false);
        frame1.setDefaultCloseOperation(frame1.EXIT_ON_CLOSE);

        JButton playButton = new JButton("Play");
        playButton.setPreferredSize(new Dimension(60, 30));

        JPanel panel1 = new JPanel();
        panel1.add(playButton);
        panel1.add(new homeGraphics());

        frame1.add(panel1);
        frame1.setVisible(true);
    }

    public static void main(String args[]) {
        Grid frame = new Grid();
        frame.homeFrame();
    }
}```

1 Ответ

1 голос
/ 04 апреля 2020

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

Что вы имеете в виду вне его местоположения? Покраска всегда выполняется относительно компонента. Таким образом, ваша картина всегда будет выполняться в (200, 275) компонента.

Если вы пытаетесь рисовать в (200, 275) относительно «рамки», то не надо. Это НЕ, как живопись работает.

Другие проблемы с вашим кодом:

  1. Не пытайтесь установить размер вашего кадра. Если пользовательская панель имеет размер (450, 600), как рамка может иметь одинаковый размер? Рамка также содержит «строку заголовка» и «границы». Вместо использования setSize () вы вызываете frame .pack () just before frame1.setVisible (….) `.

  2. Имена классов начинаются с символа верхнего регистра. Учитесь на примере. Вы когда-нибудь видели имя класса в JDK, которое не начинается с символа в верхнем регистре?

  3. Пользовательское рисование выполняется путем переопределения paintComponent(…), а не paint ().

  4. По умолчанию JPanel использует FlowLayout. То, что вы видите, это кнопка в одной строке, а затем класс «HomeGraphics» слишком велик, чтобы поместиться в одной строке, поэтому он переносится на вторую строку.

Вы должны быть более явными, когда делаете макет кадра. Таким образом, ваш код должен выглядеть примерно так:

JPanel wrapper = new JPanel();
wrapper.add( playButton );

//JPanel panel1 = new JPanel();
//panel1.add(playButton);
//panel1.add(new homeGraphics());
JPanel panel1 = new JPanel( new BorderLayout() );
panel1.add(wrapper, BorderLayout.PAGE_START);
panel1.add(new HomeGraphics(), BorderLayout.CENTER);

Теперь код более четко показывает вашу попытку размещения.

...