Amazon S3 as cdn копирует изображения с моего сервера

Чтобы ваше приложение Swing работало так, как ожидалось, есть много вещей, которые вам нужно иметь в виду. Всегда есть определенные шаги, которые нужно выполнить, чтобы избежать определенных препятствий, которые могут возникнуть, поскольку вы неправильно закодированы. Для этого придерживайтесь основ программирования Swing строго и следуйте им.

  • Как и упоминалось @HovercraftFullOfEels, вы вызываете прямо на свою графику, чего никогда не следует делать.
  • Во-вторых, посмотрите на свой конструктор GameFrame(), вы его установили до видимости, даже до того, как вы добавили к нему какие-либо компоненты и многое другое, пока не будет установлен реальный размер

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

Теперь, приходя к вашей программе, вы пропустили главное, поскольку вы не указали размер вашего CustomComponent, то есть JComponent, следовательно, вы не были который можно увидеть на экране. По мере того, как вы расширяете JCompoent до вашего класса, сделайте обычным привычку переопределять его getPreferredSize () , таким же образом вы переопределите его метод paintComponent(...).

Have Посмотрите на эту небольшую программу, которую я создал для вас, возможно, это поможет вам понять, понять логику немного больше.

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.RoundRectangle2D;
import javax.swing.*;

public class CustomPainting {

    private RectangleComponent life;
    private RectangleComponent death;

    private void createAndDisplayGUI() {
        JFrame frame = new JFrame("Custom Painting");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JPanel centerPanel = new JPanel();
        centerPanel.setLayout(new GridLayout(0, 2, 5, 5));
        // Specifying the WIDTH, HEIGHT and Colour for this JComponent.
        life = new RectangleComponent(Color.GREEN.darker(), 20, 20);
        death = new RectangleComponent(Color.RED.darker(), 20, 20);
        centerPanel.add(life);
        centerPanel.add(death);

        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
        JButton incLifeButton = new JButton("INCREASE LIFE");
        incLifeButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                life.addLife(1);
            }
        });

        JButton decLifeButton = new JButton("DECREASE LIFE");
        decLifeButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                life.subtractLife(1);
            }
        });

        JButton incDeathButton = new JButton("INCREASE DEATH");
        incDeathButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                death.addLife(1);
            }
        });

        JButton decDeathButton = new JButton("DECREASE DEATH");
        decDeathButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                death.subtractLife(1);
            }
        }); 

        buttonPanel.add(incLifeButton);
        buttonPanel.add(decLifeButton);
        buttonPanel.add(incDeathButton);
        buttonPanel.add(decDeathButton);

        frame.getContentPane().add(centerPanel, BorderLayout.CENTER);
        frame.getContentPane().add(buttonPanel, BorderLayout.PAGE_END);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String\u005B\u005D args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new CustomPainting().createAndDisplayGUI();
            }
        });
    }
}

class RectangleComponent extends JComponent {

    private Color colour;
    private static final int MARGIN = 10;
    private int width;
    private int height;
    private int originalWidth;
    private RoundRectangle2D roundedRectangle;

    public RectangleComponent(Color c, int w, int h) {
        colour = c;
        width = w;
        height = h;
        originalWidth = width;
    }

    /*
     * Overriding this method, so that
     * the size of the JComponent
     * can be determined, on the screen
     * or by the LayoutManager concern.
     */
    @Override 
    public Dimension getPreferredSize() {
        return (new Dimension(width, height));
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        roundedRectangle = new RoundRectangle2D.Float(MARGIN, MARGIN,
                                        width, height, MARGIN, MARGIN);
        g2d.setPaint(colour);
        g2d.draw(roundedRectangle);
        g2d.fill(roundedRectangle);
    }

    public void subtractLife(int amount) {
        width -= amount;
        System.out.println("ORIGINAL Width : " + originalWidth);
        System.out.println("Width : " + width);
        if (width > 0) {
            roundedRectangle.setRoundRect(MARGIN, MARGIN, width, height,
                                            MARGIN, MARGIN);
            /*
             * This repaint() will call the paintComponent(...)
             * by itself, so nothing else to be done.
             */
            repaint();
        } else {
            width += amount;
        }
    }

    public void addLife(int amount) {
        width += amount;
        System.out.println("ORIGINAL Width : " + originalWidth);
        System.out.println("Width : " + width);
        if (width < originalWidth) {
            roundedRectangle.setRoundRect(MARGIN, MARGIN, width, height,
                                            MARGIN, MARGIN);
            repaint();
        } else {
            width -= amount;
        }
    }
}

Задавайте любой вопрос, который может возникнуть как вы проходите эту программу :-), я с радостью помогу в этом: -)

** ПОСЛЕДНИЕ ИЗМЕНЕНИЯ С ДВУМЯ ЦВЕТАМИ: **

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.RoundRectangle2D;
import javax.swing.*;

public class CustomPainting {

    private RectangleComponent lifeDeath;

    private void createAndDisplayGUI() {
        JFrame frame = new JFrame("Custom Painting");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JPanel centerPanel = new JPanel();
        centerPanel.setLayout(new GridLayout(0, 2, 5, 5));
        // Specifying the WIDTH, HEIGHT and Colour for this JComponent.
        lifeDeath = new RectangleComponent(Color.GREEN, Color.RED, 20, 20);
        centerPanel.add(lifeDeath);

        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new GridLayout(1, 2, 5, 5));
        JButton incLifeButton = new JButton("INCREASE LIFE");
        incLifeButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                lifeDeath.addLife(1);
            }
        });

        JButton decLifeButton = new JButton("DECREASE LIFE");
        decLifeButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                lifeDeath.subtractLife(1);
            }
        });

        buttonPanel.add(incLifeButton);
        buttonPanel.add(decLifeButton);

        frame.getContentPane().add(centerPanel, BorderLayout.CENTER);
        frame.getContentPane().add(buttonPanel, BorderLayout.PAGE_END);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String\u005B\u005D args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new CustomPainting().createAndDisplayGUI();
            }
        });
    }
}

class RectangleComponent extends JComponent {

    private Color lifeColour;
    private Color deathColour;
    private static final int MARGIN = 10;
    private int widthLife;
    private int widthDeath;
    private int height;
    private int originalWidth;
    private RoundRectangle2D roundedRectangle;

    public RectangleComponent(Color lc, Color dc, int w, int h) {
        lifeColour = lc;
        deathColour = dc;
        widthLife = w;
        height = h;
        originalWidth = widthLife;
        widthDeath = 0;     
    }

    /*
     * Overriding this method, so that
     * the size of the JComponent
     * can be determined, on the screen
     * or by the LayoutManager concern.
     */
    @Override 
    public Dimension getPreferredSize() {
        return (new Dimension(originalWidth, height));
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;

        roundedRectangle = new RoundRectangle2D.Float((MARGIN + widthDeath), MARGIN,
                                        widthLife, height, MARGIN, MARGIN);
        g2d.setPaint(lifeColour);
        g2d.draw(roundedRectangle);
        g2d.fill(roundedRectangle);

        roundedRectangle.setRoundRect(MARGIN, MARGIN,
                                        widthDeath, height, MARGIN, MARGIN);
        g2d.setPaint(deathColour);
        g2d.draw(roundedRectangle);
        g2d.fill(roundedRectangle);
    }

    public void subtractLife(int amount) {
        widthLife -= amount;
        widthDeath += amount;
        System.out.println("ORIGINAL Width : " + originalWidth);
        System.out.println("Width Life : " + widthLife);
        System.out.println("Width Death : " + widthDeath);
        if (widthLife > 0 && widthDeath < originalWidth) {
            /*
             * This repaint() will call the paintComponent(...)
             * by itself, so nothing else to be done.
             */
            repaint();
        } else {
            widthLife += amount;
            widthDeath -= amount;
        }
    }

    public void addLife(int amount) {
        widthLife += amount;
        widthDeath -= amount;
        System.out.println("ORIGINAL Width : " + originalWidth);
        System.out.println("Width Life : " + widthLife);
        System.out.println("Width Death : " + widthDeath);
        if (widthLife < originalWidth && widthDeath > 0) {
            repaint();
        } else {
            widthLife -= amount;
            widthDeath += amount;
        }   
    }
}

0
задан Imran Ahmed 18 January 2019 в 03:57
поделиться

2 ответа

Если я установлю его на свой домен, возникнет проблема с использованием моего хостинга.

Более дорогой, чем объем хранилища, является стоимость наличия сервера, готового обработать запрос. Логика вашего приложения будет знать, когда изображения меняются; это время, чтобы поместить их в S3.

как доставить мои изображения на S3 без особых хлопот?

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

Или, может быть, S3 сам по себе работает как CDN

CloudFront может использовать предоставленное клиентом имя DNS и соответствующий сертификат , так что вы можете использовать собственный домен с HTTPS. Он может интегрироваться в AWS WAF, который S3 не может напрямую. В противном случае CDN ведет себя аналогично s3. CloudFront должен обеспечивать лучшее кэширование и локальность конечных точек, но вы увидите небольшие функциональные различия при низких объемах. Ни одно из них не является постоянным для чтения после записи, но Cloudfront кеширует дополнительно. Ценообразование вряд ли сделает CloudFront более дешевым для большинства применений.

0
ответ дан Daniel Farrell 18 January 2019 в 03:57
поделиться

Возможно ли, что CloudFront работает с S3, но если изображение отсутствует на S3, оно копирует его с моего сервера на S3?

Закрыть.

CloudFront имеет функцию, которая поможет вам двигаться в этом направлении - исходные группы . Создайте исходную группу с S3 в качестве основного и вашего сервера в качестве дополнительного. Каждый раз, когда CloudFront сталкивается с отсутствием кэша, он сначала проверяет S3, и только если изображение отсутствует, он повторяет попытку, отправляя запрос на ваш сервер. Он будет кэшировать ответ, но не будет помнить источник объекта - поэтому последующие запросы на будущие пропуски кэша для того же объекта всегда будут сначала пытаться выполнить S3.

Это означает, что что-то на вашем сервере должно отвечать за конечное перемещение изображений на S3 - но пока изображение существует в одном или другом месте, оно будет обслуживаться CloudFront и кэшироваться. в CloudFront по ребру или ребрам (до двух - один глобальный / внешний, один региональный / внутренний), который обрабатывал запрос.

0
ответ дан Michael - sqlbot 18 January 2019 в 03:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: