Національний технічний університет України
«Київський політехнічний інститут ім. Ігоря Сікорського»
Кафедра цифрових технологій в енергетиці
ЗВІТ
з виконання лабораторної роботи №7
з дисципліни «Програмування на мові Java»
«ПОБУДОВА ГРАФІЧНИХ ІНТЕРФЕЙСІВ ЗА ДОПОМОГОЮ ІНСТРУМЕНТІВ SWING»
Варіант 13
Завдання 2
package org.example;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
Цей клас є головним вікном програми для малювання заокруглених прямокутників.
Він дозволяє користувачам вибрати колір та розміри заокруглення, і
відображає заокруглений прямокутник на панелі малювання.
*/
public class Task2 extends JFrame {
private JComboBox<String> colorComboBox;
private static JSpinner widthSpinner;
private static JSpinner heightSpinner;
/**
Конструктор
*/
public Task2() {
setTitle("Rounded Rectangle App");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
setSize(700, 500);
DrawPanel drawPanel = new DrawPanel();
add(drawPanel, BorderLayout.CENTER);
JPanel bottomPanel = new JPanel(new FlowLayout());
String[] colors = {"Чорний", "Червоний", "Зелений", "Синій"};
colorComboBox = new JComboBox<>(colors);
bottomPanel.add(new JLabel("Колір:"));
bottomPanel.add(colorComboBox);
widthSpinner = new JSpinner(new SpinnerNumberModel(0, 0, 30, 1));
bottomPanel.add(new JLabel("Ширина закруглення:"));
bottomPanel.add(widthSpinner);
heightSpinner = new JSpinner(new SpinnerNumberModel(0, 0, 30, 1));
bottomPanel.add(new JLabel("Висота закруглення:"));
bottomPanel.add(heightSpinner);
JButton changeButton = new JButton("Змінити прямокутник");
changeButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
drawPanel.changeRectangle();
}
});
bottomPanel.add(changeButton);
add(bottomPanel, BorderLayout.SOUTH);
setLocationRelativeTo(null);
setVisible(true);
}
/**
Панель, на якій малюється заокруглений прямокутник.
*/
public static class DrawPanel extends JPanel {
public ComboBoxModel<Object> colorComboBox;
Color rectangleColor = Color.BLACK;
private int cornerWidth = 0;
private int cornerHeight = 0;
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(rectangleColor);
g2d.fillRoundRect(50, 50, 200, 100, cornerWidth, cornerHeight);
}
public void changeRectangle() {
String selectedColor = (String) colorComboBox.getSelectedItem();
rectangleColor = getColorFromString(selectedColor);
cornerWidth = (int) widthSpinner.getValue();
cornerHeight = (int) heightSpinner.getValue();
repaint();
}
Color getColorFromString(String colorName) {
switch (colorName) {
case "Чорний":
return Color.BLACK;
case "Червоний":
return Color.RED;
case "Зелений":
return Color.GREEN;
case "Синій":
return Color.BLUE;
default:
return Color.BLACK;
}
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new Task2());
}
}
/
Тести:
package org.example;
import org.junit.jupiter.api.Test;
import org.example.Task2;
import javax.swing.*;
import java.awt.*;
import static org.junit.jupiter.api.Assertions.*;
class Task2Test {
@Test
public void test_drawPanel_getColorFromString() {
Task2.DrawPanel panel = new Task2.DrawPanel();
assertEquals(Color.BLACK, panel.getColorFromString("Чорний"));
assertEquals(Color.RED, panel.getColorFromString("Червоний"));
assertEquals(Color.GREEN, panel.getColorFromString("Зелений"));
assertEquals(Color.BLUE, panel.getColorFromString("Синій"));
assertEquals(Color.BLACK, panel.getColorFromString("Invalid color"));
}
}
/
Завдання 14
package org.example;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* Клас Task14 представляє простий додаток для малювання трикутників.
* Додаток дозволяє користувачам вводити координати трьох точок трикутника та відображати
* намальований трикутник на графічному інтерфейсі.
*/
public class Task14 extends JFrame {
JSpinner x1Spinner;
JSpinner y1Spinner;
JSpinner x2Spinner;
JSpinner y2Spinner;
JSpinner x3Spinner;
JSpinner y3Spinner;
private JPanel bottomPanel;
JButton drawButton;
/**
* Конструктор
*/
public Task14() {
setTitle("Triangle Drawing App");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
JPanel topPanel = new JPanel(new FlowLayout());
topPanel.add(new JLabel("X1:"));
x1Spinner = createSpinner();
topPanel.add(x1Spinner);
topPanel.add(new JLabel("Y1:"));
y1Spinner = createSpinner();
topPanel.add(y1Spinner);
topPanel.add(new JLabel("X2:"));
x2Spinner = createSpinner();
topPanel.add(x2Spinner);
topPanel.add(new JLabel("Y2:"));
y2Spinner = createSpinner();
topPanel.add(y2Spinner);
topPanel.add(new JLabel("X3:"));
x3Spinner = createSpinner();
topPanel.add(x3Spinner);
topPanel.add(new JLabel("Y3:"));
y3Spinner = createSpinner();
topPanel.add(y3Spinner);
drawButton = new JButton("Вивести трикутник");
drawButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
drawTriangle();
}
});
topPanel.add(drawButton);
add(topPanel, BorderLayout.NORTH);
bottomPanel = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
drawTriangle();
}
};
bottomPanel.setPreferredSize(new Dimension(400, 400));
add(bottomPanel, BorderLayout.CENTER);
pack();
setLocationRelativeTo(null);
setVisible(true);
}
private JSpinner createSpinner() {
SpinnerModel spinnerModel = new SpinnerNumberModel(0, 0, 100, 1);
return new JSpinner(spinnerModel);
}
/**
* Малює трикутник на панелі, використовуючи введені користувачем координати.
*/
private void drawTriangle() {
int x1 = (int) x1Spinner.getValue();
int y1 = (int) y1Spinner.getValue();
int x2 = (int) x2Spinner.getValue();
int y2 = (int) y2Spinner.getValue();
int x3 = (int) x3Spinner.getValue();
int y3 = (int) y3Spinner.getValue();
Graphics g = bottomPanel.getGraphics();
drawTriangle(g, x1, y1, x2, y2, x3, y3);
}
private void drawTriangle(Graphics g, int x1, int y1, int x2, int y2, int x3, int y3) {
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.BLACK);
int[] xPoints = {x1, x2, x3};
int[] yPoints = {y1, y2, y3};
g2d.fillPolygon(xPoints, yPoints, 3);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new Task14());
}
}
/
Тести:
package org.example;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class Task14Test {
@Test
public void testValidInput() {
Task14 app = new Task14();
app.x1Spinner.setValue(50);
app.y1Spinner.setValue(75);
assertEquals(50, app.x1Spinner.getValue());
assertEquals(75, app.y1Spinner.getValue());
}
@Test
public void testInvalidInput() {
Task14 app = new Task14();
app.x2Spinner.setValue(-10);
assertEquals(-10, app.x2Spinner.getValue());
}
@Test
public void testDrawTriangleButton() {
Task14 app = new Task14();
app.drawButton.doClick();
}
@Test
public void testDrawTriangleCoordinates() {
Task14 app = new Task14();
app.x1Spinner.setValue(20);
app.y1Spinner.setValue(30);
app.x2Spinner.setValue(50);
app.y2Spinner.setValue(60);
app.x3Spinner.setValue(40);
app.y3Spinner.setValue(20);
app.drawButton.doClick();
}
}
/
Завдання 21
package org.example;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* Клас Task21 представляє додаток для відображення тексту з вказаними
* параметрами, такими як шрифт, колір та текстовий рядок.
*/
public class Task21 extends JFrame {
private JTextField textField;
private JComboBox<String> fontComboBox;
private JComboBox<String> colorComboBox;
private JPanel outputPanel;
/**
* Конструктор
*/
public Task21() {
setTitle("String Output App");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
createControlPanel();
createOutputPanel();
pack();
setLocationRelativeTo(null);
setVisible(true);
}
/**
* Створює панель управління з елементами для вводу тексту, вибору шрифту та кольору.
*/
private void createControlPanel() {
JPanel controlPanel = new JPanel(new FlowLayout());
JLabel textLabel = new JLabel("Text:");
textField = new JTextField(15);
JLabel fontLabel = new JLabel("Font:");
String[] fontOptions = {"Times New Roman", "Arial", "Verdana"};
fontComboBox = new JComboBox<>(fontOptions);
JLabel colorLabel = new JLabel("Color:");
String[] colorOptions = {"Black", "Red", "Green", "Blue"};
colorComboBox = new JComboBox<>(colorOptions);
JButton outputButton = new JButton("Output String");
outputButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
outputString();
}
});
controlPanel.add(textLabel);
controlPanel.add(textField);
controlPanel.add(fontLabel);
controlPanel.add(fontComboBox);
controlPanel.add(colorLabel);
controlPanel.add(colorComboBox);
controlPanel.add(outputButton);
add(controlPanel, BorderLayout.NORTH);
}
private void createOutputPanel() {
outputPanel = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
drawString(g);
}
};
outputPanel.setPreferredSize(new Dimension(400, 200));
outputPanel.setBackground(Color.WHITE);
add(outputPanel, BorderLayout.CENTER);
}
/**
* Малює вказаний текст на графічному контексті враховуючи вибрані параметри.
*
* @param g Графічний контекст для малювання.
*/
private void drawString(Graphics g) {
String text = textField.getText();
String fontName = fontComboBox.getSelectedItem().toString();
int fontStyle = Font.PLAIN;
int fontSize = 20;
switch (colorComboBox.getSelectedItem().toString()) {
case "Black":
g.setColor(Color.BLACK);
break;
case "Red":
g.setColor(Color.RED);
break;
case "Green":
g.setColor(Color.GREEN);
break;
case "Blue":
g.setColor(Color.BLUE);
break;
default:
g.setColor(Color.BLACK);
break;
}
Font font = new Font(fontName, fontStyle, fontSize);
g.setFont(font);
g.drawString(text, 50, 100);
}
private void outputString() {
outputPanel.repaint();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new Task21());
}
}
/
Тести:
package org.example;
import org.junit.jupiter.api.Test;
import javax.swing.*;
import java.awt.*;
import static org.junit.jupiter.api.Assertions.*;
class Task21Test {
@Test
public void testConstructor() {
Task21 frame = new Task21();
assertEquals("String Output App", frame.getTitle());
assertEquals(JFrame.EXIT_ON_CLOSE, frame.getDefaultCloseOperation());
assertEquals(BorderLayout.class, frame.getLayout().getClass());
}
}
/
Завдання 28
package org.example;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* Клас Task28 представляє вікно з програмою для переміщення прямокутника та зміни його кольору.
*/
public class Task28 extends JFrame {
JPanel drawPanel;
JComboBox<String> colorComboBox;
JRadioButton leftRadioButton;
JRadioButton upRadioButton;
JRadioButton rightRadioButton;
JRadioButton downRadioButton;
int rectangleX = 150;
int rectangleY = 150;
Color rectangleColor = Color.BLACK;
/**
* Конструктор
*/
public Task28() {
setTitle("Move Rectangle App");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
createOutputPanel();
createControlPanel();
pack();
setLocationRelativeTo(null);
setVisible(true);
}
private void createOutputPanel() {
drawPanel = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
drawRectangle(g);
}
};
drawPanel.setPreferredSize(new Dimension(300, 300));
drawPanel.setBackground(Color.WHITE);
add(drawPanel, BorderLayout.CENTER);
}
/**
* Малює прямокутник на панелі.
*
* @param g Об'єкт Graphics для малювання.
*/
private void drawRectangle(Graphics g) {
g.setColor(rectangleColor);
g.fillRect(rectangleX, rectangleY, 50, 50);
}
private void createControlPanel() {
JPanel controlPanel = new JPanel(new FlowLayout());
JLabel colorLabel = new JLabel("Color:");
String[] colorOptions = {"Black", "Red", "Green", "Blue"};
colorComboBox = new JComboBox<>(colorOptions);
colorComboBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
changeColor();
}
});
leftRadioButton = new JRadioButton("Left");
upRadioButton = new JRadioButton("Up");
rightRadioButton = new JRadioButton("Right");
downRadioButton = new JRadioButton("Down");
ButtonGroup directionGroup = new ButtonGroup();
directionGroup.add(leftRadioButton);
directionGroup.add(upRadioButton);
directionGroup.add(rightRadioButton);
directionGroup.add(downRadioButton);
JButton moveButton = new JButton("Move");
moveButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
moveRectangle();
}
});
controlPanel.add(colorLabel);
controlPanel.add(colorComboBox);
controlPanel.add(leftRadioButton);
controlPanel.add(upRadioButton);
controlPanel.add(rightRadioButton);
controlPanel.add(downRadioButton);
controlPanel.add(moveButton);
add(controlPanel, BorderLayout.SOUTH);
}
/**
* Змінює колір прямокутника відповідно до вибору користувача у комбобоксі.
*/
void changeColor() {
String selectedColor = colorComboBox.getSelectedItem().toString();
switch (selectedColor) {
case "Black":
rectangleColor = Color.BLACK;
break;
case "Red":
rectangleColor = Color.RED;
break;
case "Green":
rectangleColor = Color.GREEN;
break;
case "Blue":
rectangleColor = Color.BLUE;
break;
}
drawPanel.repaint();
}
/**
* Зміщує прямокутник у вибраному напрямку.
*/
void moveRectangle() {
if (leftRadioButton.isSelected()) {
rectangleX -= 10;
} else if (upRadioButton.isSelected()) {
rectangleY -= 10;
} else if (rightRadioButton.isSelected()) {
rectangleX += 10;
} else if (downRadioButton.isSelected()) {
rectangleY += 10;
}
drawPanel.repaint();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new Task28());
}
}
/
Тести:
package org.example;
import org.junit.jupiter.api.Test;
import java.awt.*;
import static org.junit.jupiter.api.Assertions.*;
class Task28Test {
@Test
public void testDrawPanelBackground() {
Task28 app = new Task28();
assertEquals(Color.WHITE, app.drawPanel.getBackground());
}
@Test
public void testDrawRectangleInitialColor() {
Task28 app = new Task28();
assertEquals(Color.BLACK, app.rectangleColor);
}
@Test
public void testDrawRectangleColorChange() {
Task28 app = new Task28();
app.colorComboBox.setSelectedIndex(1); // Select Red
app.changeColor();
assertEquals(Color.RED, app.rectangleColor);
}
@Test
public void testMoveRectangleForAllDirections() {
Task28 app = new Task28();
app.leftRadioButton.setSelected(true);
app.moveRectangle();
assertEquals(140, app.rectangleX);
app.upRadioButton.setSelected(true);
app.moveRectangle();
assertEquals(140, app.rectangleX);
assertEquals(140, app.rectangleY);
app.rightRadioButton.setSelected(true);
app.moveRectangle();
assertEquals(150, app.rectangleX);
assertEquals(140, app.rectangleY);
app.downRadioButton.setSelected(true);
app.moveRectangle();
assertEquals(150, app.rectangleX);
assertEquals(150, app.rectangleY);
}
}
/