241 votes

Comment ajouter un JTable dans un JPanel avec une mise en page nulle ?

Je veux ajouter JTable en JPanel dont la disposition est null . JPanel contient d'autres composants. Je dois ajouter JTable à la bonne position.

19 votes

Juste pour souligner la réponse de jzd : oubliez la disposition nulle. C'est définitivement un-swing'ish - soit apprendre à utiliser les LayoutManagers, soit utiliser un autre langage.

181voto

Andrew Thompson Points 108505

Exemple de mise en page imbriquée/combinée

Le tutoriel Java contient des informations complètes sur l'utilisation des gestionnaires de mise en page. Voir le Disposition des composants dans un conteneur leçon pour plus de détails.

Un aspect des mises en page qui est no Le didacticiel couvre bien la question des mises en page imbriquées, en plaçant une mise en page dans une autre pour obtenir des effets complexes.

Le code suivant place une variété de composants dans un cadre pour démontrer comment utiliser les mises en page imbriquées. Toutes les mises en page qui sont explicitement définies sont affichées comme une bordure titrée pour le panneau sur lequel elles sont utilisées.

Les aspects notables du code sont :

  • Il existe une liste déroulante permettant de modifier le PLAF (Pluggable Look and Feel) au moment de l'exécution.
  • L'interface graphique est extensible en fonction des besoins de l'utilisateur.
  • L'image située au bas du volet partagé est centrée dans le volet de défilement.
  • Les instances d'étiquettes à gauche sont ajoutées dynamiquement à l'aide du bouton.

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);
    }
}

Autres captures d'écran

Windows PLAF

Mac OS X Aqua PLAF

Ubuntu GTK+ PLAF

49voto

jzd Points 17369

N'utilisez pas une mise en page nulle. Apprenez à utiliser les LayoutManagers :

http://download.oracle.com/javase/tutorial/uiswing/layout/using.html

Les LayoutManagers vous permettent de gérer correctement des choses comme le redimensionnement de la fenêtre ou le nombre dynamique de composants. Ils peuvent sembler intimidants au début, mais ils valent la peine d'être appris.

20voto

user592704 Points 1970

Si je me souviens bien, le null La mise en page signifie une position absolue, il vous sera donc assez difficile de compter le point X pour l'emplacement du coin supérieur gauche de votre table JT. Mais si vous voulez simplement avoir tous les composants du panneau un par un, vous pouvez utiliser le gestionnaire FlowLayout() comme suit

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

ou si vous avez besoin de remplir le panneau, vous devez utiliser GridLayout() comme...

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());

Bonne chance

16voto

Boro Points 6305

Si vous utilisez un gestionnaire de mise en page nul, vous devez toujours définir les limites d'un composant. C'est le problème dans votre cas.

Vous devriez faire ce que tout le monde suggère ici et utiliser un gestionnaire de mise en page qui vous fera gagner du temps. Allez voir le tutoriel dans le post de @jzd.

Amuse-toi bien, Boro.

12voto

sergpank Points 318

JTable doit être ajouté dans le JScrollPane qui devrait en fait être ajouté dans le JPanel .

El JPanel devrait avoir un gestionnaire de mise en page.

Si vous ne vous souciez pas de la précision de la taille des composants, vous pouvez utiliser de la pure BorderLayout et le combiner avec FlowLayout y GridLayout . si vous avez besoin de précision - utilisez jgoodies FormLayout .

El FormLayout est vraiment délicat, mais vous pouvez jouer un peu avec WindowBuilder (qui est intégré à Eclipse) et un regard sur le code qu'il génère. Cela peut sembler compliqué mais ce n'est qu'une ignorance.

Bonne chance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X