¿Cómo agregar JTable en JPanel con diseño nulo?

235

Quiero agregar JTablea JPanelquién es el diseño null. JPanelContiene otros componentes. Tengo que agregar JTableen la posición correcta.

Sagar
fuente
17
solo para enfatizar la respuesta de jzd: olvídate del diseño nulo. Eso definitivamente no es nada fácil , ya sea aprender usando LayoutManagers o usar un idioma diferente.
kleopatra

Respuestas:

178

Ejemplo de diseño anidado / combinado

El Tutorial de Java tiene información completa sobre el uso de administradores de diseño. Consulte la lección Diseño de componentes dentro de un contenedor para obtener más detalles.

Un aspecto de los diseños que no está bien cubierto en el tutorial es el de los diseños anidados, colocando un diseño dentro de otro para obtener efectos complejos.

El siguiente código pone una variedad de componentes en un marco para demostrar cómo usar diseños anidados. Todos los diseños que se establecen explícitamente se muestran como un borde con título para el panel en el que se usan.

Los aspectos notables del código son:

  • Hay un cuadro combinado para cambiar PLAF (Plug and Look and Feel) en tiempo de ejecución.
  • La GUI es ampliable a la necesidad del usuario.
  • La imagen en la parte inferior del panel dividido se centra en el panel de desplazamiento.
  • Las instancias de etiquetas a la izquierda se agregan dinámicamente usando el botón.

Nimbus PLAF

NestedLayoutExample.java

import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.border.TitledBorder;

/** A short example of a nested layout that can change PLAF at runtime.
The TitledBorder of each JPanel shows the layouts explicitly set.
@author Andrew Thompson
@version 2011-04-12 */
class NestedLayoutExample {

    public static void main(String[] args) {

        Runnable r = new Runnable() {

            public void run() {
                final JFrame frame = new JFrame("Nested Layout Example");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                final JPanel gui = new JPanel(new BorderLayout(5,5));
                gui.setBorder( new TitledBorder("BorderLayout(5,5)") );

                //JToolBar tb = new JToolBar();
                JPanel plafComponents = new JPanel(
                    new FlowLayout(FlowLayout.RIGHT, 3,3));
                plafComponents.setBorder(
                    new TitledBorder("FlowLayout(FlowLayout.RIGHT, 3,3)") );

                final UIManager.LookAndFeelInfo[] plafInfos =
                    UIManager.getInstalledLookAndFeels();
                String[] plafNames = new String[plafInfos.length];
                for (int ii=0; ii<plafInfos.length; ii++) {
                    plafNames[ii] = plafInfos[ii].getName();
                }
                final JComboBox plafChooser = new JComboBox(plafNames);
                plafComponents.add(plafChooser);

                final JCheckBox pack = new JCheckBox("Pack on PLAF change", true);
                plafComponents.add(pack);

                plafChooser.addActionListener( new ActionListener(){
                    public void actionPerformed(ActionEvent ae) {
                        int index = plafChooser.getSelectedIndex();
                        try {
                            UIManager.setLookAndFeel(
                                plafInfos[index].getClassName() );
                            SwingUtilities.updateComponentTreeUI(frame);
                            if (pack.isSelected()) {
                                frame.pack();
                                frame.setMinimumSize(frame.getSize());
                            }
                        } catch(Exception e) {
                            e.printStackTrace();
                        }
                    }
                } );

                gui.add(plafComponents, BorderLayout.NORTH);

                JPanel dynamicLabels = new JPanel(new BorderLayout(4,4));
                dynamicLabels.setBorder(
                    new TitledBorder("BorderLayout(4,4)") );
                gui.add(dynamicLabels, BorderLayout.WEST);

                final JPanel labels = new JPanel(new GridLayout(0,2,3,3));
                labels.setBorder(
                    new TitledBorder("GridLayout(0,2,3,3)") );

                JButton addNew = new JButton("Add Another Label");
                dynamicLabels.add( addNew, BorderLayout.NORTH );
                addNew.addActionListener( new ActionListener(){

                    private int labelCount = 0;

                    public void actionPerformed(ActionEvent ae) {
                        labels.add( new JLabel("Label " + ++labelCount) );
                        frame.validate();
                    }
                } );

                dynamicLabels.add( new JScrollPane(labels), BorderLayout.CENTER );

                String[] header = {"Name", "Value"};
                String[] a = new String[0];
                String[] names = System.getProperties().
                    stringPropertyNames().toArray(a);
                String[][] data = new String[names.length][2];
                for (int ii=0; ii<names.length; ii++) {
                    data[ii][0] = names[ii];
                    data[ii][1] = System.getProperty(names[ii]);
                }
                DefaultTableModel model = new DefaultTableModel(data, header);
                JTable table = new JTable(model);
                try {
                    // 1.6+
                    table.setAutoCreateRowSorter(true);
                } catch(Exception continuewithNoSort) {
                }
                JScrollPane tableScroll = new JScrollPane(table);
                Dimension tablePreferred = tableScroll.getPreferredSize();
                tableScroll.setPreferredSize(
                    new Dimension(tablePreferred.width, tablePreferred.height/3) );

                JPanel imagePanel = new JPanel(new GridBagLayout());
                imagePanel.setBorder(
                    new TitledBorder("GridBagLayout()") );

                BufferedImage bi = new BufferedImage(
                    200,200,BufferedImage.TYPE_INT_ARGB);
                Graphics2D g = bi.createGraphics();
                GradientPaint gp = new GradientPaint(
                    20f,20f,Color.red, 180f,180f,Color.yellow);
                g.setPaint(gp);
                g.fillRect(0,0,200,200);
                ImageIcon ii = new ImageIcon(bi);
                JLabel imageLabel = new JLabel(ii);
                imagePanel.add( imageLabel, null );

                JSplitPane splitPane = new JSplitPane(
                    JSplitPane.VERTICAL_SPLIT,
                    tableScroll,
                    new JScrollPane(imagePanel));
                gui.add( splitPane, BorderLayout.CENTER );

                frame.setContentPane(gui);

                frame.pack();

                frame.setLocationRelativeTo(null);
                try {
                    // 1.6+
                    frame.setLocationByPlatform(true);
                    frame.setMinimumSize(frame.getSize());
                } catch(Throwable ignoreAndContinue) {
                }

                frame.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

Otras capturas de pantalla

Windows PLAF

Mac OS X Aqua PLAF

Ubuntu GTK + PLAF

Andrew Thompson
fuente
20

Como puedo recordar, el diseño nulo significa una posición absoluta, por lo que será muy difícil contar el punto X para la ubicación de la esquina superior izquierda de JTable. Pero si solo desea tener todos los componentes del panel uno por uno, puede usar el administrador FlowLayout () como

JPanel panel=new JPanel(new FlowLayout());
panel.add(new aComponent());
panel.add(new bComponent());
panel.add(new JTable());

o si necesita llenar el panel, debe usar GridLayout () como ...

int x=2,y=2;
JPanel panel=new JPanel(new GridLayout(y,x));
panel.add(new aComponent());
panel.add(new bComponent());
panel.add(new JTable());

Buena suerte

usuario592704
fuente
16

Si está utilizando un administrador de diseño nulo, siempre debe establecer los límites de un componente. Ese es el problema en tu caso.

Debe hacer lo que todos sugieren aquí e ir y usar un administrador de diseño que crea que ahorran tiempo. Ve y mira el tutorial en la publicación de @ jzd.

Disfruta, Boro.

Boro
fuente
12

JTabledebe agregarse a lo JScrollPaneque realmente debe agregarse a JPanel.

El JPaneldebería tener algún administrador de diseño.

Si no le importa la precisión del tamaño de los componentes, puede usar puro BorderLayouty combinarlo con FlowLayouty GridLayout. si necesita precisión, use jgoodies FormLayout.

El FormLayoutes realmente complicado, pero puedes jugar un poco conWindowBuilder (que se incrusta en Eclipse) y un vistazo al código que genera. Puede parecer complicado, pero es solo una ignorancia.

Buena suerte.

sergpank
fuente
6

Primero, debe considerar seriamente otros administradores de diseño, por ejemplo, BorderLayoutManager (nuevo JPanel (nuevo BorderLayout ())) es un buen comienzo.

También al diseñar su diálogo, recuerde que puede y debe anidar sus diseños : un JPanel dentro de otro JPanel (por ejemplo, un GridLayout dentro de un BorderLayout). Tenga en cuenta: un cuadro de diálogo "bueno" debe cambiar de tamaño correctamente , de modo que si el usuario cambia el tamaño de su Marco, desea ampliar automáticamente sus objetos de información, como su tabla, y no mostrar grandes áreas de fondo JPanel. Eso es algo que no puedes lograr con un NullLayout.

Pero probablemente haya casos, en algún lugar de este gran mundo, donde un NullLayout es justo lo que necesitas. Así que aquí hay un ejemplo:

import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class JTableInNullLayout
{
  public static void main(String[] argv) throws Exception {

      DefaultTableModel model = new DefaultTableModel(
          new String[][] { { "a", "123"} , {"b", "456"} }, 
          new String[] { "name", "value" } );

      JTable t = new JTable(model);

      JPanel panel = new JPanel(null);

      JScrollPane scroll = new JScrollPane(t);
      scroll.setBounds( 0, 20, 150, 100 ); // x, y, width, height
      panel.add(scroll);

      JFrame frame = new JFrame();
      frame.add(panel);
      frame.setPreferredSize( new Dimension(200,200));
      frame.pack();
      frame.setVisible(true);
  }
}
Axel Podehl
fuente
1

Cuando un componente tiene un diseño "nulo", debe administrar el diseño usted mismo, lo que significa que debe calcular las dimensiones y ubicaciones de los elementos secundarios del componente para decidir dónde se dibujan. Bastante tedioso a menos que sea absolutamente necesario.

Si realmente desea ese control de grano fino, tal vez pruebe primero con GridBagLayout antes de enloquecer con la disposición de la interfaz de usuario.

Kevin Wang
fuente
0

Puede hacer uso del siguiente código. Para agregar JTable a JPanel.

JPanel panel = new JPanel();
this.setContentPane(panel);
panel.setLayout(null);
String data[][] = {{"1.", "ABC"}, {"2.", "DEF"}, {"3.", "GHI" }};
String col[] = {"Sr. No", "Name"};
JTable table = new JTable(data,col);
table.setBounds(100, 100, 100, 80);
panel.add(table);
setVisible(true);
setSize(300,300);
Sankar
fuente
0
JPanel panel = new JPanel();
JTable table = new JTable(rowData, colData);
JScrollPane scrollPane = new JScrollPane(table);
panel.add(scrollPane, BorderLayout.CENTER);
panel.setSize(800, 150);
panel.add(table);
panel.setLocationRelativeTo(null);
panel.setVisible(true);

Espero que esto ayude.

León
fuente
no ... tres errores en tres líneas consecutivas y no resolver el requisito (malo como está)
kleopatra
use el marco en lugar del panel e intente.
Leo
ni siquiera intentaste encontrar tus errores, ¿verdad? A veces (como ahora) realmente me gustaría tener tantos votos negativos como errores en el código / respuesta ..
kleopatra
cuales tres lineas? Rowdata y coldata que tiene que agregar.
Leo
4, 5, 6 (y el último)
kleopatra
0
JFrame frame = new JFrame("Sample Frame");
frame.setSize(600, 600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel panel = new JPanel();
        DefaultTableModel dfm = new DefaultTableModel(data, columnNames);
        JTable table = new JTable(dfm);
        JScrollPane scrollPane = new JScrollPane(table);
    panel.add(scrollPane);
frame.add(panel);
frame.setVisible(true);

modelo de mesa depende de su requerimiento

krpa
fuente
0
this.setTitle("Sample");
        JPanel p = new JPanel(new BorderLayout());
        WindowEvent we = new WindowEvent(this, WindowEvent.WINDOW_CLOSED);
        this.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                System.exit(0);
            }
        }); 
        // Create columns names
        String columnNames[] = { "FirstCol", "SecondCol",
                "ThirdCol", "FourthCol" };
        dataModel = new DefaultTableModel();
        for (int col = 0; col < columnNames.length; col++) {
            dataModel.addColumn(columnNames[col]);
        }
        // Create a new table instance
        table = new JTable(dataModel);
        table.setPreferredScrollableViewportSize(new Dimension(200, 120));
        table.setFillsViewportHeight(true);
        table.setShowGrid(true);
        table.setAutoscrolls(true);

        // Add the table to a scrolling pane
        scrollPane = new JScrollPane(table,
                JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        scrollPane.setPreferredSize(new Dimension(700, 700));
        JPanel jpResultPanel = new JPanel();
        jpResultPanel.setBorder(BorderFactory.createTitledBorder(
                BorderFactory.createEtchedBorder(), "Result",
                TitledBorder.CENTER, TitledBorder.TOP));
        jpResultPanel.add(scrollPane);
        add(jpResultPanel);
        pack();
        setSize(720, 720);
        setVisible(true);

Prueba esto.

SB
fuente