フローレイアウトを使用したサイズ変更パネルは、スクロールバーを呼び出しません
-
28-09-2019 - |
質問
私は持っています パネルを含む jpanel フローレイアウトで、 パネルを含む にあります jscrollpane, 、 パネルを含む 他のたくさんの束を持っています jpanels, 、内側のパネル、その中。すべての内側のパネルには同じ寸法があります。より多くのパネルがある場合 パネルを含む その中に保持することができます 幅 その後、それらは下方に挽かれ、より多くのパネルがある場合は パネルを含む その中に保持することができます 身長, 、次に、内側のパネルは、最後の行の中心にある最後の行を除き、同じグリッドに揃えられます。
ダイアログのサイズを変更している間 パネルを含む 拡張とレイアウトフローレイアウトはその義務を実行しますが、パネルのサイズはの境界を超えていますが、スクロールバーは表示されません jscrollpane.
サイズを変更したときにスクロールバーの外観を制御するにはどうすればよいですか パネルを含む 動的に?
画像については、それを要約する必要があります。
ダイアログ幅を拡張した後:
アダム
解決
コンテンディングパネルを実装する必要があります Scrollable
, 、および幅に応じて優先スクロール可能なビューポートサイズを設定します。
import java.awt.*;
import javax.swing.*;
public class Test
{
public static void main(String args[])
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
JPanel container = new ScrollablePanel();
container.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
for( int i = 0; i < 20; ++i )
{
JPanel p = new JPanel();
p.setBorder(BorderFactory.createLineBorder(Color.RED));
p.setPreferredSize(new Dimension(50, 50));
p.add(new JLabel("" + i));
container.add(p);
}
JScrollPane scroll = new JScrollPane(container);
scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
JFrame f = new JFrame("Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(scroll);
f.pack();
f.setSize(250, 300);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
});
}
}
class ScrollablePanel extends JPanel implements Scrollable
{
public Dimension getPreferredSize()
{
return getPreferredScrollableViewportSize();
}
public Dimension getPreferredScrollableViewportSize()
{
if( getParent() == null )
return getSize();
Dimension d = getParent().getSize();
int c = (int)Math.floor((d.width - getInsets().left - getInsets().right) / 50.0);
if( c == 0 )
return d;
int r = 20 / c;
if( r * c < 20 )
++r;
return new Dimension(c * 50, r * 50);
}
public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction)
{
return 50;
}
public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction)
{
return 10;
}
public boolean getScrollableTracksViewportHeight()
{
return false;
}
public boolean getScrollableTracksViewportWidth()
{
return getParent() != null ? getParent().getSize().width > getPreferredSize().width : true;
}
}
すべての数字は簡単にするためにハードコードされていますが、アイデアを得る必要があります。
所属していません StackOverflow