Ho JScrollPane che contiene alcune immagini in una riga orizzontale. Se la fila di immagini è troppo lunga per la porta di visualizzazione, JScrollPane mostra una barra di scorrimento, riducendo l'altezza della porta di visualizzazione. Mi piacerebbe ridimensionare le immagini per adattarle alla vista. Come posso rilevare che la porta di visualizzazione ha cambiato le sue dimensioni? Sfortunatamente, la registrazione dei gestori di eventi di modifica non sembra funzionare.Come posso rilevare se la barra di scorrimento di JScrollPane cambia visibilità?
8
A
risposta
12
L'utilizzo del listener di modifiche su ViewPort sembra funzionare correttamente. Ecco una piccola demo di che:
import java.awt.BorderLayout;
import java.io.UnsupportedEncodingException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingWorker;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class Main {
public static void main(String[] args) throws UnsupportedEncodingException {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel(new BorderLayout());
final JPanel buttons = new JPanel();
final JScrollPane pane = new JScrollPane(buttons);
pane.getViewport().addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
System.err.println("Change in " + e.getSource());
System.err.println("Vertical visible? " + pane.getVerticalScrollBar().isVisible());
System.err.println("Horizontal visible? " + pane.getHorizontalScrollBar().isVisible());
}
});
panel.add(pane);
frame.setContentPane(panel);
frame.setSize(300, 200);
frame.setVisible(true);
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
for (int i = 0; i < 10; i++) {
Thread.sleep(800);
buttons.add(new JButton("Hello " + i));
buttons.revalidate();
}
return null;
}
};
worker.execute();
}
}
1
ho usato il HierarchyBoundsListener
per rilevare cambiamenti nelle dimensioni del JScrollPane:
onAncestorResized(scroll, evt -> resizeYourImages());
Ecco un metodo comodo per attaccare l'ascoltatore:
static void onAncestorResized(JComponent component, Consumer<HierarchyEvent> callback) {
component.addHierarchyBoundsListener(new HierarchyBoundsAdapter() {
@Override
public void ancestorResized(HierarchyEvent e) {
callback.accept(e);
}
});
}
Ok strano Grazie per la risposta rapida. L'ho provato e funziona, davvero. Purtroppo, all'interno della mia applicazione, l'aggiunta di un listener di modifiche non funziona. Lavorerò da qui. – xmjx
Per qualche strano motivo, gli output su stdout e stderr non sono stati visualizzati nel listener. Quindi fondamentalmente era un problema di debug. Grazie ancora. – xmjx