Почему генератор случайных точек выполняет цикл? [Дубликат]

Вариант 1 - Проект установки:

С помощью Visual Studio вы можете создать проект установки и установить необходимые компоненты во время установки.

Процесс установки очень прост, и конец Пользователь может установить приложение и предварительные условия после нажатия следующих кнопок.

  1. Как создать или добавить проект установки
  2. Практическое руководство. Установка предварительных требований в развертывание установщика Windows
  3. Пошаговое руководство. Использование пользовательского действия для создания базы данных при установке

При настройке необходимых условий , его достаточно, чтобы выбрать SQL Server Express.

Вариант 2 - ClickOnce:

С помощью Visual Studio другой вариант использует публикацию ClickOnce. В свойствах вашего проекта на вкладке «Публикация» нажмите кнопку «Предварительные условия», вы можете выбрать SQL Express в предварительных условиях. Таким образом, вам нужно всего лишь установить файлы базы данных для копирования в выходной каталог и использовать AttachDbFileName в строке подключения: Data Source=.\SQLEXPRESS; AttachDbFilename=|DataDirectory|\Database.mdf; Initial Catalog=Master"

Шаги для создания проекта установки:


1- Создать приложение AC # Windows Forms

  1. Создать проект C # Windows Forms
  2. Добавить новый элемент и добавить базу данных SQL Server в ваше приложение
  3. Добавить таблицу в ваше приложение и заполнить некоторые данные в ней
  4. Показывать данные в вашей основной форме.

2- Создать проект настройки

  1. добавить новый проект => настройка и развертывание => проект настройки
  2. Щелкните правой кнопкой мыши проект установки и добавьте вывод проекта и выберите основной выход из основного проекта
  3. Щелкните правой кнопкой мыши проект установки и добавьте выход проекта и выберите файлы содержимого из вашего основного проекта
  4. Щелкните правой кнопкой мыши по проекту настройки и нажмите «Свойства» и выберите «Предварительные требования» и выберите « SQL Server Express
  5. Выберите .Net Framework
  6. Выберите Windows Installer
  7. Выберите радиокнопку Загрузите предварительные условия из того же места, что и мое приложение.
  8. Щелкните правой кнопкой мыши на рабочем столе пользователей на левой панели и добавьте новый ярлык и выберите папку приложения, основной вывод из SampleApplication и нажмите «ОК», и переименуйте короткий фрагмент на то, что вам нужно.
  9. Восстановить решение.
  10. Проект настройки перестройки
  11. Перейдите в каталог вывода проекта установки и запустите setup.exe

Это так просто.

53
задан Matt Taylor 21 March 2013 в 12:19
поделиться

4 ответа

(очень) короткий ответ на ваш вопрос заключается в том, что paintComponent называется «когда он должен быть». Иногда легче понять систему GUI Java Swing как «черный ящик», где большая часть внутренних элементов обрабатывается без слишком большой видимости.

Существует ряд факторов, которые определяют, когда компонент нуждается для перекраски, начиная от перемещения, изменения размеров, изменения фокуса, скрытия других кадров и т. д. и т. д. Многие из этих событий обнаруживаются автомагически, а paintComponent вызывается внутренне, когда определяется, что эта операция необходима.

Я работал с Swing уже много лет, и я не думаю, что я когда-либо называл paintComponent напрямую, или даже видел, как он вызывался напрямую из чего-то другого. Самое близкое, что я пришел, использует методы repaint() для программного запуска перерисовки некоторых компонентов (которые, как я предполагаю, называет правильные методы paintComponent ниже по течению.

По моему опыту, paintComponent редко Я признаю, что существуют задачи персонализированного рендеринга, требующие такой детализации, но Java Swing предлагает (довольно) надежный набор JComponents и Layouts, который может использоваться для большей части тяжелого подъема без прямого переопределения paintComponent Я предполагаю, что моя точка зрения состоит в том, чтобы убедиться, что вы не можете что-то сделать с родными JComponents и макетами, прежде чем уйти, пытаясь свернуть свои собственные компоненты, созданные пользователем.

30
ответ дан SeKa 19 August 2018 в 18:28
поделиться
  • 1
    Спасибо @GuillaumePolet за это. Мои условия были там технически неправильными, как вы сказали. Я отредактировал сообщение, чтобы уточнить. – SeKa 21 March 2013 в 12:50
  • 2
    SeKa, так как вы много лет работали с качелями, не возражаете, если я спрошу, это swing / javafx что-то, что стоит изучить у студента / ищущего работу перспективы? качели / javafx много использовали? Большое спасибо за любые предложения. – Thor 30 June 2016 в 09:51

Внутренние системы GUI вызывают этот метод, и они передают параметр Graphics в качестве графического контекста, на который вы можете рисовать.

3
ответ дан Gian 19 August 2018 в 18:28
поделиться
  • 1
    спасибо, поэтому когда этот метод называется? – Hải Phong 21 March 2013 в 12:26
  • 2
    @ nubhihi219 не имеет значения :-) У вас нет контроля над тем, когда картина происходит в любом случае, internals - это ... хорошо ... внутренности, о чем не о чем беспокоиться в разработке приложений, за исключением очень редкие угловые шкафы – kleopatra 21 March 2013 в 12:39

Две вещи, которые вы можете сделать здесь:

  1. Чтение Покраска в AWT и Swing
  2. Используйте отладчик и поместите контрольную точку в paintComponent метод. Затем переходите к stacktrace и смотрите, как он предоставляет параметр Graphics.

Просто для информации, вот стек, который я получил из примера кода, который я опубликовал в конце:

Thread [AWT-EventQueue-0] (Suspended (breakpoint at line 15 in TestPaint))  
    TestPaint.paintComponent(Graphics) line: 15 
    TestPaint(JComponent).paint(Graphics) line: 1054    
    JPanel(JComponent).paintChildren(Graphics) line: 887    
    JPanel(JComponent).paint(Graphics) line: 1063   
    JLayeredPane(JComponent).paintChildren(Graphics) line: 887  
    JLayeredPane(JComponent).paint(Graphics) line: 1063 
    JLayeredPane.paint(Graphics) line: 585  
    JRootPane(JComponent).paintChildren(Graphics) line: 887 
    JRootPane(JComponent).paintToOffscreen(Graphics, int, int, int, int, int, int) line: 5228   
    RepaintManager$PaintManager.paintDoubleBuffered(JComponent, Image, Graphics, int, int, int, int) line: 1482 
    RepaintManager$PaintManager.paint(JComponent, JComponent, Graphics, int, int, int, int) line: 1413  
    RepaintManager.paint(JComponent, JComponent, Graphics, int, int, int, int) line: 1206   
    JRootPane(JComponent).paint(Graphics) line: 1040    
    GraphicsCallback$PaintCallback.run(Component, Graphics) line: 39    
    GraphicsCallback$PaintCallback(SunGraphicsCallback).runOneComponent(Component, Rectangle, Graphics, Shape, int) line: 78    
    GraphicsCallback$PaintCallback(SunGraphicsCallback).runComponents(Component[], Graphics, int) line: 115 
    JFrame(Container).paint(Graphics) line: 1967    
    JFrame(Window).paint(Graphics) line: 3867   
    RepaintManager.paintDirtyRegions(Map<Component,Rectangle>) line: 781    
    RepaintManager.paintDirtyRegions() line: 728    
    RepaintManager.prePaintDirtyRegions() line: 677 
    RepaintManager.access$700(RepaintManager) line: 59  
    RepaintManager$ProcessingRunnable.run() line: 1621  
    InvocationEvent.dispatch() line: 251    
    EventQueue.dispatchEventImpl(AWTEvent, Object) line: 705    
    EventQueue.access$000(EventQueue, AWTEvent, Object) line: 101   
    EventQueue$3.run() line: 666    
    EventQueue$3.run() line: 664    
    AccessController.doPrivileged(PrivilegedAction<T>, AccessControlContext) line: not available [native method]    
    ProtectionDomain$1.doIntersectionPrivilege(PrivilegedAction<T>, AccessControlContext, AccessControlContext) line: 76    
    EventQueue.dispatchEvent(AWTEvent) line: 675    
    EventDispatchThread.pumpOneEventForFilters(int) line: 211   
    EventDispatchThread.pumpEventsForFilter(int, Conditional, EventFilter) line: 128    
    EventDispatchThread.pumpEventsForHierarchy(int, Conditional, Component) line: 117   
    EventDispatchThread.pumpEvents(int, Conditional) line: 113  
    EventDispatchThread.pumpEvents(Conditional) line: 105   
    EventDispatchThread.run() line: 90  

Графический параметр приходит отсюда:

RepaintManager.paintDirtyRegions(Map) line: 781 

Привлекательный фрагмент выглядит следующим образом:

Graphics g = JComponent.safelyGetGraphics(
                        dirtyComponent, dirtyComponent);
                // If the Graphics goes away, it means someone disposed of
                // the window, don't do anything.
                if (g != null) {
                    g.setClip(rect.x, rect.y, rect.width, rect.height);
                    try {
                        dirtyComponent.paint(g); // This will eventually call paintComponent()
                    } finally {
                        g.dispose();
                    }
                }

Если вы посмотрите на него, вы что он извлекает графику из самого JComponent (косвенно с javax.swing.JComponent.safelyGetGraphics(Component, Component)), который сам берет его в конечном счете из своего первого «весового весового» (привязанного к границам компонента), который он сам берет из соответствующего соответствующего ресурса.

Что касается того, что вы должны отдать Graphics на Graphics2D, просто случается, что при работе с Window Toolkit Graphics на самом деле распространяется Graphics2D, но вы можете использовать другие Graphics, которые «не должны» расширяются Graphics2D (это происходит не очень часто, но AWT / Swing позволяет это сделать).

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;

class TestPaint extends JPanel {

    public TestPaint() {
        setBackground(Color.WHITE);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawOval(0, 0, getWidth(), getHeight());
    }

    public static void main(String[] args) {
        JFrame jFrame = new JFrame();
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.setSize(300, 300);
        jFrame.add(new TestPaint());
        jFrame.setVisible(true);
    }
}
10
ответ дан Guillaume Polet 19 August 2018 в 18:28
поделиться
  • 1
    Как бы вы нарисовали JPanel, если TestPaint не расширил класс JPanel? – Doug Hauf 6 May 2014 в 18:36

Вызов object.paintComponent(g) - ошибка.

Вместо этого этот метод вызывается автоматически при создании панели. Метод paintComponent() также может быть явно вызван методом repaint(), определенным в классе Component.

Эффект вызова repaint() заключается в том, что Swing автоматически очищает графику на панели и выполняет paintComponent для перерисовки графики на этой панели.

3
ответ дан Pokechu22 19 August 2018 в 18:28
поделиться
Другие вопросы по тегам:

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