it-swarm.com.de

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

Ich möchte JTable zu JPanel hinzufügen, dessen Layout null ist. JPanel enthält andere Komponenten. Ich muss JTable an der richtigen Position hinzufügen.

229
Sagar

Beispiel für ein verschachteltes/kombiniertes Layout

Das Java Tutorial enthält umfassende Informationen zur Verwendung von Layout-Managern. Weitere Informationen finden Sie in der Lektion Komponenten in einem Container auslegen .

Ein Aspekt von Layouts, der vom Lernprogramm nicht gut abgedeckt wird , ist der von verschachtelten 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 Rahmen ein, um zu veranschaulichen, wie verschachtelte Layouts verwendet werden. 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, mit dem PLAF (Pluggable Look and Feel) zur Laufzeit geändert werden kann.
  • Die GUI kann nach Bedarf des Benutzers erweitert werden.
  • Das Bild am unteren Rand des geteilten Bereichs wird im Bildlaufbereich zentriert.
  • Die Beschriftungsinstanzen links werden über die 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

178
Andrew Thompson

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

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

Mit LayoutManagers können Sie die Größenänderung von Fenstern oder die Anzahl dynamischer Komponenten richtig handhaben. Sie mögen zunächst einschüchternd wirken, aber das Lernen lohnt sich.

49
jzd

Wie ich mich erinnern kann, bedeutet das null -Layout eine absolute Position, so dass es ziemlich schwierig ist, 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 anzeigen möchten, können Sie FlowLayout () manager as 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

19
user592704

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 tun, was alle hier vorschlagen, und einen Layout-Manager verwenden, der glaubt, dass er Zeit spart. Schauen Sie sich das Tutorial in @ jzds Beitrag an.

Viel Spaß, Boro.

16
Boro

JTable sollte zu JScrollPane hinzugefügt werden, was eigentlich zu JPanel hinzugefügt werden sollte.

Das JPanel sollte einen Layout-Manager haben.

Wenn Sie sich nicht für die Präzision der Komponentengröße interessieren, können Sie reines BorderLayout verwenden und es mit FlowLayout und GridLayout kombinieren. Wenn Sie Präzision benötigen, verwenden Sie jgoodies FormLayout.

Das FormLayout ist wirklich knifflig, aber Sie können ein wenig mit WindowBuilder (das in Eclipse eingebettet ist) und dem Code spielen, den es generiert. Es mag kompliziert aussehen, aber es ist nur eine Unwissenheit.

Viel Glück.

12
sergpank

Zunächst sollten Sie andere Layout-Manager ernsthaft in Betracht ziehen, zum Beispiel ist der BorderLayoutManager (neues JPanel (new 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: Ein 'guter' Dialog sollte die Größe korrekt ändern , damit Sie Ihre Informationsobjekte wie Ihr Rahmen automatisch erweitern können, wenn der Benutzer die Größe Ihres Rahmens ändert Tabelle 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. Also 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);
  }
}
6
Axel Podehl

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

Wenn Sie diese feinkörnige Steuerung wirklich wollen, versuchen Sie es vielleicht zuerst mit GridBagLayout, bevor Sie sich mit dem UI-Arrangement beschäftigen.

1
Kevin Wang
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.

0
S.B
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);

tischmodell hängt von Ihrer Anforderung ab

0
krpa
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.

0
Leo

Sie können den folgenden Code verwenden. Hinzufügen von JTable zu 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
Sankar