วิธีเพิ่ม JTable ใน JPanel ด้วยเค้าโครงแบบ null?


235

ฉันต้องการที่จะเพิ่มJTableเข้ามาในที่มีรูปแบบเป็น JPanel มีส่วนประกอบอื่น ๆ ฉันต้องเพิ่มในตำแหน่งที่เหมาะสมnullJPanelJTable


17
เพียงเพื่อเน้นคำตอบของ jzd: ลืมรูปแบบโมฆะ นั่นคือการยกเลิกการแกว่งแน่นอน - ทั้งเรียนรู้การใช้ LayoutManagers หรือใช้ภาษาอื่น
kleopatra

คำตอบ:


178

ตัวอย่างโครงร่างซ้อน / ชุดผสม

Java Tutorial มีข้อมูลที่ครอบคลุมเกี่ยวกับการใช้ตัวจัดการโครงร่าง ดูส่วนประกอบการจัดเค้าโครงภายในบทเรียนคอนเทนเนอร์สำหรับรายละเอียดเพิ่มเติม

ด้านหนึ่งของเลย์เอาท์ที่การสอนไม่ครอบคลุมเป็นอย่างดีก็คือเลย์เอาต์ที่ซ้อนกันวางเลย์เอาต์หนึ่งเข้าไปในอีกชั้นเพื่อรับเอฟเฟกต์ที่ซับซ้อน

รหัสต่อไปนี้ใส่ส่วนประกอบที่หลากหลายลงในเฟรมเพื่อสาธิตวิธีการใช้เลย์เอาต์ที่ซ้อนกัน เลย์เอาต์ทั้งหมดที่ตั้งไว้อย่างชัดเจนจะแสดงเป็นเส้นขอบสำหรับแผงที่ใช้

ลักษณะเด่นของรหัสคือ:

  • มีกล่องคำสั่งผสมเพื่อเปลี่ยน PLAF (รูปลักษณ์และความรู้สึกที่เสียบได้) ในขณะใช้งาน
  • GUI สามารถขยายได้ตามความต้องการของผู้ใช้
  • รูปภาพที่ด้านล่างของแถบแยกเป็นกึ่งกลางในแถบเลื่อน
  • อินสแตนซ์ของฉลากด้านซ้ายจะถูกเพิ่มแบบไดนามิกโดยใช้ปุ่ม

เมฆฝน 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

อย่าใช้เค้าโครงแบบ null เรียนรู้การใช้ LayoutManagers:

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

LayoutManagers ช่วยให้คุณจัดการการปรับขนาดของหน้าต่างหรือการนับจำนวนองค์ประกอบแบบไดนามิกได้อย่างถูกต้อง พวกเขาอาจดูน่ากลัวในตอนแรก แต่พวกเขาก็คุ้มค่ากับความพยายามในการเรียนรู้


20

ดังที่ฉันจำได้ว่าการจัดวางเป็นโมฆะหมายถึงตำแหน่งที่แน่นอนดังนั้นจึงเป็นการยากที่คุณจะนับจุด X สำหรับตำแหน่งมุมบนซ้ายของ JTable แต่ถ้าคุณต้องการมีส่วนประกอบพาเนลทั้งหมดทีละตัวคุณสามารถใช้ FlowLayout () manager เป็น

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 คุณจำเป็นต้องกำหนดขอบเขตของส่วนประกอบเสมอ นั่นคือปัญหาในกรณีของคุณ

คุณควรทำสิ่งที่ทุกคนแนะนำที่นี่และไปและใช้ผู้จัดการรูปแบบบางคนเชื่อว่าพวกเขาประหยัดเวลา ไปและดูบทช่วยสอนในโพสต์ของ @ jzd

สนุก Boro


12

JTableควรเพิ่มเข้าไปในสิ่งJScrollPaneที่ควรเพิ่มเข้าไปJPanelจริง

JPanelควรจะมีผู้จัดการแบบบาง

หากคุณไม่สนใจเกี่ยวกับความแม่นยำของขนาดองค์ประกอบที่คุณสามารถใช้บริสุทธิ์BorderLayoutและรวมกับและFlowLayout GridLayoutหากคุณต้องการความแม่นยำ - FormLayoutjgoodies

อัน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 ก่อนก่อนที่จะไปยุ่งกับการจัดเรียง UI


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

ใช้เฟรมแทนพาเนลแล้วลอง
Leo

คุณไม่ได้พยายามค้นหาข้อผิดพลาดของคุณใช่ไหม? บางครั้ง (เหมือนตอนนี้) ผมอยากมีเป็น downvotes มากที่สุดเท่าที่มีข้อผิดพลาดในรหัส / คำตอบ ..
kleopatra

สามบรรทัดไหน rowdata และ coldata คุณต้องเพิ่ม
Leo

4, 5, 6 (และสุดท้าย)
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);

รูปแบบตารางขึ้นอยู่กับความต้องการของคุณ


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

ลองสิ่งนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.