#java #swing
Вопрос:
Прямо сейчас эта программа рисует треугольник с помощью JPanel. Я хочу сделать стороны треугольника больше. Как мне это сделать? Я даже не знаю, где искать. Что мне для этого нужно погуглить? Я действительно застрял, пожалуйста, помогите.
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
//import javax.swing.JPanel;
//create KochSnowFlake Panel class
public class KochSnowFlake extends JPanel
{
/**
* site every method of each class
*
*/
private static final long serialVersionUID = 1L;
// Constructor
public KochSnowFlake()
{
// call repaint method
repaint();
}
// paint method from which kochsnowflake method is called
// by passing the depth value
public void paintComponent(Graphics g)
{
super.paintComponents(g);
kochsnowflake(0);
}
// kochsnowflake method
public void kochsnowflake(int depth)
{
System.out.println("Depth = " depth);
// create a graphics reference
Graphics g = this.getGraphics();
g.setColor(Color.black);
// create the Three points by using
// Point class.
Point p1 = new Point(100, 100);
Point p2 = new Point(300, 100);
Point p3 = new Point(200, 263);
// call the kochsegment recursive function
kochsegment(g, p1, p2, depth);
kochsegment(g, p2, p3, depth);
kochsegment(g, p3, p1, depth);
}
// kochsegment recursive method
private void kochsegment(Graphics g, Point p1, Point p2, int
level) {
// the base case -- draw the segments
if (level == 0)
{
// set the color of the line
g.setColor(Color.black);
// draw a line
g.drawLine((int) p1.x, (int) p1.y, (int) p2.x, (int) p2.y);
}
else
{
// the recursive case
// calculate the 4 smaller line segments
double sin60 = Math.sqrt(3) * 0.5;
double cos60 = 0.5;
// set the color of the lines
g.setColor(Color.black);
// set the distance between the points
Point distance = new Point((p2.x - p1.x) / 3, (p2.y - p1.y) / 3);
// Create new points with respect to the distance
Point pa = new Point(p1.x distance.x, p1.y distance.y);
Point pb = new Point(p2.x - distance.x, p2.y - distance.y);
// create the tip of the flakes
Point pTip = new Point(
pa.x (int) (distance.x * cos60 distance.y * sin60),
pa.y (int) (distance.y * cos60 - distance.x * sin60)
);
// call the recursive function until it completes
//the kochsnowflake
kochsegment(g, p1, pa, level - 1);
kochsegment(g, pa, pTip, level - 1);
kochsegment(g, pTip, pb, level - 1);
kochsegment(g, pb, p2, level - 1);
System.out.println(level);
}
}
}
////////////////////////////////////////////
import javax.swing.JFrame;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
//Create a SnowFlake of JFrame class
public class SnowFlake extends JFrame
{
//Constructor
public SnowFlake()
{
//create the object for the KochsnowFlake Panel class
KochSnowFlake kfs=new KochSnowFlake();
add(kfs);
}
//main method
public static void main(String args[])
{
//create frame object
SnowFlake sf=new SnowFlake();
sf.setTitle("KochSnowFlake");
sf.setVisible(true);
sf.setSize(4000,4000);
sf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
Комментарии:
1. Перестаньте повторять свой вопрос 4 раза. Это один из способов НЕ получить помощи. Если вам нужна помощь, задайте четкий и полный вопрос. 1) При выполнении рисования в методе kockSnowFlake() вы должны передать графический объект из метода paintComponent (). Не используйте гетграфику. Как изменить длину сторон треугольника в JPanel? — измените точки треугольника так, чтобы они находились дальше друг от друга.
2. @camickr привет, извини за это. Можете ли вы дополнительно указать, где я меняю точки?
3. Где вы их создаете.
Ответ №1:
Я переработал ваш код, чтобы создать следующий графический интерфейс.
В коде много изменений, но изменение, которое отвечает на ваш вопрос, относится к kochSnowflake
методу KochSnowFlakePanel
класса.
Я сделал треугольник пропорциональным размеру рисунка JPanel
. Размер чертежа JPanel
определяется в конструкторе KochSnowFlakePanel
класса.
Я сделал линии толще, чтобы их было хорошо видно.
Вот полный исполняемый код.
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class KochSnowFlakeGUI implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new KochSnowFlakeGUI());
}
@Override
public void run() {
JFrame frame = new JFrame("Koch SnowFlake");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new KochSnowFlakePanel(), BorderLayout.CENTER);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public class KochSnowFlakePanel extends JPanel {
private static final long serialVersionUID = 1L;
public KochSnowFlakePanel() {
this.setBackground(Color.WHITE);
this.setPreferredSize(new Dimension(400, 400));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
kochSnowflake(g, 0);
}
private void kochSnowflake(Graphics g, int depth) {
int x1 = 100;
int y1 = 100;
int x2 = getWidth() - 100;
int y2 = 100;
int x3 = getWidth() / 2;
int y3 = getHeight() - 100;
Point p1 = new Point(x1, y1);
Point p2 = new Point(x2, y2);
Point p3 = new Point(x3, y3);
kochSegment(g, p1, p2, depth);
kochSegment(g, p2, p3, depth);
kochSegment(g, p3, p1, depth);
}
private void kochSegment(Graphics g, Point p1, Point p2, int level) {
if (level == 0) {
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.BLACK);
g2d.setStroke(new BasicStroke(5f));
g2d.drawLine(p1.x, p1.y, p2.x, p2.y);
} else {
double sin60 = Math.sqrt(3) * 0.5;
double cos60 = 0.5;
Point distance = new Point((p2.x - p1.x) / 3, (p2.y - p1.y) / 3);
Point pa = new Point(p1.x distance.x, p1.y distance.y);
Point pb = new Point(p2.x - distance.x, p2.y - distance.y);
double x = Math.round(distance.x * cos60 distance.y * sin60);
double y = Math.round(distance.y * cos60 - distance.x * sin60);
Point pTip = new Point(pa.x (int) x, pa.y (int) y);
kochSegment(g, p1, pa, level - 1);
kochSegment(g, pa, pTip, level - 1);
kochSegment(g, pTip, pb, level - 1);
kochSegment(g, pb, p2, level - 1);
}
}
}
}