[英]Zooming panel in and out but scrollbar don't work
我創建了一個具有放大和縮小功能的面板,但是滾動條不起作用,我的意思是當我放大時無法滾動查看整個面板。
這是我的代碼:
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JScrollPane;
import java.awt.Dimension;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
@SuppressWarnings("serial")
public class PanelWithZoom extends JPanel{
private JButton btnZoomIn;
private JButton btnZoomOut;
private double scale = 1;
private JPanel innerPanel;
private JPanel outerPanel;
public PanelWithZoom() {
setLayout(new BorderLayout(0, 0));
JPanel panel = new JPanel();
add(panel, BorderLayout.NORTH);
btnZoomIn = new JButton("zoom in");
btnZoomIn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
scale = scale + 0.1;
outerPanel.repaint();
outerPanel.revalidate();
}
});
panel.add(btnZoomIn);
btnZoomOut = new JButton("zoom out");
btnZoomOut.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
scale = scale - 0.1;
outerPanel.repaint();
outerPanel.revalidate();
}
});
panel.add(btnZoomOut);
JPanel panel_1 = new JPanel();
add(panel_1, BorderLayout.WEST);
JPanel panel_2 = new JPanel();
add(panel_2, BorderLayout.SOUTH);
JPanel panel_3 = new JPanel();
add(panel_3, BorderLayout.EAST);
outerPanel = new JPanel(){
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
int w = (int) getWidth();
int h = (int) getHeight();
// Translate used to make sure scale is centered
g2.translate(w/2, h/2);
g2.scale(scale, scale);
g2.translate(-w/2, -h/2);
}
};
JScrollPane scroll = new JScrollPane(outerPanel);
add(scroll, BorderLayout.CENTER);
innerPanel = new JPanel(){
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.white);
g2.fillRect(0, 0, getWidth(), getHeight());
g2.setColor(Color.black);
g2.drawString("String for test", 10, 50);
g2.drawRect(0, 0, getWidth()-1, getHeight()-1);
setPreferredSize(new Dimension(595, 842));
}
};
outerPanel.add(innerPanel);
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setContentPane(new PanelWithZoom());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setVisible(true);
}
}
您可以對其進行測試以了解我的意思。
重寫組件的getPreferredSize
方法,根據組件的scale
和原始大小返回組件的大小。
因為您想對子組件應用縮放,所以您可能希望覆蓋paint
而不是paintComponent
outerPanel = new JPanel(){
@Override
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g.create();
g2.scale(scale, scale);
super.paint(g);
g2.dispose()
}
}
但是,Swing組件可以獨立於其父容器進行繪制,這意味着在paint
子組件時可能不會調用paint
方法。
這樣做的問題是,它不會縮放鼠標事件(或其他一系列屬性)。
隨着問題的不斷安裝列表,更好的解決方案是使用像JXLayer,這表現在這里
旁注:
Graphics#create
復制Graphics
上下文和Graphics#dispose
的屬性,在處理翻譯/轉換/渲染提示和其他屬性時更安全,因為對副本的任何更改都不會影響原始屬性 outerPanel = new JPanel(){
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g.create();
int w = (int) getWidth();
int h = (int) getHeight();
// Translate used to make sure scale is centered
g2.translate(w/2, h/2);
g2.scale(scale, scale);
g2.translate(-w/2, -h/2);
g2.dispose();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.