Предлагает ли Ant способ обойти зависимость?

Это относительно простая концепция (без обид).

Для начала не смешивайте свой код с JApplet и JFrame. Если вы хотите использовать свое приложение в этих двух средах, отделите логику на отдельный компонент (например, JPanel), который вы можете легко добавить к нему. Вы действительно не должны добавлять контейнер верхнего уровня в другой контейнер верхнего уровня (добавление апплета в фрейм) - это грязно.

Избегайте переопределения методов paint для контейнеров верхнего уровня (например, JApplet ) вместо этого используйте пользовательский компонент (например, JPanel) и переопределите его метод paintComponent.

В вашем примере вы должны называть super.paint, а не super.paintComponents. paint делает важную работу, вы не хотите ее пропускать, но вы должны использовать JComponent#paintComponent

MouseListener s, который должен быть добавлен к компонентам, которые вы заинтересованы в управлении событиями мыши. Поскольку clicked никогда не добавляется в какие-либо контейнеры, он никогда не получит события мыши.

Взгляните на

enter image description here [/g4]

public class SimplePaint03 {

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

    public SimplePaint03() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new PaintPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class PaintPane extends JPanel {

        private List grid;
        private List fill;

        public PaintPane() {
            grid = new ArrayList<>(5);
            fill = new ArrayList<>(5);
            addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    for (Shape shape : grid) {
                        if (shape.contains(e.getPoint())) {
                            if (fill.contains(shape)) {
                                fill.remove(shape);
                            } else {
                                fill.add(shape);
                            }
                        }
                    }
                    repaint();
                }
            });

            int colWidth = 200 / 50;
            int rowHeight = 200 / 50;

            for (int row = 0; row < 50; row++) {
                for (int col = 0; col < 50; col++) {
                    grid.add(new Rectangle(colWidth * col, rowHeight * row, colWidth, rowHeight));
                }
            }

        }

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

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g); 
            Graphics2D g2d = (Graphics2D) g;
            g2d.setColor(Color.RED);
            for (Shape cell : fill) {
                g2d.fill(cell);
            }
            g2d.setColor(Color.BLACK);
            for (Shape cell : grid) {
                g2d.draw(cell);
            }
        }

    }

}

Дополнительно

Информация из одного цикла краски в другой не поддерживается. Вы должны перекрасить компонент точно так, как хотите. Это означает, что вам нужно будет сохранить список точек щелчка, которые можно перекрасить в любое время.

13
задан philant 26 January 2009 в 13:19
поделиться

5 ответов

Нет, Вы не можете пропустить его, не изменяя файл типа "build".

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

, Например:

<target name="compile" depends="init, do-compile" description="Compiles all of the source code" />

<target name="do-compile">
        <javac destdir="${classes.dir}" debug="true" encoding="ISO-8859-1">
            <src refid="src.path" />
            <include name="*.java" />
            <classpath refid="external.libraries.classpath" />
        </javac>
</target>
20
ответ дан John Sonmez 26 January 2009 в 23:19
поделиться
  • 1
    Интересный. Хорошо можно всегда принимать значение по умолчанию только к использованию литералов 1,2,4,8 и т.д. – Connor 6 June 2014 в 08:18

Правильно написанная цель сборки ничего не должна будет восстанавливать, если код не изменился. Таким образом, то, что тестовая цель зависит от него, должно быть в основном не важным. Если Вы выполняете цель сборки дважды подряд, и она пытается восстановить что-то во второй раз, когда Вы могли бы хотеть заняться расследованиями, почему она делает это.

простой способ постараться не выполнять цель состоит в том, чтобы установить "если" атрибут цели к названию некоторого свойства. Если Вы затем установите это свойство на командной строке при выполнении Муравья, то это обойдет ту цель.

2
ответ дан Dan Dyer 26 January 2009 в 23:19
поделиться

Просто "удалите" зависимость временно? 'Если код уже создается, все Ваши файлы должны быть доступными, нет? - ой, просто видел, что Вы не можете изменить файл, хм, почему donВґt Вы выполняете то же задание локально сначала?

0
ответ дан PPS 26 January 2009 в 23:19
поделиться
  • 1
    Это - умное обходное решение при использовании Jasmine. +1 – Liam 26 January 2014 в 09:27

Лично я нашел, что материал зависимости у Муравья мешает больше, чем помощь. Я обычно настраивал два набора целей - которые на самом деле действительно наполняют (без зависимостей), и затем предназначается, который всего имеют зависимости. Тем путем можно легко выполнить единую цель, и можно также легко выполнить целый комплект и т.д. Это согласуется с практичный (а не идеологический) использование, по моему мнению.

4
ответ дан Jon Skeet 26 January 2009 в 23:19
поделиться

Используйте эти unless атрибут.

<target name="test" unless="dont.run.tests">

, Если Вы не хотите, чтобы "тест" работал, всего

муравей-ddont.run.tests=true

, Это должно быть не определено, если Вы хотите, чтобы тесты работали. Муравей просто проверяет на то, определяется ли он вообще. Кроме того, существует if атрибут, который делает обратное.

Вот статья об обоих.

30
ответ дан sblundy 26 January 2009 в 23:19
поделиться
Другие вопросы по тегам:

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