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


235

내가 추가 할 JTableJPanel누구의 레이아웃입니다 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

JTableJScrollPane실제로 추가해야하는에 추가해야합니다 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.