2012-05-29 22 views
9

Ho questo codice in cui sto cercando di montare un pannello scorrevole (JPanel) ma non capisco. Ecco il mio codice:Come rendere scorrevole JFrame in Java?

public class Sniffer_GUI extends JFrame { 
Canvas c = new Canvas(); 
ConnectorPropertiesPanel props; 
public Sniffer_GUI() { 
    super("JConnector demo"); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    getContentPane().setLayout(new GridBagLayout()); 
    init(); 

    getContentPane().add(new JLabel("Connectors example. You can drag the connected component to see how the line will be changed"), 
         new GridBagConstraints(0, 0, 2, 1, 1, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 0, 5), 0, 0)); 
    getContentPane().add(initConnectors(), 
         new GridBagConstraints(0, 1, 1, 1, 1, 1, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0)); 
    getContentPane().add(props, 
         new GridBagConstraints(1, 1, 1, 1, 0, 1, GridBagConstraints.NORTHWEST, GridBagConstraints.VERTICAL, new Insets(5, 0, 5, 5), 0, 0)); 
    setSize(800, 600); 
    setLocationRelativeTo(null); 

} 

Grazie in anticipo.

modifico da aggiungere un codice che sembra in parte a lavorare ...

public Sniffer_GUI() { 
    super("JConnector demo"); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    JPanel container = new JPanel(); 
    JScrollPane scrPane = new JScrollPane(container); 
    add(scrPane); 
    scrPane.setLayout(new ScrollPaneLayout()); 
    init(); 

    add(initConnectors()); 

    setSize(800, 600); 
    setLocationRelativeTo(null); 

} 

ma non è ancora scorrevole, almeno fa la sua funzione all'interno di un JScrollPane, è un buon passo.

+0

Dov'è il tuo codice che cerca di utilizzare JScrollPane? – Puce

+0

@Puce forse non sapeva di JScrollPane. – brimborium

+0

Non so oltre dichiarare variabile JScrollPane ... = ( –

risposta

0

Prova questa:

JScrollPane sp = new JScrollPane(); 
this.add(sp). 
sp.add(*GUI elements for your applications.*) 

Qualcosa del genere dovrebbe funzionare per voi. Date un'occhiata a this così:

+5

L'aggiunta di elementi allo scorrimento non è solitamente ciò che desideri. Di solito, si passa il pannello contenitore al costruttore di JScrollPane o si usa 'setViewportView' –

19

Fare un JPanel scorrevole e usarlo come un contenitore, qualcosa di simile:

JPanel container = new JPanel(); 
JScrollPane scrPane = new JScrollPane(container); 
add(scrPane); // similar to getContentPane().add(scrPane); 
// Now, you can add whatever you want to the container 
+0

Ottengo problemi con il layout di scrPane quando provo ad aggiungere elementi, come posso fare qualcosa di simile al codice originale? –

+2

@JoeLewis Invece di fare ciò che si fa con il riquadro del contenuto, farlo sul contenitore descritto nella risposta di Eng.Fouad e aggiungere semplicemente lo scrollpane al pannello del contenuto (lasciare il layout predefinito, BorderLayout, come gestore del layout del pannello dei contenuti –

+0

@Guillaume Polet ok perfetto Il codice di Eng.Fouad funziona parzialmente come modificato nel post originale, funziona ma non è ancora scorrevole ... –

6

Per estendere @ Eng.Fouad risposta:

public class Sniffer_GUI extends JFrame { 
    Canvas c = new Canvas(); 
    ConnectorPropertiesPanel props; 
    public Sniffer_GUI() { 
     super("JConnector demo"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel container = new JPanel(); 
     JScrollPane scrPane = new JScrollPane(container); 
     getContentPane().add(scrPane); 
     container.setLayout(new GridBagLayout()); 
     init(); 

     container.add(new JLabel("Connectors example. You can drag the connected component to see how the line will be changed"), 
          new GridBagConstraints(0, 0, 2, 1, 1, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(5, 5, 0, 5), 0, 0)); 
     container.add(initConnectors(), 
          new GridBagConstraints(0, 1, 1, 1, 1, 1, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(5, 5, 5, 5), 0, 0)); 
     container .add(props, 
          new GridBagConstraints(1, 1, 1, 1, 0, 1, GridBagConstraints.NORTHWEST, GridBagConstraints.VERTICAL, new Insets(5, 0, 5, 5), 0, 0)); 
     setSize(800, 600); 
     setLocationRelativeTo(null); 

    } 
} 
+0

Il mio eroe ... xD Ora ho solo bisogno di renderlo scorrevole verticalmente, dal momento che è solo orizzontale ...: P –

+0

@JoeLewis È possibile impostare i criteri della barra di scorrimento verticale e orizzontale per regolare queste cose. Prendi in considerazione la lettura del [tutorial ScrollPane] (http://java.sun.com/docs/books/tutorial/uiswing/components/scrollpane.html) e anche il suo [JavaDoc] (http://docs.oracle.com/javase /7/docs/api/javax/swing/JScrollPane.html) –

+0

Il mio problema è che iniConnectors() recupera un JPanel e devo rendere scorrevole quel Pannello, poiché è il più importante, tuttavia non posso farlo anche aggiungendo initConnector a un altro JScrollPane e quindi container.add ("il nuovo JScrollPane", ecc ...); –

1

Per fare una componente di un JFrame scorrevole, avvolgere il componente in un JScrollPane:

JScrollPane myJScrollPane = new JScrollPane(myJLabel, 
     JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, 
     JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 

e sostituire menti ons di myJLabel con myJScrollPane. Ha funzionato per me

+0

Grazie per mostrare JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED e JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED all'interno del costruttore di JScrollPane. Nella mia [risposta] (http://stackoverflow.com/a/32872829/4744263) Sto usando setVerticalScrollBarPolicy e invece il metodo setHorizontalScrollBarPolicy. Grazie per questa possibilità. –

1

Solo intervenendo, e sentitevi liberi di correggermi se sono fuori base, ma usare un JScrollPane come quello ha una conseguenza involontaria di richiedere un ridimensionamento delle finestre più frequente.

Ad esempio, ho avuto un programma in cui ho impostato uno scorrimento di JFrame come quello. Avevo anche un JTextArea in una scheda nel frame che aveva le stesse dimensioni del riquadro del contenuto. Questo textArea era anche nella sua propria scrollmap (questo era più di un avvitamento di un progetto che altro). Quando ho caricato il contenuto da un file per depositare nel textArea, ha attivato le barre di scorrimento attorno all'area di testo.

Il risultato è stato che il mio, chiamiamolo innerScrollPane, era ora più grande di JFrame a causa delle barre di scorrimento, che prima non erano visibili. Ciò ha quindi attivato quello che ora chiamerò outerScrollPane, per visualizzare le sue barre di scorrimento, che quindi coprivano le barre di scorrimento interne.

Questo problema è stato risolto facilmente aggiungendo un ulteriore argomento window.pack() alla fine del mio metodo di apertura dei file, ma volevo solo lanciarlo. Le barre di scorrimento possono potenzialmente coprire il contenuto nella finestra se non stai attento. Ma ... beh ci sono un milione di modi per prevenire questo problema, quindi non è un grosso problema. Solo qualcosa di cui essere a conoscenza.

6

Forse questo aiuterà ...

JFrame frame = new JFrame(); 
JPanel panel = new JPanel(); 

// add something to you panel... 
// panel.add(...); 

// add the panel to a JScrollPane 
JScrollPane jScrollPane = new JScrollPane(panel); 
// only a configuration to the jScrollPane... 
jScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
jScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 

// Then, add the jScrollPane to your frame 
frame.getContentPane().add(jScrollPane); 
Problemi correlati