Як додати JTable у JPanel з нульовим розташуванням?


235

Я хочу додати JTableв JPanelчий макет null. JPanelмістить інші компоненти. Я повинен додати JTableпри правильному положенні.


17
просто щоб підкреслити відповідь jzd: забудьте про нульове розташування. Це, безумовно, un-swing'ish - або вчитися за допомогою програми LayoutManagers, або використовувати іншу мову.
Клеопатра

Відповіді:


178

Приклад вкладеного / комбінованого макета

У підручнику Java є вичерпна інформація про використання менеджерів макетів. Детальнішу інформацію див. У розділі Розміщення компонентів на уроці контейнера .

Один з аспектів макетів, які недостатньо висвітлені підручником, - це вкладені макети, поміщаючи один макет всередину іншого, щоб отримати складні ефекти.

Наступний код містить різні компоненти в кадр, щоб продемонструвати, як використовувати вкладені макети. Усі макети, явно встановлені, відображаються у вигляді титульної межі панелі, на якій вони використовуються.

Помітними аспектами коду є:

  • Існує комбобокс для зміни PLAF (Pluggable Look and Feel) під час виконання.
  • Графічний інтерфейс можна розширити для потреб користувача.
  • Зображення в нижній частині розділеної панелі зосереджено в області прокрутки.
  • Екземпляри міток зліва динамічно додаються за допомогою кнопки.

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

Інші знімки екрана

Windows PLAF

Mac OS X Aqua PLAF

Ubuntu GTK + PLAF


49

Не використовуйте нульовий макет. Навчіться користуватися LayoutManagers:

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

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


20

Як я пам'ятаю, нульове розташування означає абсолютне положення, тому вам буде досить важко порахувати точку 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());

Удачі


16

Якщо ви використовуєте null manager layout, вам завжди потрібно встановити межі компонента. У цьому і полягає проблема у вашому випадку.

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

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


12

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

1

Коли компонент має "нульовий" макет, ви повинні керувати компонуванням самостійно, це означає, що ви повинні обчислити розміри та розташування для дітей компонента, щоб вирішити, де вони намальовані. Досить нудно, якщо це абсолютно не потрібно.

Якщо ви дійсно хочете цього дрібнозернистого контролю, можливо, спершу спробуйте GridBagLayout, перш ніж заплутатися з розташуванням інтерфейсу користувача.


0

Ви можете скористатися наступним кодом. Щоб додати 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);

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

Сподіваюсь, це допомагає.


ні ... три помилки у трьох рядках поспіль і не вирішуючи (погано, як це є) вимоги
kleopatra

використовуйте рамку замість панелі та спробуйте.
Лев

ви навіть не намагалися знайти свої помилки, чи не так? Іноді (як зараз) я дуже хотів би мати стільки зворотних каналів, скільки є помилок у коді / відповіді ..
kleopatra

які три лінії? rowdata та coldata, які потрібно додати.
Лев

4, 5, 6 (і остання)
клеопатра

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

Модель столу залежить від вашої потреби


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

Спробуйте це.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.