Làm cách nào để thêm JTable trong JPanel với bố cục null?


235

Tôi muốn thêm JTablevào JPanelbố trí của ai null. JPanelchứa các thành phần khác. Tôi phải thêm JTablevào vị trí thích hợp.


17
chỉ để nhấn mạnh câu trả lời của jzd: hãy quên bố cục null. Điều đó chắc chắn không thay đổi - học bằng cách sử dụng Trình quản lý bố cục hoặc sử dụng ngôn ngữ khác.
kleopatra

Câu trả lời:


178

Ví dụ bố trí kết hợp / lồng nhau

Hướng dẫn Java có thông tin toàn diện về việc sử dụng các trình quản lý bố cục. Xem các thành phần bố trí trong một bài học Container để biết thêm chi tiết.

Một khía cạnh của bố cục không được hướng dẫn tốt bao gồm các bố cục được lồng vào nhau, đặt một bố cục bên trong một bố cục khác để có được các hiệu ứng phức tạp.

Đoạn mã sau đặt một loạt các thành phần vào một khung để trình bày cách sử dụng bố cục lồng nhau. Tất cả các bố cục được đặt rõ ràng được hiển thị dưới dạng đường viền có tiêu đề cho bảng mà chúng được sử dụng.

Các khía cạnh đáng chú ý của mã là:

  • Có một hộp tổ hợp để thay đổi PLAF (Pluggable Look and Feel) trong thời gian chạy.
  • GUI có thể mở rộng theo nhu cầu của người dùng.
  • Hình ảnh ở dưới cùng của khung phân chia được căn giữa trong khung cuộn.
  • Các trường hợp nhãn ở bên trái được thêm động bằng cách sử dụng nút.

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

Ảnh chụp màn hình khác

Windows PLAF

Mac OS X Aqua PLAF

Ubuntu GTK + PLAF


49

Đừng sử dụng bố cục null. Tìm hiểu cách sử dụng Trình quản lý bố cục:

http://doad.oracle.com/javase/tutorial/uiswing/layout/USE.html

Trình quản lý bố cục cho phép bạn xử lý đúng cách thay đổi kích thước cửa sổ hoặc số thành phần động. Ban đầu chúng có vẻ đáng sợ, nhưng chúng đáng để nỗ lực học hỏi.


20

Như tôi có thể nhớ, bố cục null có nghĩa là một vị trí tuyệt đối, do đó, sẽ rất khó để bạn đếm điểm X cho vị trí góc trên bên trái của JTable. Nhưng nếu bạn chỉ muốn có tất cả các thành phần bảng một, bạn có thể sử dụng trình quản lý FlowLayout () như

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

hoặc nếu bạn cần điền vào bảng điều khiển, bạn nên sử dụng GridLayout () làm ...

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

Chúc may mắn


16

Nếu bạn đang sử dụng trình quản lý bố cục null, bạn luôn cần đặt giới hạn của một thành phần. Đó là vấn đề trong trường hợp của bạn.

Bạn nên làm những gì mọi người đề nghị ở đây và đi và sử dụng một số trình quản lý bố cục tin rằng họ tiết kiệm thời gian. Đi và xem hướng dẫn trong bài viết của @ jzd.

Thưởng thức đi, Boro.


12

JTablenên được thêm vào trong JScrollPaneđó thực sự nên được thêm vào JPanel.

Các JPanelnên có một số nhà quản lý bố trí.

Nếu bạn không quan tâm đến độ chính xác của kích thước linh kiện, bạn có thể sử dụng nguyên chất BorderLayoutvà kết hợp nó với FlowLayoutGridLayout. nếu bạn cần độ chính xác - sử dụng jgoodies FormLayout.

Cái FormLayoutnày thực sự rất khó, nhưng bạn có thể chơi một chút với WindowBuilder(được nhúng vào Eclipse) và xem mã mà nó tạo ra. Nó có thể trông phức tạp nhưng nó chỉ là một sự thiếu hiểu biết.

Chúc may mắn.


6

Trước tiên, bạn nên nghiêm túc xem xét các trình quản lý Bố cục khác, ví dụ BorderLayoutManager (JPanel mới (BorderLayout ())) là một khởi đầu tốt.

Ngoài ra khi thiết kế hộp thoại của bạn, hãy nhớ rằng bạn có thể và nên lồng các bố cục của mình : một JPanel bên trong một JPanel khác (ví dụ: GridLayout bên trong BorderLayout). Xin lưu ý: hộp thoại 'tốt' phải thay đổi kích thước chính xác , để nếu người dùng thay đổi kích thước Khung của bạn, bạn muốn tự động mở rộng các đối tượng thông tin như bảng của mình và không hiển thị các vùng lớn của nền JPanel. Đó là điều bạn không thể đạt được với NullLayout.

Nhưng có lẽ có những trường hợp - một nơi nào đó trong thế giới rộng lớn này - nơi một NullLayout chỉ là thứ. Vì vậy, đây là một ví dụ:

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

Khi một thành phần có bố cục "null", bạn phải tự mình quản lý bố cục, điều đó có nghĩa là bạn phải tính toán kích thước và vị trí cho con của thành phần để quyết định vị trí chúng được vẽ. Khá tẻ nhạt trừ khi nó là hoàn toàn cần thiết.

Nếu bạn thực sự muốn điều khiển chi tiết đó, có thể thử GridBagLayout trước khi thực hiện thao tác sắp xếp giao diện người dùng.


0

Bạn có thể sử dụng mã sau đây. Để thêm JTable vào 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);

Hi vọng điêu nay co ich.


không ... ba lỗi trong ba dòng liên tiếp và không giải quyết được yêu cầu (xấu như vậy)
kleopatra

sử dụng khung thay vì bảng điều khiển và thử.
Leo

bạn thậm chí không thử tìm lỗi của mình, phải không? Đôi khi (như bây giờ) tôi thực sự muốn có nhiều lượt tải xuống như có lỗi trong mã / câu trả lời ..
kleopatra

Ba dòng nào? rowdata và Coldata bạn phải thêm.
Leo

4, 5, 6 (và cuối cùng)
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);

mô hình bảng phụ thuộc vào yêu cầu của bạn


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

Thử cái này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.