gpt4 book ai didi

java - 无法将现有的 GUI 放入可调整大小的 JFrame 中的 JPanel 中?

转载 作者:行者123 更新时间:2023-12-01 22:58:54 24 4
gpt4 key购买 nike

我有以下可调整大小的表单,其中包含一个主 JPanel 以及内部的 4 个其他 JPanel。它们将随着 JFrame 大小的调整而调整。

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

我认为我可能正在尝试将 JFrame 放入已位于 JFrame 中的 JPanel 中。

问题:我想将另一个 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

最佳答案

您已经创建了对象 SimpleTableDemo循环依赖,如下所示,这会导致 StackOverflowError

构造函数 -> 方法 -> 构造函数 -> 方法 -> ...

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

关于java - 无法将现有的 GUI 放入可调整大小的 JFrame 中的 JPanel 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23642276/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com