Bagaimana cara menambahkan JTable di JPanel dengan tata letak nol?

235

Saya ingin menambahkan JTableke JPanelyang tata letak adalah null. JPanelmengandung komponen lain. Saya harus menambahkan JTablepada posisi yang tepat.

Sagar
sumber
17
hanya untuk menekankan jawaban jzd: lupakan tentang tata letak nol. Itu jelas tidak berayun - belajar menggunakan LayoutManagers atau menggunakan bahasa yang berbeda.
kleopatra

Jawaban:

178

Contoh Tata Letak Bersarang / Kombinasi

Tutorial Java memiliki informasi lengkap tentang cara menggunakan manajer tata letak. Lihat Komponen Laying Out Inside a Container untuk detail lebih lanjut.

Salah satu aspek tata letak yang tidak tercakup dengan baik oleh tutorial adalah tata letak bersarang, menempatkan satu tata letak di dalam yang lain untuk mendapatkan efek kompleks.

Kode berikut menempatkan berbagai komponen ke dalam bingkai untuk menunjukkan cara menggunakan tata letak bersarang. Semua tata letak yang ditetapkan secara eksplisit ditampilkan sebagai batas-judul untuk panel di mana mereka digunakan.

Aspek penting dari kode adalah:

  • Ada kotak kombo untuk mengubah PLAF (Tampilan dan Perasaan Pluggable) saat run-time.
  • GUI dapat dikembangkan sesuai kebutuhan pengguna.
  • Gambar di bagian bawah panel-split berpusat di panel-gulir.
  • Contoh label di sebelah kiri ditambahkan secara dinamis menggunakan tombol.

PLAF Nimbus

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

Tembakan Layar Lainnya

PLAF Windows

Mac OS X Aqua PLAF

Ubuntu GTK + PLAF

Andrew Thompson
sumber
49

Jangan gunakan tata letak nol. Belajar menggunakan LayoutManagers:

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

LayoutManagers memungkinkan Anda untuk menangani pengubahan ukuran benda atau jumlah komponen dinamis dengan benar. Mereka mungkin tampak menakutkan pada awalnya, tetapi mereka sepadan dengan usaha untuk belajar.

jzd
sumber
20

Seperti yang saya ingat, tata letak nol berarti posisi absolut sehingga akan sangat sulit bagi Anda untuk menghitung titik X untuk lokasi sudut kiri atas JTable Anda. Tetapi jika Anda hanya ingin memiliki semua komponen panel satu per satu Anda dapat menggunakan manajer FlowLayout () sebagai

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

atau jika Anda perlu mengisi panel Anda harus menggunakan GridLayout () sebagai ...

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

Semoga berhasil

pengguna592704
sumber
16

Jika Anda menggunakan manajer tata letak nol, Anda selalu harus menetapkan batas-batas komponen. Itulah masalah dalam kasus Anda.

Anda harus melakukan apa yang semua orang sarankan di sini dan pergi dan menggunakan beberapa manajer tata letak percaya mereka menghemat waktu. Pergi dan periksa tutorial di posting @ jzd.

Selamat menikmati, Boro.

Boro
sumber
12

JTableharus ditambahkan ke dalam JScrollPaneyang sebenarnya harus ditambahkan ke dalam JPanel.

The JPanelharus memiliki beberapa manajer layout.

Jika Anda tidak peduli tentang ketepatan ukuran komponen, Anda dapat menggunakan pure BorderLayoutdan menggabungkannya dengan FlowLayoutdan GridLayout. jika Anda membutuhkan ketepatan - gunakan jgoodies FormLayout.

Ini FormLayoutbenar-benar rumit, tetapi Anda bisa bermain sedikit dengan WindowBuilder(yang tertanam dalam Eclipse) dan melihat kode yang dihasilkannya. Ini mungkin terlihat rumit tetapi itu hanyalah ketidaktahuan.

Semoga berhasil.

sergpank
sumber
6

Pertama, Anda harus mempertimbangkan manajer Layout lainnya dengan serius, misalnya BorderLayoutManager (JPanel baru (BorderLayout baru ())) adalah awal yang baik.

Juga ketika mendesain dialog Anda, ingatlah bahwa Anda dapat dan harus membuat layout Anda : satu JPanel di dalam JPanel lain (misalnya GridLayout di dalam BorderLayout). Harap dicatat: dialog 'baik' harus mengubah ukuran dengan benar , sehingga jika pengguna mengubah ukuran Frame Anda, Anda ingin secara otomatis memperluas objek informasi Anda seperti tabel Anda, dan tidak menunjukkan area besar latar belakang JPanel. Itu sesuatu yang tidak bisa Anda capai dengan NullLayout.

Tapi mungkin ada kasus - di suatu tempat di dunia besar ini - di mana NullLayout adalah masalahnya. Jadi inilah sebuah contoh:

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
sumber
1

Ketika komponen memiliki tata letak "null", Anda harus mengelola tata letak sendiri, itu berarti Anda harus menghitung dimensi dan lokasi untuk anak-anak komponen untuk memutuskan di mana mereka diambil. Cukup membosankan kecuali itu mutlak diperlukan.

Jika Anda benar-benar menginginkan kontrol berbutir halus itu, mungkin coba GridBagLayout terlebih dahulu sebelum menjadi bingung dengan pengaturan UI.

Kevin Wang
sumber
0

Anda dapat menggunakan kode berikut. Untuk menambahkan JTable ke 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
sumber
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);

Semoga ini membantu.

Leo
sumber
tidak ... tiga kesalahan dalam tiga baris berturut-turut dan tidak menyelesaikan persyaratan (seburuk itu)
kleopatra
gunakan bingkai daripada panel dan coba.
Leo
Anda bahkan tidak mencoba menemukan kesalahan Anda, bukan? Kadang-kadang (seperti sekarang) saya benar-benar ingin memiliki banyak downvotes karena ada kesalahan dalam kode / jawaban ..
kleopatra
tiga baris yang mana? rowdata dan coldata yang harus Anda tambahkan.
Leo
4, 5, 6 (dan yang terakhir)
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 tabel tergantung pada kebutuhan Anda

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

Coba ini.

SB
sumber