Yeniden boyutlandırılabilir JScrollPane içeriğimin minimum genişliği vardır. JScrollPane bu genişlikten küçükse, yatay kaydırma çubukları görünmelidir. Bu genişlikten daha büyükse, tüm görünüm alanını doldurmak için görünümün içeriği genişler. JScrollpane değişken boyutlu içerikle yeniden boyutlandırma
basit bir kavram gibi görünüyor ve ben çalışıyor bir şey var, ama bu kesmek gibi hissediyor:import javax.swing.*;
import java.awt.*;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
public class SSBTest {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
final Component view = new MyView();
final JScrollPane jScrollPane = new JScrollPane(view);
jScrollPane.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(final ComponentEvent e) {
final Dimension minimumSize = view.getMinimumSize();
final int width = Math.max(minimumSize.width, jScrollPane.getViewport().getWidth());
view.setPreferredSize(new Dimension(width, minimumSize.height));
}
});
showInDialog(jScrollPane);
}
});
}
private static void showInDialog(final JScrollPane jScrollPane) {
final JDialog dialog = new JOptionPane(jScrollPane).createDialog("JScrollPane Resize Test");
dialog.setResizable(true);
dialog.setModal(true);
dialog.setVisible(true);
System.exit(0);
}
private static final class MyView extends JPanel {
@Override
protected void paintComponent(final Graphics g) {
super.paintComponent(g);
g.setColor(Color.RED);
g.drawString("Dimensions are " + getSize(), 10, 20);
g.drawRect(0, 0, getMinimumSize().width-1, getMinimumSize().height-1);
g.setColor(Color.BLUE);
g.drawRect(0, 0, getPreferredSize().width-1, getPreferredSize().height-1);
}
@Override
public Dimension getMinimumSize() {
return new Dimension(200, 200);
}
@Override
public Dimension getPreferredSize() {
return super.getPreferredSize();
}
}
}
iletişim yeniden boyutlandırma açıkça görüntü alanı görünümünün tercih boyutunu ayarlar ComponentListener tetikler , bileşen doğrulama tetikleniyor. Ancak yeniden boyutlandırma, titreme kaydırma çubuklarına neden olur. Bunu yapmanın daha temiz bir yolu var mı?
DÜZENLEME: ScrollablePanel bağlantıdan camickr için teşekkürler, ben kaydırılabilir uygulamak ve dinamik getScrollableTracksViewportWidth için dönüş değerini değiştirmek için benim JPanel sınıfı modifiye ettik().
Görüntüleme alanı büyük olduğunda, getScrollableTracksViewportWidth()
için true
'u döndüğümde, JScrollPane öğesinin görünümümü bileşenimle doldurması gerektiğini söylüyorum. Görüntü alanı küçük olduğunda, false
'u döndürürüm, böylece kaydırma çubukları görünür.
import javax.swing.*;
import java.awt.*;
public class SSBTest {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
final Component view = new MyView();
final JScrollPane jScrollPane = new JScrollPane(view);
showInDialog(jScrollPane);
}
});
}
private static void showInDialog(final JScrollPane jScrollPane) {
final JDialog dialog = new JOptionPane(jScrollPane).createDialog("JScrollPane Resize Test");
dialog.setResizable(true);
dialog.setModal(true);
dialog.setVisible(true);
System.exit(0);
}
private static final class MyView extends JPanel implements Scrollable {
@Override
protected void paintComponent(final Graphics g) {
super.paintComponent(g);
g.setColor(Color.RED);
g.drawString("MyView: " + getWidth() + "x" + getHeight(), 10, 20);
g.drawRect(0, 0, getMinimumSize().width-1, getMinimumSize().height-1);
g.setColor(Color.BLUE);
g.drawRect(0, 0, getPreferredSize().width-1, getPreferredSize().height-1);
g.drawString("Preferred/Minimum Size", 10, getPreferredSize().height/2);
g.setColor(Color.GREEN);
g.drawLine(0, 0, getWidth(), getHeight());
}
@Override
public Dimension getMinimumSize() {
return new Dimension(200, 200);
}
@Override
public Dimension getPreferredSize() {
return getMinimumSize();
}
public Dimension getPreferredScrollableViewportSize() {
return getPreferredSize();
}
public int getScrollableUnitIncrement(final Rectangle visibleRect, final int orientation, final int direction) {
return 10;
}
public int getScrollableBlockIncrement(final Rectangle visibleRect, final int orientation, final int direction) {
return visibleRect.width;
}
public boolean getScrollableTracksViewportWidth() {
final Container viewport = getParent();
return viewport.getWidth() > getMinimumSize().width;
}
public boolean getScrollableTracksViewportHeight() {
return true;
}
}
}
Mükemmel! ScrollablePanel sınıfını kullanmıyorum, ancak bu sayfadaki öneri Kaydırılabilir # getScrollableTracksViewportWidth için döndürme değerini dinamik olarak değiştirmek için mükemmel bir şekilde çalışıyor. –