Java JPanel缩放
嘿,伙计们,我已经成功地用java制作了一个GUI,可以使用滑块缩放多边形和圆。一切都正常,但我想知道是否有办法改变原点(从哪里开始缩放)。现在它从角落里变大,我希望它从中间变大,这样我可以在中间开始,它均匀地向外扩展。另外,如果有人能告诉我一个简单的方法,用某种图像替换我的矩形,这样你就可以上下缩放图片了!非常感谢。这是我的密码:Java JPanel缩放,java,swing,user-interface,slider,jpanel,Java,Swing,User Interface,Slider,Jpanel,嘿,伙计们,我已经成功地用java制作了一个GUI,可以使用滑块缩放多边形和圆。一切都正常,但我想知道是否有办法改变原点(从哪里开始缩放)。现在它从角落里变大,我希望它从中间变大,这样我可以在中间开始,它均匀地向外扩展。另外,如果有人能告诉我一个简单的方法,用某种图像替换我的矩形,这样你就可以上下缩放图片了!非常感谢。这是我的密码: import javax.swing.*; public class Fred { public static void main(String[] a
import javax.swing.*;
public class Fred
{
public static void main(String[] args)
{
TheWindow w = new TheWindow();
w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //X wont close the window with out this line
w.setSize(375,375);
w.setVisible(true);
}
}
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
public class TheWindow extends JFrame
{
private JSlider slider; //declare slider
private drawRect myPanel; //declare/ create panel
public TheWindow()
{
super("Slider Example"); //make title
myPanel = new drawRect();
myPanel.setBackground(Color.green); //change background color
slider = new JSlider(SwingConstants.VERTICAL, 0, 315, 10);// restrains the slider from scaling square to 0-300 pixels
slider.setMajorTickSpacing(20); //will set tick marks every 10 pixels
slider.setPaintTicks(true); //this actually paints the ticks on the screen
slider.addChangeListener
(
new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
myPanel.setD(slider.getValue()); //Wherever you set the slider, it will pass that value and that will paint on the screen
}
}
);
add(slider, BorderLayout.WEST); //similar to init method, adds slider and panel to GUI
add(myPanel, BorderLayout.CENTER);
}
}
import java.awt.*;
import javax.swing.*;
public class drawRect extends JPanel
{
private int d = 25; //this determines the beginning length of the rect.
public void paintComponent(Graphics g)//paints circle on the screen
{
super.paintComponent(g); //prepares graphic object for drawing
g.fillRect(15,15, d, d); //paints rectangle on screen
//x , y, width, height
}
public void setD(int newD)
{
d = (newD >= 0 ? newD : 10); //if number is less than zero it will use 10 for diameter(compressed if statement)
repaint();
}
public Dimension getPrefferedSize()
{
return new Dimension(200, 200);
}
public Dimension getMinimumSize()
{
return getPrefferedSize();
}
}
改变“原点”使其成为“缩放”的中心,基本上只是从中心点减去d
一半的过程
因此,假设中心点是28
((25/2)+15
),您只需从该点减去d/2
(25/2),28-(25/2)=15
,或者足够接近
我修改了测试的paintComponent
方法,因此矩形始终位于面板的中心,但您可以提供任意值来代替originX
和originY
@Override
public void paintComponent(Graphics g)//paints circle on the screen
{
super.paintComponent(g); //prepares graphic object for drawing
int originX = getWidth() / 2;
int originY = getHeight() / 2;
int x = originX - (d / 2);
int y = originY - (d / 2);
System.out.println(x + "x" + y);
g.fillRect(x, y, d, d); //paints rectangle on screen
//x , y, width, height
}
至于缩放图像,您应该注意,这会将图像缩放到绝对大小,不会保持图像比例
更好的解决方案可能是使用介于0和1之间的双倍值,并将各个元素乘以该值,以获得所需的绝对值。“原点”与你想表达的意思相关,我不确定你的意思。但我的意思是,现在,矩形从左上角的“锚定点”开始上下缩放。这可能很难想象,但我正在尝试将这个“锚定点”放在矩形或对象的中心,可以使用仿射变换。太好了!正是我要找的!谢谢你,伙计!如果问题不太多,拖动滑块时旋转对象并缩放对象的最简单方法是什么?最简单的方法是使用
AffineTransform
For and Hey man,当我尝试添加一个图像而不是一个矩形或圆形对象时,它不会缩放或调整大小,它只在屏幕上沿对角线平移。关于如何扩大规模有什么想法吗?我在最近的一个问题中问了这个问题,但是你帮了我很大的忙,也许可以帮助我哈哈!)