ventana tamaño resolucion modificar evento definir como cambiar boton asignar java swing jscrollpane jsplitpane

java - resolucion - Cambiar el tamaño del problema con lienzo dentro de jscrollpane dentro de jsplitpane



modificar el tamaño de un panel en java (3)

Estoy creando una aplicación usando el editor de GUI de NetBeans, en el que quiero tener un JSplitPane , el componente superior será un Canvas dentro de un JScrollPane y el componente inferior será un JTextArea , o algo así.

Cuando tiro del divisor hacia abajo y, por lo tanto, aumenta el tamaño del componente superior, todo parece cambiar de tamaño muy bien.

El problema aparece cuando intento empujar el divisor hacia arriba: el divisor parece ir por debajo del Canvas (y tal vez por debajo del JScrollPane también).

He intentado varias combinaciones de los tamaños preferido / mínimo / máximo de JScrollPane y Canvas pero parece que nada funciona.

Esta es la parte del código que generó Netbeans que puede tener algo que ver con el problema en cuestión:

jSplitPane1 = new javax.swing.JSplitPane(); jScrollPane1 = new javax.swing.JScrollPane(); canvas1 = new java.awt.Canvas(); jTextField1 = new javax.swing.JTextField(); jSplitPane1.setDividerLocation(300); jSplitPane1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); jScrollPane1.setViewportView(canvas1); jSplitPane1.setTopComponent(jScrollPane1); jTextField1.setText("jTextField1"); jSplitPane1.setRightComponent(jTextField1);

Como esta es mi primera pregunta, no tengo permiso para insertar una imagen en la pregunta, así que solo publicaré el enlace:

Las flechas rojas indican la posición del divisor.

Gracias de antemano por tu tiempo.


Como dije en mis comentarios, no debe mezclar los componentes AWT y Swing. Creo que no estás usando los componentes de la manera correcta. Eche un vistazo, es un ejemplo simple de cómo usar un JSplitPane.

import java.awt.*; // it is necessary to use the Dimension and BorderLayout classes import javax.swing.*; public class Foo extends JFrame { public Foo() { setTitle( "Splits" ); setDefaultCloseOperation( EXIT_ON_CLOSE ); setSize( 400, 400 ); JSplitPane split = new JSplitPane( JSplitPane.VERTICAL_SPLIT ); split.setDividerLocation( 200 ); add( split ); JPanel panel1 = new JPanel(); panel1.setLayout( new BorderLayout() ); panel1.add( new JLabel( "top panel" ), BorderLayout.NORTH ); JPanel myDrawPanel = new JPanel(); myDrawPanel.setPreferredSize( new Dimension( 100, 100 ) ); myDrawPanel.add( new JLabel( "draw panel here!" ) ); panel1.add( new JScrollPane( myDrawPanel ), BorderLayout.CENTER ); split.setTopComponent( panel1 ); JPanel panel2 = new JPanel(); panel2.add( new JLabel( "bottom panel" ) ); split.setBottomComponent( panel2 ); setVisible( true ); } public static void main( String[] args ) { new Foo(); } }


Después de leer el comentario de davidbuzatto busqué en Google sobre la mezcla de componentes AWT y Swing y me sorprendió un poco descubrir que es una mala práctica.

Encontré la respuesta más precisa a mi pregunta aquí

Los componentes pesados ​​tienen su propio orden Z. Esta es la razón por la cual Swing y AWT no se pueden combinar en un solo contenedor. Si lo son, los componentes AWT se dibujarán en los componentes TOP of Swing.

Por ejemplo: cuando los componentes AWT se usan con JtabbedPane, no desaparecen cuando se cambian las pestañas.

Gracias davidbuzatto por mostrarme el camino :-)


En lugar de setPreferredSize() , deje que sus componentes calculen su propio tamaño preferido y pack() la Window adjunta para acomodar. El siguiente ejemplo agrega una instancia de draw.GraphPanel a la parte superior y un panel de control correspondiente a la parte inferior.

import draw.GraphPanel; import java.awt.EventQueue; import java.awt.GridLayout; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; /** * @see https://.com/q/11942961/230513 */ public class SplitGraph extends JPanel { public SplitGraph() { super(new GridLayout()); JSplitPane split = new JSplitPane(JSplitPane.VERTICAL_SPLIT); GraphPanel graphPanel = new GraphPanel(); split.setTopComponent(new JScrollPane(graphPanel)); split.setBottomComponent(graphPanel.getControlPanel()); this.add(split); } private void display() { JFrame f = new JFrame("SplitGraph"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(this); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new SplitGraph().display(); } }); } }