Как добавить JTable в JPanel с нулевой компоновкой?

Я хочу добавить JTable в JPanel, формат которого null. JPanel содержит другие компоненты. Я должен добавить JTable в правильное положение.

Ответы

Ответ 1

Пример компоновки вложенных/комбинированных

Учебник Java содержит исчерпывающую информацию об использовании менеджеров макетов. Дополнительную информацию см. В разделе Укладка компонентов в контейнере.

Один аспект макетов, который не улавливается в этом учебнике, - это вложенные макеты, которые помещают один макет внутри другого, чтобы получить сложные эффекты.

Следующий код помещает множество компонентов в фрейм, чтобы продемонстрировать, как использовать вложенные макеты. Все макеты, которые явно заданы, отображаются в виде титульной границы для панели, на которой они используются.

Известные аспекты кода:

  • В режиме исполнения есть комбинированное поле для изменения PLAF (Pluggable Look and Feel).
  • Графический интерфейс расширяется по мере необходимости.
  • Изображение в нижней части разделенной панели находится в центре прокрутки.
  • Яркие экземпляры слева динамически добавляются с помощью кнопки.

Nimbus PLAF

RljPH.png

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

Другие снимки экрана

Windows PLAF

fHnCI.png

Mac OS X Aqua PLAF

Jaqap.png

Ubuntu GTK + PLAF

521zz.png

Ответ 2

Не используйте нулевой макет. Научитесь использовать LayoutManagers:

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

LayoutManagers позволяют вам правильно обрабатывать изменения размера окна или динамические подсчеты компонентов. Сначала они могут казаться запугивающими, но они стоят усилий, чтобы учиться.

Ответ 3

Как я помню, макет null означает абсолютную позицию, поэтому довольно сложно подсчитать точку X для вашего левого верхнего угла в JTable. Но если вы просто хотите, чтобы все компоненты панели были один за другим, вы можете использовать диспетчер FlowLayout() как

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

или если вам нужно заполнить панель, вы должны использовать GridLayout() как...

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

Удачи.

Ответ 4

Если вы используете диспетчер нулевой компоновки, вам всегда нужно установить границы компонента. Это проблема в вашем случае.

Вы должны делать то, что все предлагают здесь, и идти и использовать какой-то менеджер компоновки, считают, что они экономят время. Перейдите и ознакомьтесь с учебником в сообщении @jzd.

Наслаждайтесь, Боро.

Ответ 5

JTable следует добавить в JScrollPane который должен быть добавлен в JPanel.

JPanel должен иметь некоторый менеджер компоновки.

Если вам не нужна точность размеров компонентов, вы можете использовать чистый BorderLayout и объединить его с FlowLayout и GridLayout. если вам нужна точность - используйте jgoodies FormLayout.

FormLayout действительно сложный, но вы можете немного поиграть с WindowBuilder (который встроен в Eclipse) и посмотреть на код, который он создает. Это может показаться сложным, но это просто невежество.

Удачи.

Ответ 6

Во-первых, вам следует серьезно подумать о других менеджерах макета, например, BorderLayoutManager (новый JPanel (новый BorderLayout()) - хороший старт.

Также при разработке вашего диалога помните, что вы можете и должны вставлять макеты: один JPanel внутри другого JPanel (например, GridLayout внутри BorderLayout). Обратите внимание: "хороший" диалог должен правильно изменить размер, так что, если пользователь изменит размер вашего фрейма, вы хотите автоматически расширить свои информационные объекты, такие как ваша таблица, и не показывать большие области фона JPanel. Этого нельзя достичь с помощью NullLayout.

Но есть, вероятно, случаи - где-то в этом большом мире, где NullLayout - это всего лишь вещь. Итак, вот пример:

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

Ответ 7

Вы можете использовать следующий код. Чтобы добавить 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);

Ответ 8

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

Надеюсь, что это поможет.

Ответ 9

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

модель таблицы зависит от вашего требования

Ответ 10

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

Попробуйте это.

Ответ 11

Когда компонент имеет "нулевой" макет, вам нужно самостоятельно управлять компоновкой, это означает, что вам нужно рассчитать размеры и местоположения для дочерних элементов компонента, чтобы решить, где они нарисованы. Довольно утомительно, если это абсолютно необходимо.

Если вам действительно нужен этот мелкозернистый элемент управления, возможно, сначала попробуйте GridBagLayout, прежде чем собираться с компоновкой пользовательского интерфейса.