Вариант 1 - Проект установки:
С помощью Visual Studio вы можете создать проект установки и установить необходимые компоненты во время установки.
Процесс установки очень прост, и конец Пользователь может установить приложение и предварительные условия после нажатия следующих кнопок.
При настройке необходимых условий , его достаточно, чтобы выбрать 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
2- Создать проект настройки
Это так просто.
(очень) короткий ответ на ваш вопрос заключается в том, что paintComponent
называется «когда он должен быть». Иногда легче понять систему GUI Java Swing как «черный ящик», где большая часть внутренних элементов обрабатывается без слишком большой видимости.
Существует ряд факторов, которые определяют, когда компонент нуждается для перекраски, начиная от перемещения, изменения размеров, изменения фокуса, скрытия других кадров и т. д. и т. д. Многие из этих событий обнаруживаются автомагически, а paintComponent
вызывается внутренне, когда определяется, что эта операция необходима.
Я работал с Swing уже много лет, и я не думаю, что я когда-либо называл paintComponent
напрямую, или даже видел, как он вызывался напрямую из чего-то другого. Самое близкое, что я пришел, использует методы repaint()
для программного запуска перерисовки некоторых компонентов (которые, как я предполагаю, называет правильные методы paintComponent
ниже по течению.
По моему опыту, paintComponent
редко Я признаю, что существуют задачи персонализированного рендеринга, требующие такой детализации, но Java Swing предлагает (довольно) надежный набор JComponents и Layouts, который может использоваться для большей части тяжелого подъема без прямого переопределения paintComponent
Я предполагаю, что моя точка зрения состоит в том, чтобы убедиться, что вы не можете что-то сделать с родными JComponents и макетами, прежде чем уйти, пытаясь свернуть свои собственные компоненты, созданные пользователем.
Внутренние системы GUI вызывают этот метод, и они передают параметр 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);
}
}
Вызов object.paintComponent(g)
- ошибка.
Вместо этого этот метод вызывается автоматически при создании панели. Метод paintComponent()
также может быть явно вызван методом repaint()
, определенным в классе Component
.
Эффект вызова repaint()
заключается в том, что Swing автоматически очищает графику на панели и выполняет paintComponent
для перерисовки графики на этой панели.