我有以下可调整大小的表单,其中包含一个主 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);
}
}
错误:
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();
...
}
屏幕截图:
关于java - 无法将现有的 GUI 放入可调整大小的 JFrame 中的 JPanel 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23642276/