JavaSwing中JPanel⾯板宽度⾼度或图像⾃适应JScrollPane滚动窗格
最近在开发⼀个⼩应⽤程序的过程中,遇到了这个问题。在⽹上了个遍只发现⼀个帖,还是没有解决⽅法的(郁闷啊~~~)。于是靠着⽹上的⼀条线索⾃⼰摸索,得到了下⾯的解决⽅法(有时运⾏会报错)。如果你有更好的⽅法,望不吝指教~
问题描述:
在JScrollPane中添加JPanel。在窗体缩⼩尺⼨改变后,JScrollPane出现滚动条(由于JScrollPane⾃⾝的特性,其内部的组件并没有随JScrollPane缩⼩⽽缩⼩)。javaswing实现购买
P.S…若只想出现⼀条滚动条,可以设置
HorizontalScrollBarPolicy为javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER
或设置
VerticalScrollBarPolicy为javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER。
思路:
默认状态下,改变窗体⼤⼩后各组件会根据不同的布局管理器⾃动完成布局,⽽组件中的⼀个属性对其起到⾄关重要的作⽤——PreferredSize(即:setPreferredSize(null))。只需在窗体改变时,通过设置相关动作事件对指定组件进⾏setPreferredSize操作即可实现⾃适应。
操作(以⾃适应宽度为例):
1. 为JScrollPane添加componentResized事件
private JScrollPane jsp =new JScrollPane();
private JPanel panel =new JPanel();
private float dval;// panel未改变尺⼨时的原始长宽⽐例
jsp.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
jsp.setViewportView(panel);
jsp.addComponentListener(new ComponentAdapter(){
public void componentResized(ComponentEvent evt){
Dimension dim =new Size().width
-VerticalScrollBar().getWidth(),// 尺⼨改变后可能会出现垂直滚动条,需减去其宽度
(int)(Size().width*dval));
panel.setPreferredSize(dim);// 不设置该属性,程序会⾃动计算并设置
panel.updateUI();
}
});
⾄此JPanel⾯板实现⾃适应JScrollPane滚动窗格功能。
但是,如果JPanel中的组件含有图像,可能会出现图像⼤⼩⽆法跟随容器尺⼨变化⽽变化的情况,这时需添加2的操作。
2.为JPanel添加componentResized事件
下⾯操作基于步骤1
private JButton bt =new JButton("按钮",new ImageIcon("./bt.png"));
panel.add(bt);
panel.addComponentListener(new ComponentAdapter(){
public void componentResized(ComponentEvent evt){
// 建议⽤同步线程,防⽌尺⼨改变时出现同步问题和界⾯卡顿
new Thread(new Runnable(){
@Override
public void run(){
resizeButtonIcon();
}
private synchronized void resizeButtonIcon(){
/
/ 根据按钮实际尺⼨重置按钮图标⼤⼩
bt.setIcon(new ImageIcon(new ImageIcon("./bt.png").getImage().getScaledInstance(// 若通过获取按钮图标进⾏重设置,会导致图标显⽰效果不佳(int)(bt.getWidth()*0.85),(int)(bt.getHeight()*0.65), Image.SCALE_DEFAULT)));
});
panel.updateUI();
}
}).start();
}
});
效果图
修改前(放⼤再缩⼩后⽆法正常显⽰右边图像,需拉伸窗体才能完整显⽰,且显⽰效果过⼤):
修改后(各图像按照缩放⽐例重置尺⼨,实现⾃适应):
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论