Custom Create или произвольный дизайн формы

89
05 августа 2019, 09:10

Возникла проблема при создании произвольного дизайна формы. Накидал форму:

public class Form extends JFrame {
    private JPanel rootPanel;
    private JButton close;
    private JTextField text;
    private JButton submit;
    private JPanel imagePanel;
    private Decoration decoration;
    private JButton[] yesNoButtons = Helper.createButtons(JOptionPane.YES_NO_OPTION);
    private JButton[] okCancelButtons = Helper.createButtons(JOptionPane.OK_CANCEL_OPTION);
    {
        setContentPane(rootPanel);
        decoration = new Decoration(this);
        setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                super.windowClosing(e);
                closeProgram();
                System.exit(0);
            }
        });
        setSize(800, 600);
        setMinimumSize(new Dimension(400, 300));
        submit.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int result = decoration.showOptionDialog(
                        Form.this,
                        "Question",
                        JOptionPane.QUESTION_MESSAGE,
                        JOptionPane.YES_NO_OPTION,
                        null,
                        yesNoButtons,
                        yesNoButtons[0]
                );
                System.out.println(result);
            }
        });
        close.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("close");
            }
        });
    }
    private void closeProgram()
    {
        System.out.println("Exit Application");
    }
    public static void main(String[] args) {
        try {
            UIManager.getCrossPlatformLookAndFeelClassName();
        } catch (Exception e) {
            e.printStackTrace();
        }
        Form frame = new Form();
        frame.setLocationRelativeTo(null);
        // Закрытие процесса приложения
        //frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
    private void createUIComponents() {
        // TODO: place custom component creation code here
        imagePanel = new ImagePanel(Images.getBgImage(), true, true);
        close = new ImageButton(Images.getButtonImage(), true, true);
    }
}

Класс ImagePanel для произвольной imagePanel с которой проблемы нет. Задал картинку из ресурсов:

    import java.awt.*;
import javax.swing.JPanel;
public class ImagePanel extends JPanel {
    private Image image;
    private boolean uniform;
    private boolean fill;
    /**
     * Creates a new <code>JPanel</code> with a double buffer
     * and a flow layout.
     */
    public ImagePanel(Image image, boolean uniform, boolean fill) {
        this.image = image;
        this.uniform = uniform;
        this.fill = fill;
    }
    public ImagePanel(Image image)
    {
        this.image = image;
    }
    @Override
    protected void paintComponent(Graphics graphics) {
        super.paintComponent(graphics);
        Rectangle rect = Helper.getAreaToFill(
                this.getSize(),
                new Dimension(image.getWidth(null), image.getHeight(null)),
                this.uniform,
                this.fill
        );
        graphics.drawImage(image, rect.x, rect.y, rect.width, rect.height, null);
    }
    @Override
    protected void paintBorder(Graphics g) {
        super.paintBorder(g);
    }
}

И проблемный произвольный класс для редизайна картинки:

public class ImageButton extends JButton {
    private Image image;
    private boolean uniform;
    private boolean fill;
    /**
     * Creates a button with no set text or icon.
     */
    public ImageButton(Image image, boolean uniform, boolean fill) {
        this.image = image;
        this.uniform = uniform;
        this.fill = fill;
    }
    public ImageButton(Image image)
    {
        this.image = image;
    }
    /**
     * FIXME: Not Drow
     * TODO: Process inactive buttons
     */
    @Override
    protected void printComponent(Graphics graphics) {
        super.printComponent(graphics);
        if (isOpaque()) {
            graphics.setColor(getBackground());
            graphics.fillRect(0, 0, getWidth(), getHeight());
        }
        Rectangle rect = Helper.getAreaToFill(
                this.getSize(),
                new Dimension(image.getWidth(null), image.getHeight(null)),
                this.uniform,
                this.fill
        );
        if (isEnabled()) {
            graphics.drawImage(image, rect.x, rect.y, rect.width, rect.height, null);
        } else {
        }
    }
}

И класс Images:

import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
public class Images {
    private Images() {
    }
    private static BufferedImage buttonImage;
    private static BufferedImage closeImage;
    private static BufferedImage bgImage;
    public static BufferedImage getButtonImage()
    {
        if (buttonImage == null) {
            buttonImage = getImage("images/button.png");
        }
        return buttonImage;
    }
    public static BufferedImage getCloseImage() {
        if (closeImage == null) {
            closeImage = getImage("images/close_button.png");
        }
        return closeImage;
    }
    public static BufferedImage getBgImage() {
        if (bgImage == null) {
            bgImage = getImage("images/bg.jpg");
        }
        return bgImage;
    }
    private static BufferedImage getImage(String path) {
        try {
            return ImageIO.read(Images.class.getResource(path));
        } catch (IOException e) {
            e.printStackTrace();
            return new BufferedImage(1, 1, BufferedImage.TYPE_4BYTE_ABGR);
        }
    }
}

Вроде всё просто, но при дебаге в перегрженный метод printComponent() для ImageButton даже не попадаем, для ImagePanel фон картинкой применяется.

READ ALSO
Predicate in filtering

Predicate in filtering

не могу понять почему не компилится данныек код ведь типо пишет что у лмбд плохой тип

133
Нажатие за пределы View(EditText)

Нажатие за пределы View(EditText)

Нужно сделать так, чтобы программа понимала, что пользователь нажал на ЛЮБОЕ место экрана за пределами editText

123
Передать данные из одного фрагмента в другой через Preferences

Передать данные из одного фрагмента в другой через Preferences

Есть 2 фрагмента в одном активити которые сменяются слайдом(2 вкладки)2 фрагмента: ArmaturaWeight

104
Закрывается ли сессия

Закрывается ли сессия

Из одной статьи в интернете : SessionFactory getCurrentSession() возвращает сессию, связанную с контекстомНо для того, чтобы это работало, нам нужно настроить...

110