Come aggiungere JTable in JPanel con layout null?


235

Voglio aggiungere JTablenel JPanelcui layout è null. JPanelcontiene altri componenti. Devo aggiungere JTablenella posizione corretta.


17
solo per enfatizzare la risposta di jzd: dimentica il layout nullo. Questo è decisamente non-swing - o impara usando LayoutManager o usa una lingua diversa.
Kleopatra,

Risposte:


178

Esempio di layout nidificato / combinato

Il tutorial Java ha informazioni complete sull'uso dei gestori layout. Vedere la lezione Disposizione dei componenti all'interno di un contenitore per ulteriori dettagli.

Un aspetto dei layout che non è ben coperto dal tutorial è quello dei layout nidificati, che mettono un layout all'interno di un altro per ottenere effetti complessi.

Il codice seguente inserisce una varietà di componenti in un frame per dimostrare come utilizzare layout nidificati. Tutti i layout impostati esplicitamente vengono visualizzati come un bordo con titolo per il pannello su cui vengono utilizzati.

Aspetti notevoli del codice sono:

  • C'è una casella combinata per cambiare PLAF (Pluggable Look and Feel) in fase di esecuzione.
  • La GUI è espandibile in base alle esigenze dell'utente.
  • L'immagine nella parte inferiore del riquadro diviso è centrata nel riquadro di scorrimento.
  • Le istanze dell'etichetta a sinistra vengono aggiunte dinamicamente tramite il pulsante.

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

Altri screenshot

Windows PLAF

Mac OS X Aqua PLAF

Ubuntu GTK + PLAF



20

Come posso ricordare, il layout null significa una posizione assoluta, quindi sarà abbastanza difficile contare il punto X per la posizione dell'angolo superiore sinistro di JTable. Ma se vuoi solo avere tutti i componenti del pannello uno per uno puoi usare FlowLayout () manager come

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

o se devi riempire il pannello dovresti usare GridLayout () come ...

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

In bocca al lupo


16

Se si utilizza Null Layout Manager, è sempre necessario impostare i limiti di un componente. Questo è il problema nel tuo caso.

Dovresti fare ciò che tutti suggeriscono qui e andare e usare alcuni gestori di layout che credono di risparmiare tempo. Vai e dai un'occhiata al tutorial nel post di @jzd.

Divertiti, Boro.


12

JTabledovrebbe essere aggiunto al JScrollPanequale effettivamente dovrebbe essere aggiunto al file JPanel.

L' JPaneldovrebbe avere qualche gestore di layout.

Se non ti interessa la precisione delle dimensioni dei componenti, puoi usare puro BorderLayoute combinarlo con FlowLayoute GridLayout. se hai bisogno di precisione, usa jgoodies FormLayout.

L' FormLayoutè davvero una difficile, ma si può giocare un po 'con WindowBuilder(che è incorporato in Eclipse) e uno sguardo al codice che genera. Può sembrare complicato ma è solo un'ignoranza.

In bocca al lupo.


6

Innanzitutto, dovresti prendere seriamente in considerazione altri gestori layout, ad esempio BorderLayoutManager (new JPanel (new BorderLayout ())) è un buon inizio.

Inoltre, quando progetti la tua finestra di dialogo, ricorda che puoi e dovresti annidare i tuoi layout : uno JPanel all'interno di un altro JPanel (ad esempio un GridLayout all'interno di un BorderLayout). Nota: una finestra di dialogo "buona" deve essere ridimensionata correttamente , in modo che se l'utente ridimensiona la cornice, si desidera estendere automaticamente gli oggetti informazioni come la tabella e non mostrare ampie aree dello sfondo JPanel. È qualcosa che non puoi ottenere con un NullLayout.

Ma ci sono probabilmente casi - da qualche parte in questo grande mondo - in cui un NullLayout è la cosa giusta. Quindi ecco un esempio:

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

1

Quando un componente ha un layout "nullo", devi gestire il layout da solo, ciò significa che devi calcolare le dimensioni e le posizioni affinché i figli del componente possano decidere dove vengono disegnati. Abbastanza noioso a meno che non sia assolutamente necessario.

Se vuoi davvero quel controllo a grana fine, forse prova GridBagLayout prima di andare in confusione con la disposizione dell'interfaccia utente.


0

È possibile utilizzare il seguente codice. Per aggiungere 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);

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

Spero che questo ti aiuti.


no ... tre errori in tre righe consecutive e non risolve il requisito (così com'è)
Kleopatra,

usa frame invece di panel e prova.
Leo,

non hai nemmeno provato a trovare i tuoi errori, vero? A volte (come ora) mi piacerebbe davvero avere tanti downgrade quanti sono gli errori nel codice / risposta ..
Kleopatra

quali tre linee? rowdata e coldata devi aggiungere.
Leone,

4, 5, 6 (e l'ultimo)
Kleopatra il

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

il modello di tabella dipende dalle vostre esigenze


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

Prova questo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.