Jak dodać JTable w JPanel z zerowym układem?

235

Chcę dodać JTabledo JPanelktórego układu jest null. JPanelzawiera inne składniki. Muszę dodać JTablew odpowiedniej pozycji.

Sagar
źródło
17
aby podkreślić odpowiedź jzd: zapomnij o zerowym układzie. To zdecydowanie nie huśtawka - ucz się przy użyciu LayoutManagers lub użyj innego języka.
kleopatra 11.0411

Odpowiedzi:

178

Przykład układu zagnieżdżonego / kombinacji

Samouczek Java zawiera wyczerpujące informacje na temat korzystania z menedżerów układu. Więcej informacji można znaleźć w lekcji Rozmieszczanie komponentów w kontenerze .

Jednym z aspektów układów, który nie jest dobrze opisany w samouczku, jest układ zagnieżdżony, umieszczający jeden układ wewnątrz drugiego, aby uzyskać złożone efekty.

Poniższy kod umieszcza różne komponenty w ramce, aby zademonstrować, jak używać układów zagnieżdżonych. Wszystkie jawnie ustawione układy są pokazane jako obramowanie tytułowe dla panelu, na którym są używane.

Ważnymi aspektami kodu są:

  • Istnieje pole kombi do zmiany PLAF (wtykowy wygląd i działanie) w czasie wykonywania.
  • GUI można rozszerzyć do potrzeb użytkownika.
  • Obraz na dole panelu podziału jest wyśrodkowany w panelu przewijania.
  • Instancje etykiet po lewej stronie są dodawane dynamicznie za pomocą przycisku.

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

Inne zrzuty ekranu

Windows PLAF

Mac OS X Aqua PLAF

Ubuntu GTK + PLAF

Andrew Thompson
źródło
49

Nie używaj układu zerowego. Naucz się korzystać z LayoutManagers:

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

LayoutManagers pozwalają poprawnie obsługiwać zmiany rozmiaru okna lub dynamiczne zliczanie składników. Z początku mogą się wydawać zastraszające, ale warto się nauczyć.

jzd
źródło
20

Jak pamiętam, układ zerowy oznacza pozycję bezwzględną, więc trudno będzie policzyć punkt X dla położenia JTable w lewym górnym rogu. Ale jeśli chcesz mieć wszystkie komponenty panelu jeden po drugim, możesz użyć menedżera FlowLayout () jako

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

lub jeśli chcesz wypełnić panel, powinieneś użyć GridLayout () jako ...

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

Powodzenia

użytkownik592704
źródło
16

Jeśli używasz zerowego menedżera układu, zawsze musisz ustawić granice komponentu. To jest problem w twoim przypadku.

Powinieneś zrobić to, co wszyscy sugerują tutaj i przejść i użyć jakiegoś menedżera układu, który wierzy, że oszczędza czas. Idź i sprawdź samouczek w poście @ jzd.

Ciesz się, Boro.

Boro
źródło
12

JTablenależy dodać do tego, JScrollPaneco faktycznie należy dodać do JPanel.

JPanelPowinien mieć jakiś menedżer układu.

Jeśli nie zależy ci na precyzji rozmiaru komponentów, możesz użyć czystego BorderLayouti połączyć go z FlowLayouti GridLayout. jeśli potrzebujesz precyzji - użyj jgoodies FormLayout.

Jest FormLayoutto naprawdę trudne, ale możesz się trochę pobawić WindowBuilder(który jest osadzony w Eclipse) i spojrzeć na kod, który generuje. Może to wyglądać na skomplikowane, ale to tylko ignorancja.

Powodzenia.

sergpank
źródło
6

Po pierwsze, powinieneś poważnie rozważyć inne menedżery układów, na przykład BorderLayoutManager (nowy JPanel (nowy BorderLayout ())) to dobry początek.

Również przy projektowaniu okna dialogowego pamiętaj, że możesz i powinieneś zagnieżdżać swoje układy : jeden JPanel w innym JPanel (np. GridLayout wewnątrz BorderLayout). Uwaga: „dobre” okno dialogowe powinno mieć odpowiednią wielkość, aby użytkownik zmienił rozmiar ramki, aby automatycznie rozszerzyć obiekty informacyjne, takie jak tabela, i nie pokazywać dużych obszarów tła JPanel. Tego nie da się osiągnąć za pomocą NullLayout.

Ale prawdopodobnie są przypadki - gdzieś w tym wielkim świecie - gdzie NullLayout jest właśnie tym. Oto przykład:

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
źródło
1

Gdy komponent ma układ „zerowy”, musisz sam zarządzać układem, co oznacza, że ​​musisz obliczyć wymiary i lokalizacje elementów potomnych komponentu, aby zdecydować, gdzie zostaną narysowane. Dość żmudne, chyba że jest to absolutnie konieczne.

Jeśli naprawdę chcesz mieć tę precyzyjną kontrolę, spróbuj najpierw GridBagLayout, zanim popełnisz błąd w ustawieniach interfejsu użytkownika.

Kevin Wang
źródło
0

Możesz skorzystać z następującego kodu. Aby dodać JTable do 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
źródło
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);

Mam nadzieję że to pomoże.

Lew
źródło
nie ... trzy błędy w trzech kolejnych wierszach i
nierozwiązanie
użyj ramki zamiast panelu i spróbuj.
Leo
nawet nie próbowałeś znaleźć swoich błędów, prawda? Czasami (jak teraz) naprawdę chciałbym mieć tyle głosów negatywnych, ile jest błędów w kodzie / odpowiedzi ..
kleopatra
które trzy linie? rowdata i coldata musisz dodać.
Leo
4, 5, 6 (i ostatni)
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);

model stołu zależy od wymagań

krpa
źródło
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);

Spróbuj tego.

SB
źródło