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

235

Je veux ajouter JTableà JPanella disposition de qui est null. JPanelcontient d'autres composants. Je dois ajouter JTableà la bonne position.

Sagar
la source
17
juste pour souligner la réponse de jzd: oubliez la disposition nulle. C'est vraiment décevant - apprenez à utiliser LayoutManagers ou utilisez un langage différent.
kleopatra

Réponses:

178

Exemple de disposition imbriquée / combinée

Le didacticiel Java contient des informations complètes sur l'utilisation des gestionnaires de disposition. Voir la leçon Présentation des composants dans un conteneur pour plus de détails.

Un aspect des dispositions qui n'est pas bien couvert par le didacticiel est celui des dispositions imbriquées, en plaçant une disposition dans une autre pour obtenir des effets complexes.

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

Les aspects notables du code sont:

  • Il existe une zone de liste déroulante pour modifier PLAF (Pluggable Look and Feel) au moment de l'exécution.
  • L'interface graphique est extensible aux besoins de l'utilisateur.
  • L'image en bas du volet divisé est centrée dans le volet de défilement.
  • Les instances d'étiquette à 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

Andrew Thompson
la source
49

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

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

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

jzd
la source
20

Si je me souviens bien, la disposition nulle signifie une position absolue, il vous sera donc assez difficile de compter le point X pour l'emplacement de votre coin supérieur gauche JTable. Mais si vous voulez juste avoir tous les composants du panneau un par un, vous pouvez utiliser le gestionnaire FlowLayout () comme

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

ou si vous devez 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

user592704
la source
16

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

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

Profitez-en, Boro.

Boro
la source
12

JTabledevrait être ajouté dans le JScrollPanequi devrait effectivement être ajouté dans le JPanel.

Le JPaneldevrait 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 pur BorderLayoutet le combiner avec FlowLayoutet GridLayout. si vous avez besoin de précision - utilisez jgoodies FormLayout.

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

Bonne chance.

sergpank
la source
6

Tout d'abord, vous devriez sérieusement envisager d'autres gestionnaires de mise en page, par exemple le BorderLayoutManager (nouveau JPanel (nouveau BorderLayout ())) est un bon début.

De plus, lors de la conception de votre dialogue, n'oubliez pas que vous pouvez et devez imbriquer vos mises en page : un JPanel à l'intérieur d'un autre JPanel (par exemple un GridLayout à l'intérieur d'un BorderLayout). Remarque: une «bonne» boîte de dialogue doit être redimensionnée correctement , de sorte que si l'utilisateur redimensionne votre cadre, vous souhaitez étendre automatiquement vos objets d'information tels que votre tableau et ne pas afficher de grandes zones d'arrière-plan JPanel. C'est quelque chose que vous ne pouvez pas réaliser avec un NullLayout.

Mais il y a probablement des cas - quelque part dans ce grand monde - où un NullLayout est juste la chose. Voici donc un exemple:

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
la source
1

Lorsqu'un composant a une disposition "nulle", vous devez gérer la disposition par vous-même, ce qui signifie que vous devez calculer les dimensions et les emplacements des enfants du composant pour décider où ils sont dessinés. Assez fastidieux, sauf si c'est absolument nécessaire.

Si vous voulez vraiment ce contrôle à grain fin, essayez peut-être GridBagLayout avant de vous lancer dans l'arrangement d'interface utilisateur.

Kevin Wang
la source
0

Vous pouvez utiliser le code suivant. Pour ajouter JTable à 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
la source
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);

J'espère que cela t'aides.

Leo
la source
non ... trois erreurs sur trois lignes consécutives et ne résolvant pas l'exigence (aussi mauvaise soit-elle)
kleopatra
utilisez le cadre au lieu du panneau et essayez.
Leo
vous n'avez même pas essayé de trouver vos erreurs, n'est-ce pas? Parfois (comme maintenant) j'aimerais vraiment avoir autant de downvotes qu'il y a d'erreurs dans le code / réponse ..
kleopatra
quelles trois lignes? rowdata et coldata vous devez ajouter.
Leo
4, 5, 6 (et le dernier)
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);

le modèle de table dépend de vos besoins

krpa
la source
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);

Essaye ça.

SB
la source