Java 如何为GUI实现放大功能?
我有一个简单的图形用户界面,显示4个形状,当你点击形状内部时,它会改变颜色。我现在需要实现一个放大功能,当用户点击拖动鼠标时,它将放大新窗口中拖动的区域(它将是一个矩形)。这是我的GUI类:Java 如何为GUI实现放大功能?,java,user-interface,graphics,zooming,Java,User Interface,Graphics,Zooming,我有一个简单的图形用户界面,显示4个形状,当你点击形状内部时,它会改变颜色。我现在需要实现一个放大功能,当用户点击拖动鼠标时,它将放大新窗口中拖动的区域(它将是一个矩形)。这是我的GUI类: import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.MouseInfo; import java.awt.Point;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;
import javax.swing.*;
@SuppressWarnings("serial")
public class taskTwo2 extends JPanel {
private static final int PREF_W = 200;
private static final int PREF_H = PREF_W;
private Color circleColor = Color.RED; //starting colour
private Color circleColor2 = Color.BLUE;
private Color squareColor = Color.GREEN;
private Color squareColor2 = Color.YELLOW;
private int circX = 10;
private int circY = circX;
private int circW = PREF_W - 2 * circX;
private int circH = PREF_H - 2 * circY;
public taskTwo2() {
addMouseListener(new MyMouse()); //mouse click listener
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// to smooth out graphics
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); //smoothes out edges
g2.setColor(circleColor);
g2.fillOval(circX, circY, circW, circH);
g2.setColor(Color.BLACK);
g2.drawOval(circX, circY, circW, circH);
g2.setColor(circleColor2);
g2.fillOval(25*(circX), 25*(circY), circW, circH);
g2.setColor(Color.BLACK);
g2.drawOval(25*(circX), 25*(circY), circW, circH);
g2.setColor(squareColor);
g2.fillRect(circX, 25*(circY), circW, circH);
g2.setColor(Color.BLACK);
g2.drawRect(circX, 25*(circY), circW, circH);
g2.setColor(squareColor2);
g2.fillRect(25*(circX), circY, circW, circH);
g2.setColor(Color.BLACK);
g2.drawRect(25*(circX), circY, circW, circH);
}
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(PREF_W, PREF_H);
}
public static boolean isInCircle(Point mouseLocation, double cX, double cY, double cR){
final double dX = mouseLocation.getX()-cX;
final double dY = mouseLocation.getY()-cY;
return Math.sqrt(dX*dX+dY*dY)<=cR; //Euclidean distance
}
private class MyMouse extends MouseAdapter {
Random rand = new Random();
@Override
public void mousePressed(MouseEvent e) {
Point mouseLocation = e.getPoint(); //return mouse click position
if(isInCircle(mouseLocation,circX+circW/2,circY+circH/2,circW/2)){
float red = rand.nextFloat(); //generates a random value for the red tint value
float green = rand.nextFloat();
float blue = rand.nextFloat();
circleColor = new Color(red, green, blue); //new colour for first circle
}
if(isInCircle(mouseLocation,25*(circX)+circW/2,25*(circY)+circH/2,circW/2)){
float red = rand.nextFloat();
float green = rand.nextFloat();
float blue = rand.nextFloat();
circleColor2 = new Color(red, green, blue);
}
if(isInCircle(mouseLocation,circX+circW/2,25*(circY)+circH/2,circW/2)){
float red = rand.nextFloat();
float green = rand.nextFloat();
float blue = rand.nextFloat();
squareColor = new Color(red, green, blue);
}
if(isInCircle(mouseLocation,25*(circX)+circW/2,circY+circH/2,circW/2)){
float red = rand.nextFloat();
float green = rand.nextFloat();
float blue = rand.nextFloat();
squareColor2 = new Color(red, green, blue);
}
repaint(); //repaint components
}
}
private static void createAndShowGui() { //code for GUI visuals
JFrame frame = new JFrame("MyTaskToo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new taskTwo2());
frame.setSize(500, 500);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.MouseInfo;
导入java.awt.Point;
导入java.awt.RenderingHints;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.util.Random;
导入javax.swing.*;
@抑制警告(“串行”)
公共类taskTwo2扩展了JPanel{
专用静态最终整型预调W=200;
私有静态final int PREF_H=PREF_W;
专用颜色circleColor=Color.RED;//起始颜色
专用颜色circleColor2=Color.BLUE;
私有颜色squareColor=Color.GREEN;
专用颜色squareColor2=Color.YELLOW;
私有int circX=10;
private int circY=circX;
private int circW=PREF_W-2*circX;
private int circH=PREF_H-2*circY;
公共任务2(){
addMouseListener(新建MyMouse());//鼠标单击侦听器
}
受保护组件(图形g){
超级组件(g);
//使图形平滑
图形2d g2=(图形2d)g;
g2.setRenderingHint(RenderingHits.KEY_ANTIALIASING,RenderingHits.VALUE_ANTIALIAS_ON);//平滑边缘
g2.setColor(圆环色);
g2.圆形(圆形,圆形,圆形,圆形);
g2.设置颜色(颜色为黑色);
g2.画椭圆(圆形,圆形,圆形,圆形);
g2.setColor(圆环色2);
g2.圆形(25*(圆形),25*(圆形),圆形,圆形);
g2.设置颜色(颜色为黑色);
g2.图椭圆形(25*(圆形),25*(圆形),圆形,圆形);
g2.setColor(squareColor);
g2.fillRect(约x,25*(约y),约w,约h);
g2.设置颜色(颜色为黑色);
g2.drawRect(约x,25*(约y),约w,约h);
g2.setColor(squareColor2);
g2.fillRect(25*(circX),circY,circW,circH);
g2.设置颜色(颜色为黑色);
g2.drawRect(25*(circX),circY,circW,circH);
}
公共维度getPreferredSize(){
如果(isPreferredSizeSet()){
返回super.getPreferredSize();
}
返回新维度(PREF_W,PREF_H);
}
公共静态布尔isInCircle(点鼠标定位、双cX、双cY、双cR){
final double dX=mouseLocation.getX()-cX;
final double dY=mouseLocation.getY()-cY;
返回Math.sqrt(dX*dX+dY*dY)根据您想要实现的功能,您可以使用多种方法来实现这一点。您可以简单地相应地缩放图形
上下文,您可以对所有坐标应用比例因子,或者您可以使用J/JXLayer
来实现这一点,您可以使用多种方法,具体取决于功能您想要实现。您可以简单地相应地缩放图形
上下文,您可以对所有坐标应用缩放因子,或者您可以使用J/JXLayer
来,