java - java JPanel充满整个 JFrame

  显示原文与译文双语对照的内容
88 3

我想将一个具有 300,200个位置的kdb放置在,位置,但下面的代码使整个vmkernel都填充在,中。代码:

public class Class1 {
 public static void main(String[] args) {
 JFrame frame = new JFrame();
 JPanel panel = new JPanel();
 frame.setSize(700, 500); 
 panel.setSize(300, 200);
 panel.setBackground(Color.green);
 panel.setCursor(new Cursor(java.awt.Cursor.HAND_CURSOR));
 frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
 frame.add(panel, BorderLayout.CENTER); 
 frame.setVisible(true);
 frame.setLocationRelativeTo(null);
 }
}

如果我更改了 BorderLayout.SOUTH 或者北方,那么rtc看起来像是一个小直线,它的底部或者顶部是一条细线。我还尝试使用首选大小,但它仍然是相同的结果。

时间:原作者:0个回答

131 5

你需要了解布局管理器的基本知识,然后才能尝试使用 Swing 。

在这里学习教程 https://docs.oracle.com/javase/tutorial/uiswing/layout/howLayoutWorks.html 。

如果试图构造具有各种Swing控件的窗体,则从不使用绝对坐标来定位它们。根据需要使用布局的类型,调整窗口大小应该动态地重新定位控件。如果你正在使用面板作为绘图画布( 这就是我认为你在),请查看下面的示例。

尝试先掌握一些基本布局,比如BorderLayout和 GridLayout 。一旦掌握,你可以以用很少的方法来实现你想要的任何一种布局。同时了解滚动面板的基本知识,以有效地利用屏幕空间

关于你最初的问题,我创建了BorderLayout如何工作以及如何在面板上绘制特定区域的示例。我还添加了一些代码,以便你可以以根据给定面板中的小区域设置 cursor 不同。

尝试这个:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
public class FrameDemo extends JFrame {
 private static final long serialVersionUID = 1L;
 public FrameDemo() {
 super("Frame Demo");
 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
 getContentPane().add(new CustomPanel(Color.RED), BorderLayout.NORTH);
 getContentPane().add(new CustomPanel(Color.GREEN), BorderLayout.SOUTH);
 getContentPane().add(new CustomPanel(Color.BLUE), BorderLayout.EAST);
 getContentPane().add(new CustomPanel(Color.YELLOW), BorderLayout.WEST);
 getContentPane().add(new JScrollPane(new CustomPanel(Color.BLACK)), BorderLayout.CENTER);
 pack();
 }
 public static void main(String[] args) {
 SwingUtilities.invokeLater(new Runnable() {
 public void run() {
 JFrame frame = new FrameDemo();
 frame.setVisible(true);
 }
 });
 }
}
class CustomPanel extends JPanel implements MouseMotionListener {
 private static final long serialVersionUID = 1L;
 private static final Dimension PANEL_SIZE = new Dimension(200, 100);
 private static final int HAND_CURSOR_INDEX = 1;
 private static final int DEFAULT_CURSOR_INDEX = 0;
 private static final Cursor[] _cursors = new Cursor[] {
 Cursor.getDefaultCursor(),
 Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)
 };
//I want to place a JPanel with 300,200 size at 100,50 location in a JFrame
 private static final Rectangle _rectangle = new Rectangle(50, 10, 40, 50);
 public CustomPanel(Color color) {
 setBackground(color);
 addMouseMotionListener(this);
 }
 public Dimension getPreferredSize() {
 return PANEL_SIZE;
 }
 public Dimension getMinimumSize() {
 return PANEL_SIZE;
 }
 public Dimension getMaximumSize() {
 return PANEL_SIZE;
 }
 protected void paintComponent(Graphics g) {
 super.paintComponent(g);
 g.setColor(Color.WHITE);
 g.fillRect(
 (int)_rectangle.getX(),
 (int)_rectangle.getY(),
 (int)_rectangle.getWidth(),
 (int)_rectangle.getHeight());
 }
 @Override
 public void mouseDragged(MouseEvent e) {
//TODO Auto-generated method stub
 }
 @Override
 public void mouseMoved(MouseEvent e) {
 int cursorIndex = _rectangle.contains(e.getPoint())?
 HAND_CURSOR_INDEX :
 DEFAULT_CURSOR_INDEX;
 setCursor(_cursors[cursorIndex]);
 }
}

enter image description here

原作者:
...