null 레이아웃으로 JPanel에 JTable을 추가하는 방법은 무엇입니까?


235

내가 추가 할 JTable에 JPanel누구의 레이아웃입니다 null. JPanel다른 구성 요소를 포함합니다. JTable적절한 위치 에 추가해야합니다 .


17
jzd의 대답을 강조하기 위해 : null 레이아웃을 잊어 버려라. 그건 확실히되지 않은 swing'ish - LayoutManagers를 사용하여 배우거나 다른 언어를 사용 하나.
— kleopatra

답변:


178

중첩 / 조합 레이아웃 예

Java Tutorial에는 레이아웃 관리자 사용에 대한 포괄적 인 정보가 있습니다. 자세한 내용은 컨테이너 내에 구성 요소 배치 단원을 참조하십시오.

튜토리얼에서 다루지 않은 레이아웃의 한 가지 측면은 중첩 된 레이아웃으로, 한 레이아웃을 다른 레이아웃 안에 넣어 복잡한 효과를 얻는 것입니다.

다음 코드는 중첩 된 레이아웃을 사용하는 방법을 보여주기 위해 다양한 구성 요소를 프레임에 넣습니다. 명시 적으로 설정된 모든 레이아웃은 사용되는 패널의 제목 테두리로 표시됩니다.

코드의 주목할만한 측면은 다음과 같습니다.

  • 런타임에 PLAF (Pluggable Look and Feel)를 변경하는 콤보 상자가 있습니다.
  • 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);
    }
}

다른 스크린 샷

윈도우 PLAF

맥 OS X 아쿠아 PLAF

우분투 GTK + PLAF


49

null 레이아웃을 사용하지 마십시오. LayoutManager 사용 방법을 배웁니다.

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

LayoutManager를 사용하면 사물 크기 조정 또는 동적 구성 요소 수를 올바르게 처리 할 수 ​​있습니다. 처음에는 위협적인 것처럼 보일지 모르지만 배우려고 노력할 가치가 있습니다.


20

내가 기억할 수 있듯이 null 레이아웃은 절대 위치를 의미하므로 JTable 왼쪽 상단 위치의 X 포인트를 계산하기가 매우 어렵습니다. 그러나 모든 패널 구성 요소를 하나씩 원한다면 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

널 레이아웃 관리자를 사용하는 경우 항상 컴포넌트의 경계를 설정해야합니다. 그것이 귀하의 경우 문제입니다.

모든 사람들이 여기에서 제안하는 것을하고 가서 레이아웃 관리자가 시간을 절약한다고 믿는 것을 사용해야합니다. @jzd의 포스트에서 튜토리얼을 확인하십시오.

보로


12

JTable에 JScrollPane실제로 추가해야하는에 추가해야합니다 JPanel.

는 JPanel일부 레이아웃 매니저를 가져야한다.

당신이 구성 요소의 정밀 걱정하지 않으면 순수 사용할 수의 크기 BorderLayout와와 결합 FlowLayout하고 GridLayout. 정밀도가 필요한 경우 jgoodies를 사용하십시오 FormLayout.

이 방법 FormLayout은 매우 까다 롭지 만 WindowBuilder(Eclipse에 내장되어 있음) 약간 생성하고 코드를 생성 할 수 있습니다. 복잡해 보이지만 무지 일뿐입니다.

행운을 빕니다.


6

먼저 다른 레이아웃 관리자를 신중하게 고려해야합니다. 예를 들어 BorderLayoutManager (new JPanel (new BorderLayout ()))는 좋은 시작입니다.

또한 대화 상자를 디자인 할 때 레이아웃을 중첩 할 수 있고 중첩 해야한다는 것을 기억 하십시오 : 하나의 JPanel을 다른 JPanel 안에 (예 : BorderLayout 안의 GridLayout). 참고 : '좋은'대화 상자의 크기가 올바르게 조정 되어 사용자가 프레임의 크기를 조정할 경우 테이블과 같은 정보 객체를 자동으로 확장하고 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

구성 요소에 "널"레이아웃이있는 경우 레이아웃을 직접 관리해야합니다. 즉, 구성 요소의 하위 요소가 그려지는 위치를 결정하기 위해 구성 요소의 위치와 치수를 계산해야합니다. 꼭 필요한 경우가 아니면 상당히 지루합니다.

세밀한 제어를 원한다면 UI 배열로 머딩하기 전에 GridBagLayout을 먼저 시도하십시오.


0

다음 코드를 사용할 수 있습니다. JPanel에 JTable을 추가합니다.

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

도움이 되었기를 바랍니다.


아니오 ... 3 개의 연속 된 줄에 3 개의 오류가 있고 (있는 그대로) 요구 사항을 해결하지 못함
— kleopatra

패널 대신 프레임을 사용하고 시도하십시오.
— Leo

당신은 당신의 오류를 찾으려고하지 않았습니까? 때로는 (지금처럼) 코드 / 응답에 오류가있는만큼 다운 보트를 많이 갖고 싶습니다 ..
— 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.