Wie füge ich JTable in JPanel mit Null-Layout hinzu?

235

Ich möchte hinzufügen, JTablein JPanelwessen Layout ist null. JPanelenthält andere Komponenten. Ich muss JTablean der richtigen Stelle hinzufügen .

Sagar
quelle
17
Nur um die Antwort von jzd hervorzuheben: Vergessen Sie das Null-Layout. Das ist definitiv nicht schwungvoll - entweder mit LayoutManagern lernen oder eine andere Sprache verwenden.
Kleopatra

Antworten:

178

Beispiel für ein verschachteltes / kombiniertes Layout

Das Java-Lernprogramm enthält umfassende Informationen zur Verwendung von Layout-Managern. Siehe das Layout von Komponenten in einem Container Lektion für weitere Details.

Ein Aspekt von Layouts ist das nicht der im Lernprogramm gut behandelt wird, sind verschachtelte Layouts, bei denen ein Layout in ein anderes eingefügt wird, um komplexe Effekte zu erzielen.

Der folgende Code fügt eine Vielzahl von Komponenten in einen Frame ein, um die Verwendung verschachtelter Layouts zu demonstrieren. Alle explizit festgelegten Layouts werden als Titelrahmen für das Bedienfeld angezeigt, in dem sie verwendet werden.

Bemerkenswerte Aspekte des Codes sind:

  • Es gibt ein Kombinationsfeld zum Ändern von PLAF (Pluggable Look and Feel) zur Laufzeit.
  • Die GUI kann nach Bedarf des Benutzers erweitert werden.
  • Das Bild im unteren Bereich des geteilten Fensters wird im Bildlauffenster zentriert.
  • Die Beschriftungsinstanzen auf der linken Seite werden mithilfe der Schaltfläche dynamisch hinzugefügt.

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

Andere Screenshots

Windows PLAF

Mac OS X Aqua PLAF

Ubuntu GTK + PLAF

Andrew Thompson
quelle
49

Verwenden Sie kein Null-Layout. Erfahren Sie, wie Sie LayoutManager verwenden:

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

Mit LayoutManagern können Sie die Größe von Fenstern oder die Anzahl dynamischer Komponenten richtig handhaben. Sie mögen zunächst einschüchternd wirken, aber es lohnt sich, sie zu lernen.

jzd
quelle
20

Wie ich mich erinnern kann, bedeutet das Null- Layout eine absolute Position, so dass es ziemlich schwierig sein wird, den X-Punkt für Ihre Position in der linken oberen Ecke von JTable zu zählen. Wenn Sie jedoch nur alle Panel-Komponenten einzeln haben möchten, können Sie den FlowLayout () -Manager als verwenden

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

oder wenn Sie das Panel ausfüllen müssen, sollten Sie GridLayout () als ...

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

Viel Glück

user592704
quelle
16

Wenn Sie den Null-Layout-Manager verwenden, müssen Sie immer die Grenzen einer Komponente festlegen. Das ist das Problem in Ihrem Fall.

Sie sollten das tun, was alle hier vorschlagen, und einen Layout-Manager verwenden, der glaubt, Zeit zu sparen. Schauen Sie sich das Tutorial in @ jzds Beitrag an.

Viel Spaß, Boro.

Boro
quelle
12

JTablesollte in die hinzugefügt werden, JScrollPanedie tatsächlich in die hinzugefügt werden sollte JPanel.

Der JPanelsollte einen Layout-Manager haben.

Wenn Sie sich nicht für die Genauigkeit der Komponentengröße interessieren, können Sie pure verwenden BorderLayoutund mit FlowLayoutund kombinieren GridLayout. Wenn Sie Präzision benötigen, verwenden Sie jgoodies FormLayout.

Das FormLayoutist wirklich knifflig, aber Sie können ein wenig damit spielen WindowBuilder(was in Eclipse eingebettet ist) und einen Blick auf den Code werfen, den es generiert. Es mag kompliziert aussehen, aber es ist nur eine Unwissenheit.

Viel Glück.

Sergpank
quelle
6

Zunächst sollten Sie andere Layout-Manager ernsthaft in Betracht ziehen, beispielsweise ist der BorderLayoutManager (neues JPanel (neues BorderLayout ())) ein guter Anfang.

Denken Sie auch beim Entwerfen Ihres Dialogfelds daran, dass Sie Ihre Layouts verschachteln können und sollten : ein JPanel in einem anderen JPanel (z. B. ein GridLayout in einem BorderLayout). Bitte beachten Sie: Die Größe eines "guten" Dialogfelds sollte ordnungsgemäß geändert werden. Wenn der Benutzer die Größe Ihres Frames ändert, möchten Sie Ihre Informationsobjekte wie Ihre Tabelle automatisch erweitern und keine großen Bereiche des JPanel-Hintergrunds anzeigen. Das können Sie mit einem NullLayout nicht erreichen.

Aber es gibt wahrscheinlich Fälle - irgendwo in dieser großen Welt - in denen ein NullLayout genau das Richtige ist. Hier ist ein Beispiel:

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
quelle
1

Wenn eine Komponente ein "Null" -Layout hat, müssen Sie das Layout selbst verwalten. Dies bedeutet, dass Sie die Abmessungen und Positionen für die untergeordneten Elemente der Komponente berechnen müssen, um zu entscheiden, wo sie gezeichnet werden. Ziemlich langweilig, es sei denn, es ist absolut notwendig.

Wenn Sie dieses feinkörnige Steuerelement wirklich wollen, versuchen Sie es vielleicht zuerst mit GridBagLayout, bevor Sie mit der Benutzeroberfläche beginnen.

Kevin Wang
quelle
0

Sie können den folgenden Code verwenden. So fügen Sie JTable zu JPanel hinzu

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

Hoffe das hilft.

Löwe
quelle
nein ... drei Fehler in drei aufeinanderfolgenden Zeilen und nicht die (schlechte wie es ist) Anforderung zu
lösen
Verwenden Sie Rahmen anstelle von Panel und versuchen Sie es.
Leo
Sie haben nicht einmal versucht, Ihre Fehler zu finden, oder? Manchmal (wie jetzt) ​​möchte ich wirklich so viele Abstimmungen haben, wie es Fehler im Code / in der Antwort gibt.
Kleopatra
welche drei Zeilen? Rowdata und Coldata müssen hinzugefügt werden.
Leo
4, 5, 6 (und der letzte)
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);

Das Tabellenmodell hängt von Ihrer Anforderung ab

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

Versuche dies.

SB
quelle