Domanda

I have the following resizable form that consists of one main JPanel with 4 other JPanels that go inside. They will resize as the JFrame is resized.

I decided to see if I could put another class that creates a GUI into the top frame that is depicted in the image below.

I think that it might be that I am trying to put a JFrame into a JPanel that is already in JFrame.

Question: I want to put another GUI class (that makes a JTable) into a JPanel in another class?

Code:

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

Simple JTable example: (found on internet)

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

Error:

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
È stato utile?

Soluzione

You have created a cyclic dependencies of the object SimpleTableDemo as shown below that results into StackOverflowError

Constructor -> Method -> Constructor -> Method -> ...

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

    ...
    createAndShowGUI();
}

private static void createAndShowGUI() {
    ...

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

Do in this way

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

Screenshot:

enter image description here

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top