无法使用现有的GUI进入可调整大小的JFrame中的JPanel?

时间:2014-05-13 21:56:12

标签: java swing jframe jpanel

我有以下可调整大小的表单,其中包含一个主JPanel和其他4个JPanel。他们会在JFrame调整大小时调整大小。

我决定看看是否可以将另一个创建GUI的类放入下图所示的顶部框架中。

我认为可能是因为我试图将JFrame放入已JPanel中的JFrame

问题:我想将另一个GUI类(将JTable)放入另一个类的JPanel中?

代码:

package testpak;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.net.MalformedURLException;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class ResizeTestGUI {
  private JPanel jpPack;
  private JPanel jpCards;
  private JPanel jpInfo;
  private JPanel jpChat;
  private SimpleTableDemo std = new SimpleTableDemo();

  public ResizeTestGUI() throws MalformedURLException {
    final JFrame frame = new JFrame("Draft");
    frame.setPreferredSize(new Dimension(400, 400));
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel IsMainJPanel = new JPanel();
    IsMainJPanel.setLayout(new GridBagLayout());

    jpCards = new JPanel(new BorderLayout());
    jpCards.setBackground(Color.BLUE);

    jpInfo = new JPanel();
    jpInfo.setBackground(Color.GREEN);

    jpPack = new JPanel(new GridBagLayout());
    jpPack.setBackground(Color.RED);

    jpChat = new JPanel();
    jpChat.setBackground(Color.BLACK);

    GridBagConstraints c = new GridBagConstraints();

    c.anchor = GridBagConstraints.FIRST_LINE_START;
    c.fill = GridBagConstraints.BOTH; // set it to fill both vertically and
                                      // horizontally
    c.gridx = 0;
    c.gridy = 0;
    c.weightx = 0.3;
    c.weighty = 0.3;
    jpCards.add(std);
    IsMainJPanel.add(jpCards, c);

    c.gridx = 1;
    c.gridy = 0;
    c.weightx = 0.3;
    c.weighty = 0.3;
    IsMainJPanel.add(jpInfo, c);

    c.gridx = 0;
    c.gridy = 1;
    c.weightx = 0.3;
    c.weighty = 0.3;
    IsMainJPanel.add(jpPack, c);

    c.gridx = 1;
    c.gridy = 1;
    c.weightx = 0.3;
    c.weighty = 0.3;
    IsMainJPanel.add(jpChat, c);

    frame.setContentPane(IsMainJPanel);
    frame.setLocationByPlatform(true);
    frame.pack();

    frame.setExtendedState(frame.getExtendedState() | JFrame.MAXIMIZED_BOTH);
    frame.setVisible(true);
  }

  public static void main(String[] args) throws MalformedURLException {
    ResizeTestGUI dg = new ResizeTestGUI();
  }
}

简单的JTable示例:(在互联网上找到)

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class SimpleTableDemo extends JPanel {
  private static final long serialVersionUID = 1L;
  private boolean DEBUG = false;

  public SimpleTableDemo() {
    super(new GridLayout(1, 0));

    String[] columnNames = { "First Name", "Last Name", "Sport", "# of Years",
        "Vegetarian" };

    Object[][] data = {
        { "Kathy", "Smith", "Snowboarding", new Integer(5), new Boolean(false) },
        { "John", "Doe", "Rowing", new Integer(3), new Boolean(true) },
        { "Sue", "Black", "Knitting", new Integer(2), new Boolean(false) },
        { "Jane", "White", "Speed reading", new Integer(20), new Boolean(true) },
        { "Joe", "Brown", "Pool", new Integer(10), new Boolean(false) } };

    final JTable table = new JTable(data, columnNames);
    table.setPreferredScrollableViewportSize(new Dimension(500, 70));
    table.setFillsViewportHeight(true);

    if (DEBUG) {
      table.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent e) {
          printDebugData(table);
        }
      });
    }

    // Create the scroll pane and add the table to it.
    JScrollPane scrollPane = new JScrollPane(table);

    // Add the scroll pane to this panel.
    add(scrollPane);
    createAndShowGUI();
  }

  private void printDebugData(JTable table) {
    int numRows = table.getRowCount();
    int numCols = table.getColumnCount();
    javax.swing.table.TableModel model = table.getModel();

    System.out.println("Value of data: ");
    for (int i = 0; i < numRows; i++) {
      System.out.print("    row " + i + ":");
      for (int j = 0; j < numCols; j++) {
        System.out.print("  " + model.getValueAt(i, j));
      }
      System.out.println();
    }
    System.out.println("--------------------------");
  }

  /**
   * Create the GUI and show it. For thread safety, this method should be
   * invoked from the event-dispatching thread.
   */
  private static void createAndShowGUI() {
    // Create and set up the window.
    JFrame frame = new JFrame("SimpleTableDemo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    // Create and set up the content pane.
    SimpleTableDemo newContentPane = new SimpleTableDemo();
    newContentPane.setOpaque(true); // content panes must be opaque
    frame.setContentPane(newContentPane);

    // Display the window.
    frame.pack();
    frame.setVisible(true);
  }
}

enter image description here

错误:

Exception in thread "main" java.lang.StackOverflowError
    at java.lang.Exception.<init>(Exception.java:102)
    at java.lang.ReflectiveOperationException.<init>(ReflectiveOperationException.java:89)
    at java.lang.reflect.InvocationTargetException.<init>(InvocationTargetException.java:72)
    at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:75)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Sourc

1 个答案:

答案 0 :(得分:3)

您已创建对象SimpleTableDemo循环依赖关系,如下所示,结果为StackOverflowError

构造函数 - &gt;方法 - &gt;构造函数 - &gt;方法 - &gt; ...

public SimpleTableDemo() {
    super(new GridLayout(1, 0));

    ...
    createAndShowGUI();
}

private static void createAndShowGUI() {
    ...

    //Create and set up the content pane.
    SimpleTableDemo newContentPane = new SimpleTableDemo();
    ...
}

以这种方式行事

public SimpleTableDemo() {
    super(new GridLayout(1, 0));

    ...
    // pass the reference of this object
    createAndShowGUI(this);
}

private static void createAndShowGUI(SimpleTableDemo newContentPane ) {
    ...

    //remove this line
    //SimpleTableDemo newContentPane = new SimpleTableDemo();
    ...
}

截图:

enter image description here