如何将带有 2DGraphics 的 JPanel 放在 JFrame 上(相同 class)
How to put a JPanel with 2DGraphics on a JFrame (same class)
我有一个扩展 JFrame 的 class,我想向该 JFrame 添加两个 JPanel:一个文本面板和一个图形面板。我的文本面板是一个包含带文本标签的面板。我的图形面板将包含一个图形(使用 2DGraphics 创建)。我使用 gridbaglayout 方法将图形面板添加到左侧 (0,0),将文本面板添加到右侧 (1,0)。但是,图形面板不会出现在框架中。我尝试了很多方法试图让面板出现,但没有成功。
import java.awt.*;
import javax.swing.*;
public class GraphicsTest extends JFrame {
private final JPanel textPanel;
private final JLabel textLabel;
public GraphicsTest() {
textPanel = new JPanel(new BorderLayout());
textLabel = new JLabel("Home label");
this.setBounds(180, 112, 1080, 675);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(new GridBagLayout());
textPanel.add(textLabel, BorderLayout.NORTH);
addComponent(this, new GraphicPanel(), 0, 0, 1, 1, GridBagConstraints.CENTER);
addComponent(this, textPanel, 1, 0, 1, 1, GridBagConstraints.CENTER);
this.setVisible(true);
}
public class GraphicPanel extends JPanel {
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
public void paintComponents(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
// drawing lots of shapes and lines, removed for readibility
}
}
public void addComponent(JFrame frame, JComponent component, int x, int y, int width, int height, int align) {
GridBagConstraints c = new GridBagConstraints();
c.gridx = x;
c.gridy = y;
c.gridwidth = width;
c.gridheight = height;
c.weightx = 100.0;
c.weighty = 100.0;
c.insets = new Insets(5, 0, 5, 0);
c.anchor = align;
c.fill = GridBagConstraints.NONE;
frame.add(component, c);
}
public static void main(String[] args) {
GraphicsTest gui = new GraphicsTest();
}
}
当我使用像 (200, 200) 这样的尺寸时,对我来说效果很好。
GridbagLayout 的工作原理是,如果某个组件无法以其首选尺寸显示,那么它将以其最小尺寸显示,即 (0, 0)。
所以 (700, 700) 是否有效取决于您的屏幕分辨率。它也适用于我的屏幕 (700, 600)。
我问你要不要用GridBadLayout。也许只使用 BorderLayout。自定义绘画面板将位于中心,因此随着框架大小的变化,它将 grow/shrink。另一个面板将转到 LINE_END,因此它将保持固定大小。
我有一个扩展 JFrame 的 class,我想向该 JFrame 添加两个 JPanel:一个文本面板和一个图形面板。我的文本面板是一个包含带文本标签的面板。我的图形面板将包含一个图形(使用 2DGraphics 创建)。我使用 gridbaglayout 方法将图形面板添加到左侧 (0,0),将文本面板添加到右侧 (1,0)。但是,图形面板不会出现在框架中。我尝试了很多方法试图让面板出现,但没有成功。
import java.awt.*;
import javax.swing.*;
public class GraphicsTest extends JFrame {
private final JPanel textPanel;
private final JLabel textLabel;
public GraphicsTest() {
textPanel = new JPanel(new BorderLayout());
textLabel = new JLabel("Home label");
this.setBounds(180, 112, 1080, 675);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(new GridBagLayout());
textPanel.add(textLabel, BorderLayout.NORTH);
addComponent(this, new GraphicPanel(), 0, 0, 1, 1, GridBagConstraints.CENTER);
addComponent(this, textPanel, 1, 0, 1, 1, GridBagConstraints.CENTER);
this.setVisible(true);
}
public class GraphicPanel extends JPanel {
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
public void paintComponents(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
// drawing lots of shapes and lines, removed for readibility
}
}
public void addComponent(JFrame frame, JComponent component, int x, int y, int width, int height, int align) {
GridBagConstraints c = new GridBagConstraints();
c.gridx = x;
c.gridy = y;
c.gridwidth = width;
c.gridheight = height;
c.weightx = 100.0;
c.weighty = 100.0;
c.insets = new Insets(5, 0, 5, 0);
c.anchor = align;
c.fill = GridBagConstraints.NONE;
frame.add(component, c);
}
public static void main(String[] args) {
GraphicsTest gui = new GraphicsTest();
}
}
当我使用像 (200, 200) 这样的尺寸时,对我来说效果很好。
GridbagLayout 的工作原理是,如果某个组件无法以其首选尺寸显示,那么它将以其最小尺寸显示,即 (0, 0)。
所以 (700, 700) 是否有效取决于您的屏幕分辨率。它也适用于我的屏幕 (700, 600)。
我问你要不要用GridBadLayout。也许只使用 BorderLayout。自定义绘画面板将位于中心,因此随着框架大小的变化,它将 grow/shrink。另一个面板将转到 LINE_END,因此它将保持固定大小。