Null düzen ile JPanel'de JTable nasıl eklenir?


235

Ben eklemek istiyorum JTableiçine JPanelkimin düzenidir null. JPanelbaşka bileşenler içerir. JTableUygun pozisyonda eklemeliyim .


17
sadece jzd'nin cevabını vurgulamak için: null düzeni unutun. Bu kesinlikle değişmez - ya LayoutManager'ları kullanmayı öğrenin ya da farklı bir dil kullanın.
kleopatra

Yanıtlar:


178

İç İçe / Kombinasyon Düzeni Örneği

Java Eğitimi'nde mizanpaj yöneticilerini kullanma hakkında kapsamlı bilgiler bulunur. Daha fazla bilgi için Bileşenleri Konteyner İçine Yerleştirme dersine bakın.

Olduğu düzenleri bir yönü değil öğretici tarafından iyi örtülü karmaşık efektler elde etmek için diğerinin içine bir düzen koyarak, bu iç içe düzenleri taşımaktadır.

Aşağıdaki kod, iç içe yerleşimlerin nasıl kullanılacağını göstermek için çeşitli bileşenleri çerçeveye yerleştirir. Açık bir şekilde ayarlanan tüm düzenler, kullanıldıkları panel için başlıklı kenarlık olarak gösterilir.

Kodun dikkate değer yönleri:

  • Çalışma zamanında PLAF'ı (Takılabilir Görünüm ve Hisset) değiştirmek için bir birleşik giriş kutusu vardır.
  • GUI kullanıcının ihtiyacına göre genişletilebilir.
  • Bölme bölmesinin altındaki görüntü kaydırma bölmesinde ortalanır.
  • Soldaki etiket örnekleri, düğmesi kullanılarak dinamik olarak eklenir.

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

Diğer Ekran Görüntüleri

Windows PLAF

Mac OS X Aqua PLAF

Ubuntu GTK + PLAF



20

Hatırlayabildiğim gibi, null düzen mutlak bir konum anlamına gelir, bu nedenle JTable sol üst köşe konumunuz için X noktasını saymanız oldukça zor olacaktır. Ancak tüm panel bileşenlerinin tek tek olmasını istiyorsanız FlowLayout () yöneticisini şu şekilde kullanabilirsiniz:

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

veya paneli doldurmanız gerekiyorsa GridLayout () yöntemini ...

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

İyi şanslar


16

Null düzen yöneticisi kullanıyorsanız, her zaman bir bileşenin sınırlarını ayarlamanız gerekir. Sizin durumunuzdaki sorun budur.

Herkesin burada önerisini yapmalı ve zamandan tasarruf ettiklerine inandıkları bazı düzen yöneticilerini kullanmalısınız. Git ve @ jzd'nin gönderisindeki öğreticiye göz at.

Keyfini çıkarın Boro.


12

JTableiçine JScrollPaneeklenmelidir JPanel.

JPanelBazı düzen yöneticisi olmalıdır.

Eğer bileşenlerin hassas umurumda değil Eğer saf kullanabilirsiniz boyutu BorderLayoutve birleştirin FlowLayoutve GridLayout. hassasiyete ihtiyacınız varsa - jgoodies kullanın FormLayout.

FormLayoutGerçekten ilginç bir olay olmakla birlikte, biraz oynayabilir WindowBuilder(Eclipse içine gömülür) ve onun meydana getirdiği kodlara göz. Karmaşık görünebilir ama sadece bir cehalettir.

İyi şanslar.


6

İlk olarak, diğer Layout yöneticilerini ciddiye almalısınız, örneğin BorderLayoutManager (yeni JPanel (yeni BorderLayout ())) iyi bir başlangıçtır.

Ayrıca iletişim kutunuzu tasarlarken, düzenleriniziiçe geçirebileceğinizi ve iç içe geçireceğinizi unutmayın : bir JPanel başka bir JPanel içinde (ör. BorderLayout içindeki GridLayout). Lütfen dikkat: 'iyi' iletişim kutusu doğru şekilde yeniden boyutlandırılmalıdır , böylece kullanıcı Çerçevenizi yeniden boyutlandırırsa, tablonuz gibi bilgi nesnelerinizi otomatik olarak genişletmek ve JPanel arka planının geniş alanlarını göstermek istemezsiniz. Bu bir NullLayout ile başaramayacağınız bir şey.

Ama muhtemelen NullLayout'un sadece bir şey olduğu bu büyük dünyanın herhangi bir yerinde vakalar vardır. İşte size bir örnek:

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

Bir bileşen "null" düzene sahip olduğunda, düzeni kendiniz yönetmeniz gerekir; bu, nerede çizildiklerine karar vermek için bileşenin alt öğelerinin boyutlarını ve konumlarını hesaplamanız gerektiği anlamına gelir. Kesinlikle gerekli olmadıkça oldukça sıkıcı.

Eğer gerçekten hassas bir kontrol istiyorsanız, belki UI düzenlemesi ile çamurlamaya başlamadan önce GridBagLayout'u deneyin.


0

Aşağıdaki kodu kullanabilirsiniz. JTable'ı JPanel'e eklemek için.

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

Bu yardımcı olur umarım.


hayır ... arka arkaya üç satırda üç hata ve (olduğu gibi kötü) gereksinimi
çözmüyor

panel yerine çerçeve kullanın ve deneyin.
Leo

hatalarını bulmaya bile çalışmadın, değil mi? Bazen (şimdi olduğu gibi) Kod / cevapta hatalar olduğu kadar çok downvotes istiyorum ..
Kleopatra

hangi üç satır? satır verileri ve sütun verileri eklemeniz gerekir.
Leo

4, 5, 6 (ve son)
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);

masa modeli sizin ihtiyacına bağlıdır


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

Bunu dene.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.